diff --git a/.bumpversion.cfg b/.bumpversion.cfg index f739784aff2a..97eeca39d9fe 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.40.23 +current_version = 0.40.24 commit = False tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-[a-z]+)? diff --git a/.env b/.env index 276407cd8798..fdc2059d7f36 100644 --- a/.env +++ b/.env @@ -10,7 +10,7 @@ ### SHARED ### -VERSION=0.40.23 +VERSION=0.40.24 # When using the airbyte-db via default docker image CONFIG_ROOT=/data diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a080e7e12bd6..4caa27f84491 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -972,244 +972,248 @@ jobs: label: ${{ needs.start-kube-acceptance-test-runner.outputs.label }} ec2-instance-id: ${{ needs.start-kube-acceptance-test-runner.outputs.ec2-instance-id }} - ## INFO: Disabled due to some of the tests being flaky. - ## TODO: Someone to fix flakines. - # # ## Kube Acceptance Tests - # # # Docker acceptance tests run as part of the build job. - # # # In case of self-hosted EC2 errors, remove this block. - # start-helm-acceptance-test-runner: - # name: "Platform: Start Helm Acceptance Test Runner" - # needs: - # - changes - # # Because scheduled builds on master require us to skip the changes job. Use always() to force this to run on master. - # if: needs.changes.outputs.backend == 'true' || needs.changes.outputs.build == 'true' || (always() && github.ref == 'refs/heads/master') - # timeout-minutes: 10 - # runs-on: ubuntu-latest - # outputs: - # label: ${{ steps.start-ec2-runner.outputs.label }} - # ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }} - # steps: - # - name: Checkout Airbyte - # uses: actions/checkout@v3 - # - name: Check PAT rate limits - # run: | - # ./tools/bin/find_non_rate_limited_PAT \ - # ${{ secrets.AIRBYTEIO_PAT }} \ - # ${{ secrets.OSS_BUILD_RUNNER_GITHUB_PAT }} \ - # ${{ secrets.SUPERTOPHER_PAT }} \ - # ${{ secrets.DAVINCHIA_PAT }} - # - name: Start AWS Runner - # id: start-ec2-runner - # uses: ./.github/actions/start-aws-runner - # with: - # # github-self-hosted-runner-ubuntu-20-with-150gdisk-docker-20.10.7-and-socat - # ec2-image-id: ami-0c1a9bc22624339d8 - # aws-access-key-id: ${{ secrets.SELF_RUNNER_AWS_ACCESS_KEY_ID }} - # aws-secret-access-key: ${{ secrets.SELF_RUNNER_AWS_SECRET_ACCESS_KEY }} - # github-token: ${{ env.PAT }} - - # helm-acceptance-test: - # name: "Platform: Acceptance Tests (Helm)" - # # In case of self-hosted EC2 errors, removed the `needs` line and switch back to running on ubuntu-latest. - # needs: [start-helm-acceptance-test-runner] # required to start the main job when the runner is ready - # runs-on: ${{ needs.start-helm-acceptance-test-runner.outputs.label }} # run the job on the newly created runner - # # this is the label of the runner - # environment: more-secrets - # timeout-minutes: 90 - # defaults: - # run: - # working-directory: "/actions-runner/_work/airbyte/airbyte" - # env: - # HOME: /actions-runner/_work/airbyte/airbyte - # GITHUB_WORKSPACE: /actions-runner/_work/airbyte/airbyte - - # steps: - # - name: Fix EC-2 Runner - # run: | - # mkdir -p /actions-runner/_work/airbyte/airbyte && mkdir -p /actions-runner/_work/airbyte/airbyte/.kube + # ## Kube Acceptance Tests + # # Docker acceptance tests run as part of the build job. + # # In case of self-hosted EC2 errors, remove this block. + start-helm-acceptance-test-runner: + name: "Platform: Start Helm Acceptance Test Runner" + needs: + - changes + # Because scheduled builds on master require us to skip the changes job. Use always() to force this to run on master. + if: needs.changes.outputs.backend == 'true' || needs.changes.outputs.build == 'true' || (always() && github.ref == 'refs/heads/master') + timeout-minutes: 10 + runs-on: ubuntu-latest + outputs: + label: ${{ steps.start-ec2-runner.outputs.label }} + ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }} + steps: + - name: Checkout Airbyte + uses: actions/checkout@v3 + - name: Check PAT rate limits + run: | + ./tools/bin/find_non_rate_limited_PAT \ + ${{ secrets.AIRBYTEIO_PAT }} \ + ${{ secrets.OSS_BUILD_RUNNER_GITHUB_PAT }} \ + ${{ secrets.SUPERTOPHER_PAT }} \ + ${{ secrets.DAVINCHIA_PAT }} + - name: Start AWS Runner + id: start-ec2-runner + uses: ./.github/actions/start-aws-runner + with: + # github-self-hosted-runner-ubuntu-20-with-150gdisk-docker-20.10.7-and-socat + # ec2-image-id: ami-0c1a9bc22624339d8 + aws-access-key-id: ${{ secrets.SELF_RUNNER_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.SELF_RUNNER_AWS_SECRET_ACCESS_KEY }} + github-token: ${{ env.PAT }} + + helm-acceptance-test: + name: "Platform: Acceptance Tests (Helm)" + # In case of self-hosted EC2 errors, removed the `needs` line and switch back to running on ubuntu-latest. + needs: [start-helm-acceptance-test-runner] # required to start the main job when the runner is ready + runs-on: ${{ needs.start-helm-acceptance-test-runner.outputs.label }} # run the job on the newly created runner + # this is the label of the runner + environment: more-secrets + timeout-minutes: 90 + defaults: + run: + working-directory: "/actions-runner/_work/airbyte/airbyte" + env: + HOME: /actions-runner/_work/airbyte/airbyte + GITHUB_WORKSPACE: /actions-runner/_work/airbyte/airbyte + + steps: + - name: Fix EC-2 Runner + run: | + mkdir -p /actions-runner/_work/airbyte/airbyte && mkdir -p /actions-runner/_work/airbyte/airbyte/.kube - # - name: Checkout Airbyte - # uses: actions/checkout@v2 - # with: - # fetch-depth: 0 - - # - name: Delete default old docker and replace it with a new one - # uses: Wandalen/wretry.action@master - # with: - # command: | - # sudo rm /var/lib/dpkg/lock - # sudo rm /var/lib/dpkg/lock-frontend - # sudo apt-get remove docker.io || sudo apt-get remove docker - # curl -fsSL https://get.docker.com | bash - - # sudo rm -f /var/lib/dpkg/lock - # sudo rm -f /var/lib/dpkg/lock-frontend - # attempt_limit: 3 - # attempt_delay: 2000 # in ms - - # - name: Cache Build Artifacts - # uses: ./.github/actions/cache-build-artifacts - # with: - # cache-key: ${{ secrets.CACHE_VERSION }} - # cache-python: "false" - - # - uses: actions/setup-python@v4 - # with: - # python-version: '3.9' - - # - uses: actions/setup-java@v1 - # with: - # java-version: "17" - - # - uses: actions/setup-node@v2 - # with: - # node-version: "lts/gallium" - - # - name: Install unzip - # shell: bash - # run: sudo apt-get update && sudo apt-get install -y unzip - - # - uses: azure/setup-helm@v3 - # with: - # version: 'latest' - # token: ${{ secrets.GITHUB_TOKEN }} - # id: install - - # - uses: azure/setup-kubectl@v3 - # with: - # version: 'v1.21.2' # default is latest stable - - # - name: Install tmate and it's dependencies - # if: inputs.debug_mode == 'true' - # uses: Wandalen/wretry.action@master - # with: - # command: | - # sudo rm /var/lib/dpkg/lock - # sudo rm /var/lib/dpkg/lock-frontend - # sudo apt-get -y install tmate - # sudo rm -f /var/lib/dpkg/lock - # sudo rm -f /var/lib/dpkg/lock-frontend - # attempt_limit: 3 - # attempt_delay: 2000 # in ms + - name: Checkout Airbyte + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Delete default old docker and replace it with a new one + uses: Wandalen/wretry.action@master + with: + command: | + sudo rm /var/lib/dpkg/lock + sudo rm /var/lib/dpkg/lock-frontend + sudo apt-get remove docker.io || sudo apt-get remove docker + curl -fsSL https://get.docker.com | bash - + sudo rm -f /var/lib/dpkg/lock + sudo rm -f /var/lib/dpkg/lock-frontend + attempt_limit: 3 + attempt_delay: 2000 # in ms + + - name: Cache Build Artifacts + uses: ./.github/actions/cache-build-artifacts + with: + cache-key: ${{ secrets.CACHE_VERSION }} + cache-python: "false" + + - uses: actions/setup-python@v4 + with: + python-version: '3.9' + + - uses: actions/setup-java@v1 + with: + java-version: "17" + + - uses: actions/setup-node@v2 + with: + node-version: "lts/gallium" + + - name: Install unzip + shell: bash + run: sudo apt-get update && sudo apt-get install -y unzip + + - uses: azure/setup-helm@v3 + with: + version: 'latest' + token: ${{ secrets.GITHUB_TOKEN }} + id: install + + - uses: azure/setup-kubectl@v3 + with: + version: 'v1.21.2' # default is latest stable + + - name: Install tmate and it's dependencies + if: inputs.debug_mode == 'true' + uses: Wandalen/wretry.action@master + with: + command: | + sudo rm /var/lib/dpkg/lock + sudo rm /var/lib/dpkg/lock-frontend + sudo apt-get -y install tmate + sudo rm -f /var/lib/dpkg/lock + sudo rm -f /var/lib/dpkg/lock-frontend + attempt_limit: 3 + attempt_delay: 2000 # in ms - # - name: Start tmate session in background - # if: inputs.debug_mode == 'true' - # shell: bash - # run: | - # tmate -S /tmp/tmate.sock new-session -d # Launch tmate in a headless mode - # tmate -S /tmp/tmate.sock wait tmate-ready # Blocks until the SSH connection is established - # tmate -S /tmp/tmate.sock display -p '#{tmate_ssh}' # Prints the SSH connection string - # tmate -S /tmp/tmate.sock display -p '#{tmate_ssh_ro}' # Prints the read-only SSH connection string - # tmate -S /tmp/tmate.sock display -p '#{tmate_web}' # Prints the web connection string - # tmate -S /tmp/tmate.sock display -p '#{tmate_web_ro}' # Prints the read-only web connection string - - # - name: Start a local k8s cluster - # uses: jupyterhub/action-k3s-helm@v3 - # with: - # k3s-version: v1.21.2+k3s1 - # helm-version: v3.9.4 - # extra-setup-args: --docker --kube-apiserver-arg service-node-port-range=6000-32767 - - # - name: Try the cluster ! - # uses: Wandalen/wretry.action@master - # with: - # command: kubectl get pods -A - # attempt_limit: 3 - # attempt_delay: 3000 # in ms - - # - name: Set up CI Gradle Properties - # run: | - # mkdir -p ~/.gradle/ - # cat > ~/.gradle/gradle.properties < ~/.gradle/gradle.properties < spec_cache_key_file.json && docker login -u ${DOCKER_HUB_USERNAME} -p ${DOCKER_HUB_PASSWORD} - ./tools/integrations/manage.sh publish airbyte-integrations/${{ matrix.connector }} ${{ github.event.inputs.run-tests }} --publish_spec_to_cache + ./tools/integrations/manage.sh publish airbyte-integrations/${{ matrix.connector }} ${{ github.event.inputs.run-tests }} --publish_spec_to_cache attempt_limit: 3 attempt_delay: 5000 in # ms + - name: Update Integration Test Credentials after test run for ${{ github.event.inputs.connector }} + if: always() + run: | + source venv/bin/activate + ci_credentials ${{ matrix.connector }} update-secrets + # normalization also runs destination-specific tests, so fetch their creds also + if [ 'bases/base-normalization' = "${{ matrix.connector }}" ] || [ 'base-normalization' = "${{ matrix.connector }}" ]; then + ci_credentials destination-bigquery update-secrets + ci_credentials destination-postgres update-secrets + ci_credentials destination-snowflake update-secrets + fi + env: + GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} - name: Create Sentry Release if: startsWith(matrix.connector, 'connectors') && success() run: | diff --git a/.github/workflows/test-command.yml b/.github/workflows/test-command.yml index de003310976b..23ad125b5e51 100644 --- a/.github/workflows/test-command.yml +++ b/.github/workflows/test-command.yml @@ -110,12 +110,12 @@ jobs: - name: Write Integration Test Credentials for ${{ github.event.inputs.connector }} run: | source venv/bin/activate - ci_credentials ${{ github.event.inputs.connector }} + ci_credentials ${{ github.event.inputs.connector }} write-to-storage # normalization also runs destination-specific tests, so fetch their creds also if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then - ci_credentials destination-bigquery - ci_credentials destination-postgres - ci_credentials destination-snowflake + ci_credentials destination-bigquery write-to-storage + ci_credentials destination-postgres write-to-storage + ci_credentials destination-snowflake write-to-storage fi env: GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} @@ -131,6 +131,19 @@ jobs: command: ./tools/bin/ci_integration_test.sh ${{ github.event.inputs.connector }} attempt_limit: 3 attempt_delay: 10000 # in ms + - name: Update Integration Test Credentials after test run for ${{ github.event.inputs.connector }} + if: always() + run: | + source venv/bin/activate + ci_credentials ${{ github.event.inputs.connector }} update-secrets + # normalization also runs destination-specific tests, so fetch their creds also + if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then + ci_credentials destination-bigquery update-secrets + ci_credentials destination-postgres update-secrets + ci_credentials destination-snowflake update-secrets + fi + env: + GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} - name: Archive test reports artifacts if: github.event.inputs.comment-id && failure() uses: actions/upload-artifact@v3 diff --git a/.github/workflows/test-performance-command.yml b/.github/workflows/test-performance-command.yml index 11e51f2b2d10..80c833549c2a 100644 --- a/.github/workflows/test-performance-command.yml +++ b/.github/workflows/test-performance-command.yml @@ -107,12 +107,12 @@ jobs: - name: Write Integration Test Credentials for ${{ github.event.inputs.connector }} run: | source venv/bin/activate - ci_credentials ${{ github.event.inputs.connector }} + ci_credentials ${{ github.event.inputs.connector }} write-to-storage # normalization also runs destination-specific tests, so fetch their creds also if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then - ci_credentials destination-bigquery - ci_credentials destination-postgres - ci_credentials destination-snowflake + ci_credentials destination-bigquery write-to-storage + ci_credentials destination-postgres write-to-storage + ci_credentials destination-snowflake write-to-storage fi env: GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} @@ -124,6 +124,19 @@ jobs: ACTION_RUN_ID: ${{github.run_id}} # Oracle expects this variable to be set. Although usually present, this is not set by default on Github virtual runners. TZ: UTC + - name: Update Integration Test Credentials after test run for ${{ github.event.inputs.connector }} + if: always() + run: | + source venv/bin/activate + ci_credentials ${{ github.event.inputs.connector }} update-secrets + # normalization also runs destination-specific tests, so fetch their creds also + if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then + ci_credentials destination-bigquery update-secrets + ci_credentials destination-postgres update-secrets + ci_credentials destination-snowflake update-secrets + fi + env: + GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} - name: Archive test reports artifacts if: github.event.inputs.comment-id && failure() uses: actions/upload-artifact@v3 diff --git a/.gitignore b/.gitignore index 1876fcbfcf48..a6e0049c2f68 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ acceptance_tests_logs/ # Secrets secrets +updated_configurations !airbyte-integrations/connector-templates/**/secrets # Test logs diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3487659101c8..f82f2b5ba91f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,7 +38,7 @@ repos: ).?$ - repo: https://github.com/csachs/pyproject-flake8 - rev: v0.0.1a2.post1 + rev: v6.0.0 hooks: - id: pyproject-flake8 args: ["--config", "pyproject.toml"] diff --git a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java index 7a2efa51b722..ce1fd820d9e5 100644 --- a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java +++ b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java @@ -7,7 +7,6 @@ import com.google.common.annotations.VisibleForTesting; import io.airbyte.api.client.generated.AttemptApi; import io.airbyte.api.client.generated.ConnectionApi; -import io.airbyte.api.client.generated.DbMigrationApi; import io.airbyte.api.client.generated.DestinationApi; import io.airbyte.api.client.generated.DestinationDefinitionApi; import io.airbyte.api.client.generated.DestinationDefinitionSpecificationApi; @@ -58,7 +57,6 @@ public class AirbyteApiClient { private final SourceDefinitionSpecificationApi sourceDefinitionSpecificationApi; private final WorkspaceApi workspaceApi; private final HealthApi healthApi; - private final DbMigrationApi dbMigrationApi; private final AttemptApi attemptApi; private final StateApi stateApi; @@ -75,7 +73,6 @@ public AirbyteApiClient(final ApiClient apiClient) { sourceDefinitionSpecificationApi = new SourceDefinitionSpecificationApi(apiClient); workspaceApi = new WorkspaceApi(apiClient); healthApi = new HealthApi(apiClient); - dbMigrationApi = new DbMigrationApi(apiClient); attemptApi = new AttemptApi(apiClient); stateApi = new StateApi(apiClient); } @@ -128,10 +125,6 @@ public HealthApi getHealthApi() { return healthApi; } - public DbMigrationApi getDbMigrationApi() { - return dbMigrationApi; - } - public AttemptApi getAttemptApi() { return attemptApi; } diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 791de5335465..0a21a87e782e 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -12,13 +12,8 @@ info: * The naming convention for endpoints is: localhost:8000/{VERSION}/{METHOD_FAMILY}/{METHOD_NAME} e.g. `localhost:8000/v1/connections/create`. * For all `update` methods, the whole object must be passed in, even the fields that did not change. - Change Management: - * The major version of the API endpoint can be determined / specified in the URL `localhost:8080/v1/connections/create` - * Minor version bumps will be invisible to the end user. The user cannot specify minor versions in requests. - * All backwards incompatible changes will happen in major version bumps. We will not make backwards incompatible changes in minor version bumps. Examples of non-breaking changes (includes but not limited to...): - * Adding fields to request or response bodies. - * Adding new HTTP endpoints. - * All `web_backend` APIs are not considered public APIs and are not guaranteeing backwards compatibility. + Authentication (OSS): + * When authenticating to the Configuration API, you must use Basic Authentication by setting the Authentication Header to Basic and base64 encoding the username and password (which are `airbyte` and `password` by default - so base64 encoding `airbyte:password` results in `YWlyYnl0ZTpwYXNzd29yZA==`). So the full header reads `'Authorization': "Basic YWlyYnl0ZTpwYXNzd29yZA=="` version: "1.0.0" title: Airbyte Configuration API @@ -53,8 +48,6 @@ tags: description: Source OAuth related resources to delegate access from user. - name: source_oauth description: Source OAuth related resources to delegate access from user. - - name: db_migration - description: Database migration related resources. - name: web_backend description: | Endpoints for the Airbyte web application. Those APIs should not be called outside the web application implementation and are not @@ -277,26 +270,7 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/source_definitions/create: - post: - tags: - - source_definition - summary: Creates a sourceDefinition - operationId: createSourceDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SourceDefinitionCreate" - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/SourceDefinitionRead" - "422": - $ref: "#/components/responses/InvalidInputResponse" + /v1/source_definitions/update: post: tags: @@ -469,47 +443,6 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/source_definitions/update_custom: - post: - tags: - - source_definition - summary: Update a custom sourceDefinition for the given workspace - operationId: updateCustomSourceDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CustomSourceDefinitionUpdate" - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/SourceDefinitionRead" - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" - /v1/source_definitions/delete_custom: - post: - tags: - - source_definition - summary: Delete a custom source definition for the given workspace - operationId: deleteCustomSourceDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SourceDefinitionIdWithWorkspaceId" - required: true - responses: - "204": - description: The resource was deleted successfully. - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" /v1/source_definitions/grant_definition: post: tags: @@ -798,26 +731,6 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/destination_definitions/create: - post: - tags: - - destination_definition - summary: Creates a destinationsDefinition - operationId: createDestinationDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DestinationDefinitionCreate" - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/DestinationDefinitionRead" - "422": - $ref: "#/components/responses/InvalidInputResponse" /v1/destination_definitions/update: post: tags: @@ -991,47 +904,6 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/destination_definitions/update_custom: - post: - tags: - - destination_definition - summary: Update a custom destinationDefinition for the given workspace - operationId: updateCustomDestinationDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CustomDestinationDefinitionUpdate" - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/DestinationDefinitionRead" - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" - /v1/destination_definitions/delete_custom: - post: - tags: - - destination_definition - summary: Delete a custom destination definition for the given workspace - operationId: deleteCustomDestinationDefinition - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DestinationDefinitionIdWithWorkspaceId" - required: true - responses: - "204": - description: The destination was deleted successfully. - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" /v1/destination_definitions/grant_definition: post: tags: @@ -1738,52 +1610,6 @@ paths: $ref: "#/components/schemas/CheckConnectionRead" "422": $ref: "#/components/responses/InvalidInputResponse" - /v1/db_migrations/list: - post: - tags: - - db_migration - summary: List all database migrations - operationId: listMigrations - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DbMigrationRequestBody" - required: true - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/DbMigrationReadList" - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" - /v1/db_migrations/migrate: - post: - tags: - - db_migration - summary: Migrate the database to the latest version - operationId: executeMigrations - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DbMigrationRequestBody" - required: true - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: "#/components/schemas/DbMigrationExecutionRead" - "404": - $ref: "#/components/responses/NotFoundResponse" - "422": - $ref: "#/components/responses/InvalidInputResponse" /v1/source_oauths/oauth_params/create: post: tags: @@ -2680,16 +2506,6 @@ components: $ref: "#/components/schemas/WorkspaceId" sourceDefinition: $ref: "#/components/schemas/SourceDefinitionCreate" - CustomSourceDefinitionUpdate: - type: object - required: - - workspaceId - - sourceDefinition - properties: - workspaceId: - $ref: "#/components/schemas/WorkspaceId" - sourceDefinition: - $ref: "#/components/schemas/SourceDefinitionUpdate" SourceDefinitionIdWithWorkspaceId: type: object required: @@ -3050,16 +2866,6 @@ components: $ref: "#/components/schemas/WorkspaceId" destinationDefinition: $ref: "#/components/schemas/DestinationDefinitionCreate" - CustomDestinationDefinitionUpdate: - type: object - required: - - workspaceId - - destinationDefinition - properties: - workspaceId: - $ref: "#/components/schemas/WorkspaceId" - destinationDefinition: - $ref: "#/components/schemas/DestinationDefinitionUpdate" DestinationDefinitionIdWithWorkspaceId: type: object required: @@ -4179,6 +3985,7 @@ components: - normalization - dbt - airbyte_platform + - unknown AttemptFailureType: description: Categorizes well known errors into types for programmatic handling. If not set, the type of error is not well known. type: string diff --git a/airbyte-bootloader/Dockerfile b/airbyte-bootloader/Dockerfile index 9f73b5ebada1..f2c9fa2b1a21 100644 --- a/airbyte-bootloader/Dockerfile +++ b/airbyte-bootloader/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-bootloader ENV VERSION ${VERSION} diff --git a/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderAppTest.java b/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderAppTest.java index fbc113f69063..65566dd091a5 100644 --- a/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderAppTest.java +++ b/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderAppTest.java @@ -142,7 +142,7 @@ void testBootloaderAppBlankDb() throws Exception { val configsMigrator = new ConfigsDatabaseMigrator(configDatabase, configsFlyway); // this line should change with every new migration // to show that you meant to make a new migration to the prod database - assertEquals("0.40.18.004", configsMigrator.getLatestMigration().getVersion().getVersion()); + assertEquals("0.40.23.002", configsMigrator.getLatestMigration().getVersion().getVersion()); val jobsPersistence = new DefaultJobPersistence(jobDatabase); assertEquals(VERSION_0330_ALPHA, jobsPersistence.getVersion().get()); diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index f7a2b466e97c..f8824f945e71 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog -## 0.11.2 +## 0.12.4 +Lookback window should applied when a state is supplied as well + +## 0.12.3 +Low-code: Finally, make `OffsetIncrement.page_size` interpolated string or int + +## 0.12.2 +Revert breaking change on `read_config` while keeping the improvement on the error message + +## 0.12.0 +Improve error readability when reading JSON config files + +## 0.11.3 Low-code: Log response error message on failure ## 0.11.2 diff --git a/airbyte-cdk/python/README.md b/airbyte-cdk/python/README.md index 13a3e5b530d2..d318c7cb81f8 100644 --- a/airbyte-cdk/python/README.md +++ b/airbyte-cdk/python/README.md @@ -70,6 +70,61 @@ pip install -e ".[dev]" # [dev] installs development-only dependencies All tests are located in the `unit_tests` directory. Run `pytest --cov=airbyte_cdk unit_tests/` to run them. This also presents a test coverage report. +#### Building a connector with your local CDK + +When developing a new feature in the CDK, you may find it helpful to run a connector that uses that new feature. You can test this in one of two ways: +* Running a connector locally +* Building and running a source via Docker + +##### Installing your local CDK into a local Python connector + +In order to get a local Python connector running your local CDK, do the following. + +First, make sure you have your connector's virtual environment active: +```bash +# from the `airbyte/airbyte-integrations/connectors/` directory +source .venv/bin/activate + +# if you haven't installed dependencies for your connector already +pip install -e . +``` + +Then, navigate to the CDK and install it in editable mode: +```bash +cd ../../../airbyte-cdk/python +pip install -e . +``` + +You should see that `pip` has uninstalled the version of `airbyte-cdk` defined by your connector's `setup.py` and installed your local CDK. Any changes you make will be immediately reflected in your editor, so long as your editor's interpreter is set to your connector's virtual environment. + +##### Building a Python connector in Docker with your local CDK installed + +Create a symlink that connects `/airbyte-cdk` to your local CDK installation: +```bash +# from the `airbyte/airbyte-integrations/connectors/` directory +ln -s ../../../airbyte-cdk/python airbyte-cdk +``` + +Add the following lines to your connector's `Dockerfile`, before the line that installs dependencies via `pip install -e .`: +```Dockerfile +COPY airbyte-cdk airbyte-cdk +RUN pip install -e ./airbyte-cdk +``` + +Add the following to your connectors `build.gradle` file: +```java +airbyteDocker { + followSymlinks = true +} +``` + +You should be able to build your connector with +```bash +# from the airbytehq/airbyte base directory +./gradlew build :airbyte-integrations:connectors: +``` +and the installation should use your local CDK. Note that the local CDK is injected at build time, so if you make changes, you will have to run the build command again to see them reflected. +**Note:** if your connector uses a `.dockerignore` file, it cannot have `exclude-all` or `exclude-except` patterns, i.e. the `.dockerignore` must specifically say which files to ignore without using any regex. #### Publishing a new version to PyPi 1. Bump the package version in `setup.py` diff --git a/airbyte-cdk/python/airbyte_cdk/connector.py b/airbyte-cdk/python/airbyte_cdk/connector.py index bd47f188c907..a130c6a3ea90 100644 --- a/airbyte-cdk/python/airbyte_cdk/connector.py +++ b/airbyte-cdk/python/airbyte_cdk/connector.py @@ -8,7 +8,7 @@ import os import pkgutil from abc import ABC, abstractmethod -from typing import Any, Generic, Mapping, Optional, Protocol, TypeVar +from typing import Any, Generic, List, Mapping, Optional, Protocol, TypeVar, Union import yaml from airbyte_cdk.models import AirbyteConnectionStatus, ConnectorSpecification @@ -47,10 +47,24 @@ def configure(self, config: Mapping[str, Any], temp_dir: str) -> TConfig: """ @staticmethod - def read_config(config_path: str) -> TConfig: - with open(config_path, "r") as file: + def read_config(config_path: str) -> Mapping[str, Any]: + config = BaseConnector._read_json_file(config_path) + if isinstance(config, Mapping): + return config + else: + raise ValueError( + f"The content of {config_path} is not an object and therefore is not a valid config. Please ensure the file represent a config." + ) + + @staticmethod + def _read_json_file(file_path: str) -> Union[None, bool, float, int, str, List[Any], Mapping[str, Any]]: + with open(file_path, "r") as file: contents = file.read() - return json.loads(contents) + + try: + return json.loads(contents) + except json.JSONDecodeError as error: + raise ValueError(f"Could not read json file {file_path}: {error}. Please ensure that it is a valid JSON.") @staticmethod def write_config(config: TConfig, config_path: str): @@ -74,7 +88,10 @@ def spec(self, logger: logging.Logger) -> ConnectorSpecification: if yaml_spec: spec_obj = yaml.load(yaml_spec, Loader=yaml.SafeLoader) elif json_spec: - spec_obj = json.loads(json_spec) + try: + spec_obj = json.loads(json_spec) + except json.JSONDecodeError as error: + raise ValueError(f"Could not read json spec file: {error}. Please ensure that it is a valid JSON.") else: raise FileNotFoundError("Unable to find spec.yaml or spec.json in the package.") diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py index 429de3a7a7e3..c078a6228b5e 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py @@ -3,10 +3,12 @@ # from dataclasses import InitVar, dataclass -from typing import Any, List, Mapping, Optional +from typing import Any, List, Mapping, Optional, Union import requests +from airbyte_cdk.sources.declarative.interpolation import InterpolatedString from airbyte_cdk.sources.declarative.requesters.paginators.strategies.pagination_strategy import PaginationStrategy +from airbyte_cdk.sources.declarative.types import Config from dataclasses_jsonschema import JsonSchemaMixin @@ -14,19 +16,36 @@ class OffsetIncrement(PaginationStrategy, JsonSchemaMixin): """ Pagination strategy that returns the number of records reads so far and returns it as the next page token + Examples: + # page_size to be a constant integer value + pagination_strategy: + type: OffsetIncrement + page_size: 2 + + # page_size to be a constant string value + pagination_strategy: + type: OffsetIncrement + page_size: "2" + + # page_size to be an interpolated string value + pagination_strategy: + type: OffsetIncrement + page_size: "{{ options['items_per_page'] }}" Attributes: - page_size (int): the number of records to request + page_size (InterpolatedString): the number of records to request """ - page_size: int + config: Config + page_size: Union[str, int] options: InitVar[Mapping[str, Any]] def __post_init__(self, options: Mapping[str, Any]): self._offset = 0 + self.page_size = InterpolatedString(self.page_size, options=options) def next_page_token(self, response: requests.Response, last_records: List[Mapping[str, Any]]) -> Optional[Any]: - if len(last_records) < self.page_size: + if len(last_records) < self.page_size.eval(self.config): return None else: self._offset += len(last_records) @@ -36,4 +55,7 @@ def reset(self): self._offset = 0 def get_page_size(self) -> Optional[int]: - return self.page_size + page_size = self.page_size.eval(self.config) + if not isinstance(page_size, int): + raise Exception(f"{page_size} is of type {type(page_size)}. Expected {int}") + return page_size diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/stream_slicers/datetime_stream_slicer.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/stream_slicers/datetime_stream_slicer.py index 181ddc096d99..64c3be3a0dfb 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/stream_slicers/datetime_stream_slicer.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/stream_slicers/datetime_stream_slicer.py @@ -145,27 +145,17 @@ def stream_slices(self, sync_mode: SyncMode, stream_state: Mapping[str, Any]) -> kwargs = {"stream_state": stream_state} end_datetime = min(self.end_datetime.get_datetime(self.config, **kwargs), datetime.datetime.now(tz=self._timezone)) lookback_delta = self._parse_timedelta(self.lookback_window.eval(self.config, **kwargs) if self.lookback_window else "0d") - start_datetime = self.start_datetime.get_datetime(self.config, **kwargs) - lookback_delta - start_datetime = min(start_datetime, end_datetime) - if self.cursor_field.eval(self.config, stream_state=stream_state) in stream_state: - cursor_datetime = self.parse_date(stream_state[self.cursor_field.eval(self.config)]) - else: - cursor_datetime = start_datetime - start_datetime = max(cursor_datetime, start_datetime) + earliest_possible_start_datetime = min(self.start_datetime.get_datetime(self.config, **kwargs), end_datetime) + cursor_datetime = self._calculate_cursor_datetime_from_state(stream_state) + start_datetime = max(earliest_possible_start_datetime, cursor_datetime) - lookback_delta - state_cursor_value = stream_state.get(self.cursor_field.eval(self.config, stream_state=stream_state)) + return self._partition_daterange(start_datetime, end_datetime, self._step) - if state_cursor_value: - state_date = self.parse_date(state_cursor_value) - else: - state_date = None - if state_date: - # If the input_state's date is greater than start_datetime, the start of the time window is the state's next day - next_date = state_date + datetime.timedelta(days=1) - start_datetime = max(start_datetime, next_date) - dates = self._partition_daterange(start_datetime, end_datetime, self._step) - return dates + def _calculate_cursor_datetime_from_state(self, stream_state: Mapping[str, Any]) -> datetime.datetime: + if self.cursor_field.eval(self.config, stream_state=stream_state) in stream_state: + return self.parse_date(stream_state[self.cursor_field.eval(self.config)]) + datetime.timedelta(days=1) + return datetime.datetime.min.replace(tzinfo=datetime.timezone.utc) def _format_datetime(self, dt: datetime.datetime): return self._parser.format(dt, self.datetime_format) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/singer/source.py b/airbyte-cdk/python/airbyte_cdk/sources/singer/source.py index d70beaa2a43f..7048803f408b 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/singer/source.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/singer/source.py @@ -98,7 +98,7 @@ def read(self, logger: logging.Logger, config: ConfigContainer, catalog_path: st Implements the parent class read method. """ catalogs = self._discover_internal(logger, config.config_path) - masked_airbyte_catalog = ConfiguredAirbyteCatalog.parse_obj(self.read_config(catalog_path)) + masked_airbyte_catalog = ConfiguredAirbyteCatalog.parse_obj(self._read_json_file(catalog_path)) selected_singer_catalog_path = SingerHelper.create_singer_catalog_with_selection(masked_airbyte_catalog, catalogs.singer_catalog) read_cmd = self.read_cmd(logger, config.config_path, selected_singer_catalog_path, state_path) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/source.py b/airbyte-cdk/python/airbyte_cdk/sources/source.py index f73f6819548c..fd2650cc79ac 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/source.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/source.py @@ -3,7 +3,6 @@ # -import json import logging from abc import ABC, abstractmethod from collections import defaultdict @@ -54,7 +53,7 @@ def read_state(self, state_path: str) -> Union[List[AirbyteStateMessage], Mutabl :return: The complete stream state based on the connector's previous sync """ if state_path: - state_obj = json.loads(open(state_path, "r").read()) + state_obj = self._read_json_file(state_path) if not state_obj: return self._emit_legacy_state_format({}) is_per_stream_state = isinstance(state_obj, List) @@ -87,4 +86,4 @@ def _emit_legacy_state_format(self, state_obj) -> Union[List[AirbyteStateMessage # can be overridden to change an input catalog def read_catalog(self, catalog_path: str) -> ConfiguredAirbyteCatalog: - return ConfiguredAirbyteCatalog.parse_obj(self.read_config(catalog_path)) + return ConfiguredAirbyteCatalog.parse_obj(self._read_json_file(catalog_path)) diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index 79187d18037a..46f64877e0b0 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.11.3", + version="0.12.4", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown", diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py b/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py index c8f11a76ad60..93e595e9936c 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py @@ -6,18 +6,23 @@ import pytest import requests +from airbyte_cdk.sources.declarative.parsers.factory import DeclarativeComponentFactory from airbyte_cdk.sources.declarative.requesters.paginators.strategies.offset_increment import OffsetIncrement @pytest.mark.parametrize( - "test_name, page_size, expected_next_page_token, expected_offset", + "test_name, page_size, options, expected_next_page_token, expected_offset", [ - ("test_same_page_size", 2, 2, 2), - ("test_larger_page_size", 3, None, 0), + ("test_same_page_size", "2", {}, 2, 2), + ("test_same_page_size", 2, {}, 2, 2), + ("test_larger_page_size", "{{ options['page_size'] }}", {"page_size": 3}, None, 0), ], ) -def test_offset_increment_paginator_strategy(test_name, page_size, expected_next_page_token, expected_offset): - paginator_strategy = OffsetIncrement(page_size, options={}) +def test_offset_increment_paginator_strategy(test_name, page_size, options, expected_next_page_token, expected_offset): + expected_type = DeclarativeComponentFactory.get_default_type("page_size", OffsetIncrement) + page_size = expected_type(page_size) + + paginator_strategy = OffsetIncrement(page_size=page_size, options=options, config={}) assert paginator_strategy._offset == 0 response = requests.Response() @@ -33,3 +38,14 @@ def test_offset_increment_paginator_strategy(test_name, page_size, expected_next paginator_strategy.reset() assert 0 == paginator_strategy._offset + + +def test_offset_increment_paginator_strategy_rises(): + paginator_strategy = OffsetIncrement( + page_size="{{ options['page_size'] }}", + options={"page_size": "invalid value"}, + config={} + ) + with pytest.raises(Exception) as exc: + paginator_strategy.get_page_size() + assert str(exc.value) == 'invalid value is of type . Expected ' diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/stream_slicers/test_datetime_stream_slicer.py b/airbyte-cdk/python/unit_tests/sources/declarative/stream_slicers/test_datetime_stream_slicer.py index 1bee16057667..e86216c809c8 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/stream_slicers/test_datetime_stream_slicer.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/stream_slicers/test_datetime_stream_slicer.py @@ -21,11 +21,15 @@ timezone = datetime.timezone.utc +class MockedNowDatetime(datetime.datetime): + @classmethod + def now(cls, tz=None): + return FAKE_NOW + + @pytest.fixture() def mock_datetime_now(monkeypatch): - datetime_mock = unittest.mock.MagicMock(wraps=datetime.datetime) - datetime_mock.now.return_value = FAKE_NOW - monkeypatch.setattr(datetime, "datetime", datetime_mock) + monkeypatch.setattr(datetime, "datetime", MockedNowDatetime) @pytest.mark.parametrize( @@ -286,6 +290,22 @@ def mock_datetime_now(monkeypatch): {"start_time": "2021-01-05T00:00:00.000000+0000", "end_time": "2021-01-05T00:00:00.000000+0000"}, ], ), + ( + "test_with_lookback_window_from_cursor", + {cursor_field: "2021-01-05T00:00:00.000000+0000"}, + MinMaxDatetime(datetime="2021-01-01T00:00:00.000000+0000", options={}), + MinMaxDatetime(datetime="2021-01-06T00:00:00.000000+0000", options={}), + "1d", + cursor_field, + "3d", + datetime_format, + [ + {"start_time": "2021-01-03T00:00:00.000000+0000", "end_time": "2021-01-03T00:00:00.000000+0000"}, + {"start_time": "2021-01-04T00:00:00.000000+0000", "end_time": "2021-01-04T00:00:00.000000+0000"}, + {"start_time": "2021-01-05T00:00:00.000000+0000", "end_time": "2021-01-05T00:00:00.000000+0000"}, + {"start_time": "2021-01-06T00:00:00.000000+0000", "end_time": "2021-01-06T00:00:00.000000+0000"}, + ], + ), ( "test_with_lookback_window_defaults_to_0d", {"date": "2021-01-05"}, diff --git a/airbyte-cdk/python/unit_tests/sources/test_source.py b/airbyte-cdk/python/unit_tests/sources/test_source.py index 1034975c1892..5b67d57444eb 100644 --- a/airbyte-cdk/python/unit_tests/sources/test_source.py +++ b/airbyte-cdk/python/unit_tests/sources/test_source.py @@ -288,6 +288,14 @@ def test_read_state(source, incoming_state, expected_state, expected_error): assert actual == expected_state +def test_read_invalid_state(source): + with tempfile.NamedTemporaryFile("w") as state_file: + state_file.write("invalid json content") + state_file.flush() + with pytest.raises(ValueError, match="Could not read json file"): + source.read_state(state_file.name) + + def test_read_state_sends_new_legacy_format_if_source_does_not_implement_read(): expected_state = [ AirbyteStateMessage( diff --git a/airbyte-cdk/python/unit_tests/test_connector.py b/airbyte-cdk/python/unit_tests/test_connector.py index 06e9dd16ead1..0474946697e5 100644 --- a/airbyte-cdk/python/unit_tests/test_connector.py +++ b/airbyte-cdk/python/unit_tests/test_connector.py @@ -65,6 +65,14 @@ def nonempty_file(mock_config): yield file +@pytest.fixture +def nonjson_file(mock_config): + with tempfile.NamedTemporaryFile("w") as file: + file.write("the content of this file is not JSON") + file.flush() + yield file + + @pytest.fixture def integration(): return MockConnector() @@ -75,6 +83,11 @@ def test_read_config(nonempty_file, integration: Connector, mock_config): assert mock_config == actual +def test_read_non_json_config(nonjson_file, integration: Connector): + with pytest.raises(ValueError, match="Could not read json file"): + integration.read_config(nonjson_file.name) + + def test_write_config(integration, mock_config): config_path = Path(tempfile.gettempdir()) / "config.json" integration.write_config(mock_config, str(config_path)) @@ -103,6 +116,14 @@ def use_json_spec(self): yield os.remove(json_path) + @pytest.fixture + def use_invalid_json_spec(self): + json_path = os.path.join(SPEC_ROOT, "spec.json") + with open(json_path, "w") as f: + f.write("the content of this file is not JSON") + yield + os.remove(json_path) + @pytest.fixture def use_yaml_spec(self): spec = {"documentationUrl": "https://airbyte.com/#yaml", "connectionSpecification": self.CONNECTION_SPECIFICATION} @@ -118,6 +139,10 @@ def test_spec_from_json_file(self, integration, use_json_spec): assert connector_spec.documentationUrl == "https://airbyte.com/#json" assert connector_spec.connectionSpecification == self.CONNECTION_SPECIFICATION + def test_spec_from_improperly_formatted_json_file(self, integration, use_invalid_json_spec): + with pytest.raises(ValueError, match="Could not read json spec file"): + integration.spec(logger) + def test_spec_from_yaml_file(self, integration, use_yaml_spec): connector_spec = integration.spec(logger) assert connector_spec.documentationUrl == "https://airbyte.com/#yaml" diff --git a/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/TemporalClient.java b/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/TemporalClient.java index 9abceab23c75..3c8ec42e4985 100644 --- a/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/TemporalClient.java +++ b/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/TemporalClient.java @@ -332,7 +332,8 @@ public TemporalResponse submitGetSpec(final UUID jobId, fina final IntegrationLauncherConfig launcherConfig = new IntegrationLauncherConfig() .withJobId(jobId.toString()) .withAttemptId((long) attempt) - .withDockerImage(config.getDockerImage()); + .withDockerImage(config.getDockerImage()) + .withIsCustomConnector(config.getIsCustomConnector()); return execute(jobRunConfig, () -> getWorkflowStub(SpecWorkflow.class, TemporalJobType.GET_SPEC).run(jobRunConfig, launcherConfig)); @@ -346,7 +347,8 @@ public TemporalResponse submitCheckConnection(final UUID job .withJobId(jobId.toString()) .withAttemptId((long) attempt) .withDockerImage(config.getDockerImage()) - .withProtocolVersion(config.getProtocolVersion()); + .withProtocolVersion(config.getProtocolVersion()) + .withIsCustomConnector(config.getIsCustomConnector()); final StandardCheckConnectionInput input = new StandardCheckConnectionInput().withConnectionConfiguration(config.getConnectionConfiguration()); return execute(jobRunConfig, @@ -361,7 +363,8 @@ public TemporalResponse submitDiscoverSchema(final UUID jobI .withJobId(jobId.toString()) .withAttemptId((long) attempt) .withDockerImage(config.getDockerImage()) - .withProtocolVersion(config.getProtocolVersion()); + .withProtocolVersion(config.getProtocolVersion()) + .withIsCustomConnector(config.getIsCustomConnector()); final StandardDiscoverCatalogInput input = new StandardDiscoverCatalogInput().withConnectionConfiguration(config.getConnectionConfiguration()) .withSourceId(config.getSourceId()).withConnectorVersion(config.getConnectorVersion()).withConfigHash(config.getConfigHash()); @@ -376,13 +379,15 @@ public TemporalResponse submitSync(final long jobId, final i .withJobId(String.valueOf(jobId)) .withAttemptId((long) attempt) .withDockerImage(config.getSourceDockerImage()) - .withProtocolVersion(config.getSourceProtocolVersion()); + .withProtocolVersion(config.getSourceProtocolVersion()) + .withIsCustomConnector(config.getIsSourceCustomConnector()); final IntegrationLauncherConfig destinationLauncherConfig = new IntegrationLauncherConfig() .withJobId(String.valueOf(jobId)) .withAttemptId((long) attempt) .withDockerImage(config.getDestinationDockerImage()) - .withProtocolVersion(config.getDestinationProtocolVersion()); + .withProtocolVersion(config.getDestinationProtocolVersion()) + .withIsCustomConnector(config.getIsDestinationCustomConnector()); final StandardSyncInput input = new StandardSyncInput() .withNamespaceDefinition(config.getNamespaceDefinition()) diff --git a/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/sync/OrchestratorConstants.java b/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/sync/OrchestratorConstants.java index 21a0ff14b645..61fccbad4e1e 100644 --- a/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/sync/OrchestratorConstants.java +++ b/airbyte-commons-temporal/src/main/java/io/airbyte/commons/temporal/sync/OrchestratorConstants.java @@ -31,6 +31,8 @@ public class OrchestratorConstants { EnvConfigs.JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET, EnvConfigs.JOB_KUBE_SIDECAR_CONTAINER_IMAGE_PULL_POLICY, EnvConfigs.JOB_KUBE_NODE_SELECTORS, + EnvConfigs.JOB_ISOLATED_KUBE_NODE_SELECTORS, + EnvConfigs.USE_CUSTOM_NODE_SELECTOR, EnvConfigs.DOCKER_NETWORK, EnvConfigs.LOCAL_DOCKER_MOUNT, EnvConfigs.WORKSPACE_DOCKER_MOUNT, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/WorkerConfigs.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/WorkerConfigs.java index a8997e271088..5d7efb720c2c 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/WorkerConfigs.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/WorkerConfigs.java @@ -9,6 +9,7 @@ import io.airbyte.config.TolerationPOJO; import java.util.List; import java.util.Map; +import java.util.Optional; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -18,6 +19,7 @@ public class WorkerConfigs { private final ResourceRequirements resourceRequirements; private final List workerKubeTolerations; private final Map workerKubeNodeSelectors; + private final Optional> workerIsolatedKubeNodeSelectors; private final Map workerKubeAnnotations; private final String jobImagePullSecret; private final String jobImagePullPolicy; @@ -41,6 +43,7 @@ public WorkerConfigs(final Configs configs) { .withMemoryLimit(configs.getJobMainContainerMemoryLimit()), configs.getJobKubeTolerations(), configs.getJobKubeNodeSelectors(), + configs.getUseCustomKubeNodeSelector() ? Optional.of(configs.getIsolatedJobKubeNodeSelectors()) : Optional.empty(), configs.getJobKubeAnnotations(), configs.getJobKubeMainContainerImagePullSecret(), configs.getJobKubeMainContainerImagePullPolicy(), @@ -72,6 +75,7 @@ public static WorkerConfigs buildSpecWorkerConfigs(final Configs configs) { .withMemoryLimit(configs.getJobMainContainerMemoryLimit()), configs.getJobKubeTolerations(), nodeSelectors, + configs.getUseCustomKubeNodeSelector() ? Optional.of(configs.getIsolatedJobKubeNodeSelectors()) : Optional.empty(), annotations, configs.getJobKubeMainContainerImagePullSecret(), configs.getJobKubeMainContainerImagePullPolicy(), @@ -103,6 +107,7 @@ public static WorkerConfigs buildCheckWorkerConfigs(final Configs configs) { .withMemoryLimit(configs.getCheckJobMainContainerMemoryLimit()), configs.getJobKubeTolerations(), nodeSelectors, + configs.getUseCustomKubeNodeSelector() ? Optional.of(configs.getIsolatedJobKubeNodeSelectors()) : Optional.empty(), annotations, configs.getJobKubeMainContainerImagePullSecret(), configs.getJobKubeMainContainerImagePullPolicy(), @@ -134,6 +139,7 @@ public static WorkerConfigs buildDiscoverWorkerConfigs(final Configs configs) { .withMemoryLimit(configs.getJobMainContainerMemoryLimit()), configs.getJobKubeTolerations(), nodeSelectors, + configs.getUseCustomKubeNodeSelector() ? Optional.of(configs.getIsolatedJobKubeNodeSelectors()) : Optional.empty(), annotations, configs.getJobKubeMainContainerImagePullSecret(), configs.getJobKubeMainContainerImagePullPolicy(), @@ -154,6 +160,7 @@ public static WorkerConfigs buildReplicationWorkerConfigs(final Configs configs) .withMemoryLimit(configs.getReplicationOrchestratorMemoryLimit()), configs.getJobKubeTolerations(), configs.getJobKubeNodeSelectors(), + configs.getUseCustomKubeNodeSelector() ? Optional.of(configs.getIsolatedJobKubeNodeSelectors()) : Optional.empty(), configs.getJobKubeAnnotations(), configs.getJobKubeMainContainerImagePullSecret(), configs.getJobKubeMainContainerImagePullPolicy(), @@ -180,6 +187,10 @@ public Map getworkerKubeNodeSelectors() { return workerKubeNodeSelectors; } + public Optional> getWorkerIsolatedKubeNodeSelectors() { + return workerIsolatedKubeNodeSelectors; + } + public Map getWorkerKubeAnnotations() { return workerKubeAnnotations; } diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java index df0ff0807151..62316d0df602 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java @@ -99,6 +99,7 @@ public boolean transform(final String jobId, jobRoot, dbtConfig.getDockerImage(), false, + false, files, "/bin/bash", resourceRequirements, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java index 9b59867ada27..a88ae8a62f51 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java @@ -41,6 +41,7 @@ public static String getEntrypointEnvVariable(final ProcessFactory processFactor jobRoot, imageName, false, + false, Collections.emptyMap(), "printenv", null, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java index 786c6a5ea072..1388eddf0fe2 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java @@ -5,7 +5,6 @@ package io.airbyte.workers.normalization; import com.fasterxml.jackson.databind.JsonNode; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import io.airbyte.commons.io.IOs; @@ -46,7 +45,7 @@ public class DefaultNormalizationRunner implements NormalizationRunner { .setLogPrefix("normalization") .setPrefixColor(Color.GREEN_BACKGROUND); - private final DestinationType destinationType; + private final String integrationType; private final ProcessFactory processFactory; private final String normalizationImageName; private final NormalizationAirbyteStreamFactory streamFactory = new NormalizationAirbyteStreamFactory(CONTAINER_LOG_MDC_BUILDER); @@ -55,31 +54,12 @@ public class DefaultNormalizationRunner implements NormalizationRunner { private Process process = null; - public enum DestinationType { - BIGQUERY, - MSSQL, - MYSQL, - ORACLE, - POSTGRES, - REDSHIFT, - SNOWFLAKE, - CLICKHOUSE, - TIDB - } - - public DefaultNormalizationRunner(final DestinationType destinationType, - final ProcessFactory processFactory, - final String normalizationImageName) { - this.destinationType = destinationType; - this.processFactory = processFactory; - this.normalizationImageName = normalizationImageName; - } - public DefaultNormalizationRunner(final ProcessFactory processFactory, - final String normalizationImage) { + final String normalizationImage, + final String destinationType) { this.processFactory = processFactory; this.normalizationImageName = normalizationImage; - this.destinationType = null; + this.integrationType = destinationType; } @Override @@ -99,12 +79,12 @@ public boolean configureDbt(final String jobId, final String gitRepoBranch = dbtConfig.getGitRepoBranch(); if (Strings.isNullOrEmpty(gitRepoBranch)) { return runProcess(jobId, attempt, jobRoot, files, resourceRequirements, "configure-dbt", - "--integration-type", destinationType.toString().toLowerCase(), + "--integration-type", integrationType.toLowerCase(), "--config", WorkerConstants.DESTINATION_CONFIG_JSON_FILENAME, "--git-repo", gitRepoUrl); } else { return runProcess(jobId, attempt, jobRoot, files, resourceRequirements, "configure-dbt", - "--integration-type", destinationType.toString().toLowerCase(), + "--integration-type", integrationType.toLowerCase(), "--config", WorkerConstants.DESTINATION_CONFIG_JSON_FILENAME, "--git-repo", gitRepoUrl, "--git-branch", gitRepoBranch); @@ -124,7 +104,7 @@ public boolean normalize(final String jobId, WorkerConstants.DESTINATION_CATALOG_JSON_FILENAME, Jsons.serialize(catalog)); return runProcess(jobId, attempt, jobRoot, files, resourceRequirements, "run", - "--integration-type", destinationType.toString().toLowerCase(), + "--integration-type", integrationType.toLowerCase(), "--config", WorkerConstants.DESTINATION_CONFIG_JSON_FILENAME, "--catalog", WorkerConstants.DESTINATION_CATALOG_JSON_FILENAME); } @@ -145,6 +125,8 @@ private boolean runProcess(final String jobId, attempt, jobRoot, normalizationImageName, + // custom connector does not use normalization + false, false, files, null, resourceRequirements, @@ -231,9 +213,4 @@ private String buildInternalErrorMessageFromDbtStackTrace() { return errorMap.get(SentryExceptionHelper.ERROR_MAP_KEYS.ERROR_MAP_MESSAGE_KEY); } - @VisibleForTesting - DestinationType getDestinationType() { - return destinationType; - } - } diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/NormalizationRunnerFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/NormalizationRunnerFactory.java index afdf020993a3..e69de29bb2d1 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/NormalizationRunnerFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/NormalizationRunnerFactory.java @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.workers.normalization; - -import com.google.common.collect.ImmutableMap; -import io.airbyte.workers.normalization.DefaultNormalizationRunner.DestinationType; -import io.airbyte.workers.process.ProcessFactory; -import java.util.Map; -import java.util.Objects; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.tuple.ImmutablePair; - -@Slf4j -public class NormalizationRunnerFactory { - - public static final String BASE_NORMALIZATION_IMAGE_NAME = "airbyte/normalization"; - public static final String NORMALIZATION_VERSION = "0.2.24"; - - static final Map> NORMALIZATION_MAPPING = - ImmutableMap.>builder() - // map destination connectors (alphabetically) to their expected normalization settings - .put("airbyte/destination-bigquery", ImmutablePair.of(BASE_NORMALIZATION_IMAGE_NAME, DefaultNormalizationRunner.DestinationType.BIGQUERY)) - .put("airbyte/destination-bigquery-denormalized", - ImmutablePair.of(BASE_NORMALIZATION_IMAGE_NAME, DefaultNormalizationRunner.DestinationType.BIGQUERY)) - .put("airbyte/destination-clickhouse", ImmutablePair.of("airbyte/normalization-clickhouse", DestinationType.CLICKHOUSE)) - .put("airbyte/destination-clickhouse-strict-encrypt", ImmutablePair.of("airbyte/normalization-clickhouse", DestinationType.CLICKHOUSE)) - .put("airbyte/destination-mssql", ImmutablePair.of("airbyte/normalization-mssql", DestinationType.MSSQL)) - .put("airbyte/destination-mssql-strict-encrypt", ImmutablePair.of("airbyte/normalization-mssql", DestinationType.MSSQL)) - .put("airbyte/destination-mysql", ImmutablePair.of("airbyte/normalization-mysql", DestinationType.MYSQL)) - .put("airbyte/destination-mysql-strict-encrypt", ImmutablePair.of("airbyte/normalization-mysql", DestinationType.MYSQL)) - .put("airbyte/destination-oracle", ImmutablePair.of("airbyte/normalization-oracle", DestinationType.ORACLE)) - .put("airbyte/destination-oracle-strict-encrypt", ImmutablePair.of("airbyte/normalization-oracle", DestinationType.ORACLE)) - .put("airbyte/destination-postgres", ImmutablePair.of(BASE_NORMALIZATION_IMAGE_NAME, DestinationType.POSTGRES)) - .put("airbyte/destination-postgres-strict-encrypt", ImmutablePair.of(BASE_NORMALIZATION_IMAGE_NAME, DestinationType.POSTGRES)) - .put("airbyte/destination-redshift", ImmutablePair.of("airbyte/normalization-redshift", DestinationType.REDSHIFT)) - .put("airbyte/destination-snowflake", ImmutablePair.of("airbyte/normalization-snowflake", DestinationType.SNOWFLAKE)) - .put("airbyte/destination-tidb", ImmutablePair.of("airbyte/normalization-tidb", DestinationType.TIDB)) - .build(); - - public static NormalizationRunner create(final String connectorImageName, - final ProcessFactory processFactory, - final String normalizationVersion, - final String normalizationImage) { - final var valuePair = getNormalizationInfoForConnector(connectorImageName); - final String factoryNormalizationImage = String.format("%s:%s", valuePair.getLeft(), normalizationVersion); - if (Objects.nonNull(normalizationImage) - && !normalizationImage.equalsIgnoreCase(factoryNormalizationImage)) { - log.error( - "The normalization image name or tag in the definition file is different from the normalization image or tag in the NormalizationRunnerFactory!"); - log.error( - "the definition file value - {}, the NormalizationRunnerFactory value - {}", normalizationImage, factoryNormalizationImage); - } - return new DefaultNormalizationRunner( - valuePair.getRight(), - processFactory, - factoryNormalizationImage); - } - - public static ImmutablePair getNormalizationInfoForConnector(final String connectorImageName) { - final String imageNameWithoutTag = connectorImageName.contains(":") ? connectorImageName.split(":")[0] : connectorImageName; - if (NORMALIZATION_MAPPING.containsKey(imageNameWithoutTag)) { - return NORMALIZATION_MAPPING.get(imageNameWithoutTag); - } else { - throw new IllegalStateException( - String.format("Requested normalization for %s, but it is not included in the normalization mappings.", connectorImageName)); - } - } - -} diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java index 5183e643f13a..3d6871786731 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java @@ -57,17 +57,26 @@ public class AirbyteIntegrationLauncher implements IntegrationLauncher { private final ResourceRequirements resourceRequirement; private final FeatureFlags featureFlags; + /** + * If true, launcher will use a separated isolated pool to run the job. + * + * At this moment, we put custom connector jobs into an isolated pool. + */ + private final boolean useIsolatedPool; + public AirbyteIntegrationLauncher(final String jobId, final int attempt, final String imageName, final ProcessFactory processFactory, - final ResourceRequirements resourceRequirement) { + final ResourceRequirements resourceRequirement, + final boolean useIsolatedPool) { this.jobId = jobId; this.attempt = attempt; this.imageName = imageName; this.processFactory = processFactory; this.resourceRequirement = resourceRequirement; this.featureFlags = new EnvVariableFeatureFlags(); + this.useIsolatedPool = useIsolatedPool; } @Trace(operationName = WORKER_OPERATION_NAME) @@ -80,6 +89,7 @@ public Process spec(final Path jobRoot) throws WorkerException { attempt, jobRoot, imageName, + useIsolatedPool, false, Collections.emptyMap(), null, @@ -100,6 +110,7 @@ public Process check(final Path jobRoot, final String configFilename, final Stri attempt, jobRoot, imageName, + useIsolatedPool, false, ImmutableMap.of(configFilename, configContents), null, @@ -121,6 +132,7 @@ public Process discover(final Path jobRoot, final String configFilename, final S attempt, jobRoot, imageName, + useIsolatedPool, false, ImmutableMap.of(configFilename, configContents), null, @@ -166,6 +178,7 @@ public Process read(final Path jobRoot, attempt, jobRoot, imageName, + useIsolatedPool, false, files, null, @@ -195,6 +208,7 @@ public Process write(final Path jobRoot, attempt, jobRoot, imageName, + useIsolatedPool, true, files, null, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java index 743a429a772d..5ed26798030b 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java @@ -83,6 +83,7 @@ public Process create(final String jobType, final int attempt, final Path jobRoot, final String imageName, + final boolean usesIsolatedPool, final boolean usesStdin, final Map files, final String entrypoint, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubePodProcess.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubePodProcess.java index ae57868a6909..48a4d686b53f 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubePodProcess.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubePodProcess.java @@ -7,6 +7,8 @@ import io.airbyte.commons.io.IOs; import io.airbyte.commons.lang.Exceptions; import io.airbyte.commons.resources.MoreResources; +import io.airbyte.config.Configs; +import io.airbyte.config.EnvConfigs; import io.airbyte.config.ResourceRequirements; import io.airbyte.config.TolerationPOJO; import io.airbyte.metrics.lib.MetricClientFactory; @@ -101,17 +103,19 @@ // TODO(Davin): Better test for this. See https://github.com/airbytehq/airbyte/issues/3700. public class KubePodProcess extends Process implements KubePod { + private static final Configs configs = new EnvConfigs(); + private static final Logger LOGGER = LoggerFactory.getLogger(KubePodProcess.class); public static final String MAIN_CONTAINER_NAME = "main"; public static final String INIT_CONTAINER_NAME = "init"; - private static final String DEFAULT_MEMORY_REQUEST = "25Mi"; - private static final String DEFAULT_MEMORY_LIMIT = "50Mi"; - private static final String DEFAULT_CPU_REQUEST = "0.1"; - private static final String DEFAULT_CPU_LIMIT = "0.2"; + private static final ResourceRequirements DEFAULT_SIDECAR_RESOURCES = new ResourceRequirements() - .withMemoryLimit(DEFAULT_MEMORY_LIMIT).withMemoryRequest(DEFAULT_MEMORY_REQUEST) - .withCpuLimit(DEFAULT_CPU_LIMIT).withCpuRequest(DEFAULT_CPU_REQUEST); + .withMemoryLimit(configs.getSidecarKubeMemoryLimit()).withMemoryRequest(configs.getSidecarMemoryRequest()) + .withCpuLimit(configs.getSidecarKubeCpuLimit()).withCpuRequest(configs.getSidecarKubeCpuRequest()); + private static final ResourceRequirements DEFAULT_SOCAT_RESOURCES = new ResourceRequirements() + .withMemoryLimit(configs.getSidecarKubeMemoryLimit()).withMemoryRequest(configs.getSidecarMemoryRequest()) + .withCpuLimit(configs.getSocatSidecarKubeCpuLimit()).withCpuRequest(configs.getSocatSidecarKubeCpuRequest()); private static final String PIPES_DIR = "/pipes"; private static final String STDIN_PIPE_FILE = PIPES_DIR + "/stdin"; @@ -446,13 +450,17 @@ public KubePodProcess(final boolean isOrchestrator, // Printing socat notice logs with socat -d -d // To print info logs as well use socat -d -d -d // more info: https://linux.die.net/man/1/socat - final io.fabric8.kubernetes.api.model.ResourceRequirements sidecarResources = getResourceRequirementsBuilder(DEFAULT_SIDECAR_RESOURCES).build(); + final io.fabric8.kubernetes.api.model.ResourceRequirements heartbeatSidecarResources = + getResourceRequirementsBuilder(DEFAULT_SIDECAR_RESOURCES).build(); + final io.fabric8.kubernetes.api.model.ResourceRequirements socatSidecarResources = + getResourceRequirementsBuilder(DEFAULT_SOCAT_RESOURCES).build(); + final Container remoteStdin = new ContainerBuilder() .withName("remote-stdin") .withImage(socatImage) .withCommand("sh", "-c", "socat -d -d TCP-L:9001 STDOUT > " + STDIN_PIPE_FILE) .withVolumeMounts(pipeVolumeMount, terminationVolumeMount) - .withResources(sidecarResources) + .withResources(socatSidecarResources) .withImagePullPolicy(sidecarImagePullPolicy) .build(); @@ -461,7 +469,7 @@ public KubePodProcess(final boolean isOrchestrator, .withImage(socatImage) .withCommand("sh", "-c", String.format("cat %s | socat -d -d -t 60 - TCP:%s:%s", STDOUT_PIPE_FILE, processRunnerHost, stdoutLocalPort)) .withVolumeMounts(pipeVolumeMount, terminationVolumeMount) - .withResources(sidecarResources) + .withResources(socatSidecarResources) .withImagePullPolicy(sidecarImagePullPolicy) .build(); @@ -470,7 +478,7 @@ public KubePodProcess(final boolean isOrchestrator, .withImage(socatImage) .withCommand("sh", "-c", String.format("cat %s | socat -d -d -t 60 - TCP:%s:%s", STDERR_PIPE_FILE, processRunnerHost, stderrLocalPort)) .withVolumeMounts(pipeVolumeMount, terminationVolumeMount) - .withResources(sidecarResources) + .withResources(socatSidecarResources) .withImagePullPolicy(sidecarImagePullPolicy) .build(); @@ -487,7 +495,7 @@ public KubePodProcess(final boolean isOrchestrator, .withCommand("sh") .withArgs("-c", heartbeatCommand) .withVolumeMounts(terminationVolumeMount) - .withResources(sidecarResources) + .withResources(heartbeatSidecarResources) .withImagePullPolicy(sidecarImagePullPolicy) .build(); diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java index 99227c82cc8f..ad5b25d7939d 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java @@ -85,6 +85,7 @@ public Process create( final int attempt, final Path jobRoot, final String imageName, + final boolean isCustomConnector, final boolean usesStdin, final Map files, final String entrypoint, @@ -107,6 +108,12 @@ public Process create( final var allLabels = getLabels(jobId, attempt, customLabels); + // If using isolated pool, check workerConfigs has isolated pool set. If not set, fall back to use + // regular node pool. + final var nodeSelectors = + isCustomConnector ? workerConfigs.getWorkerIsolatedKubeNodeSelectors().orElse(workerConfigs.getworkerKubeNodeSelectors()) + : workerConfigs.getworkerKubeNodeSelectors(); + return new KubePodProcess( isOrchestrator, processRunnerHost, @@ -125,7 +132,7 @@ public Process create( resourceRequirements, workerConfigs.getJobImagePullSecret(), workerConfigs.getWorkerKubeTolerations(), - workerConfigs.getworkerKubeNodeSelectors(), + nodeSelectors, allLabels, workerConfigs.getWorkerKubeAnnotations(), workerConfigs.getJobSocatImage(), diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java index 676114796ca6..d9cf45084a06 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java @@ -26,6 +26,7 @@ public interface ProcessFactory { * @param attempt attempt Id * @param jobPath Workspace directory to run the process from. * @param imageName Docker image name to start the process from. + * @param usesIsolatedPool whether to use isolated pool to run the jobs. * @param files File name to contents map that will be written into the working dir of the process * prior to execution. * @param entrypoint If not null, the default entrypoint program of the docker image can be changed @@ -43,6 +44,7 @@ Process create(String jobType, int attempt, final Path jobPath, final String imageName, + final boolean usesIsolatedPool, final boolean usesStdin, final Map files, final String entrypoint, diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/DbtLauncherWorker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/DbtLauncherWorker.java index efad287d22b5..65c499f5a114 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/DbtLauncherWorker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/DbtLauncherWorker.java @@ -43,7 +43,10 @@ public DbtLauncherWorker(final UUID connectionId, activityContext, serverPort, temporalUtils, - workerConfigs); + workerConfigs, + // Custom connector does not use Dbt at this moment, thus this flag for runnning job under + // isolated pool can be set to false. + false); } } diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/LauncherWorker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/LauncherWorker.java index 839ca31d4df5..ed2274be290e 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/LauncherWorker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/LauncherWorker.java @@ -73,6 +73,7 @@ public class LauncherWorker implements Worker { private final TemporalUtils temporalUtils; private final WorkerConfigs workerConfigs; + private final boolean isCustomConnector; private final AtomicBoolean cancelled = new AtomicBoolean(false); private AsyncOrchestratorPodProcess process; @@ -87,7 +88,8 @@ public LauncherWorker(final UUID connectionId, final Supplier activityContext, final Integer serverPort, final TemporalUtils temporalUtils, - final WorkerConfigs workerConfigs) { + final WorkerConfigs workerConfigs, + final boolean isCustomConnector) { this.connectionId = connectionId; this.application = application; @@ -101,6 +103,7 @@ public LauncherWorker(final UUID connectionId, this.serverPort = serverPort; this.temporalUtils = temporalUtils; this.workerConfigs = workerConfigs; + this.isCustomConnector = isCustomConnector; } @Trace(operationName = WORKER_OPERATION_NAME) @@ -173,13 +176,19 @@ public OUTPUT run(final INPUT input, final Path jobRoot) throws WorkerException log.info("Creating " + podName + " for attempt number: " + jobRunConfig.getAttemptId()); killRunningPodsForConnection(); + // custom connectors run in an isolated node pool from airbyte-supported connectors + // to reduce the blast radius of any problems with custom connector code. + final var nodeSelectors = + isCustomConnector ? workerConfigs.getWorkerIsolatedKubeNodeSelectors().orElse(workerConfigs.getworkerKubeNodeSelectors()) + : workerConfigs.getworkerKubeNodeSelectors(); + try { process.create( allLabels, resourceRequirements, fileMap, portMap, - workerConfigs.getworkerKubeNodeSelectors()); + nodeSelectors); } catch (final KubernetesClientException e) { ApmTraceUtils.addExceptionToTrace(e); throw new WorkerException( diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/NormalizationLauncherWorker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/NormalizationLauncherWorker.java index 1c47a5435baf..38c36fbf52a7 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/NormalizationLauncherWorker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/NormalizationLauncherWorker.java @@ -44,7 +44,10 @@ public NormalizationLauncherWorker(final UUID connectionId, activityContext, serverPort, temporalUtils, - workerConfigs); + workerConfigs, + // Normalization process will happen only on a fixed set of connectors, + // thus they are not going to be run under custom connectors. Setting this to false. + false); } diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/ReplicationLauncherWorker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/ReplicationLauncherWorker.java index da9767b68164..905aed0c6387 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/ReplicationLauncherWorker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/sync/ReplicationLauncherWorker.java @@ -54,7 +54,8 @@ public ReplicationLauncherWorker(final UUID connectionId, activityContext, serverPort, temporalUtils, - workerConfigs); + workerConfigs, + sourceLauncherConfig.getIsCustomConnector() || destinationLauncherConfig.getIsCustomConnector()); } } diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java index 6b182f2c656e..2959d4bfe823 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; +import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.io.IOs; import io.airbyte.commons.json.Jsons; import io.airbyte.commons.logging.LoggingHelper.Color; @@ -26,7 +27,6 @@ import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.WorkerConstants; import io.airbyte.workers.exception.WorkerException; -import io.airbyte.workers.normalization.DefaultNormalizationRunner.DestinationType; import io.airbyte.workers.process.AirbyteIntegrationLauncher; import io.airbyte.workers.process.ProcessFactory; import java.io.ByteArrayInputStream; @@ -49,6 +49,10 @@ class DefaultNormalizationRunnerTest { private static final String JOB_ID = "0"; private static final int JOB_ATTEMPT = 0; + private static final String NORMALIZATION_IMAGE = "airbyte/normalization"; + private static final String NORMALIZATION_TAG = "0.2.24"; + private static final String INTEGRATION_TYPE = "postgres"; + private static Path logJobRoot; static { @@ -82,14 +86,14 @@ void setup() throws IOException, WorkerException { WorkerConstants.DESTINATION_CATALOG_JSON_FILENAME, Jsons.serialize(catalog)); when(processFactory.create(AirbyteIntegrationLauncher.NORMALIZE_STEP, JOB_ID, JOB_ATTEMPT, jobRoot, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME, false, files, null, + DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), false, false, files, null, workerConfigs.getResourceRequirements(), Map.of(AirbyteIntegrationLauncher.JOB_TYPE, AirbyteIntegrationLauncher.SYNC_JOB, AirbyteIntegrationLauncher.SYNC_STEP, AirbyteIntegrationLauncher.NORMALIZE_STEP), Map.of(), Map.of(), "run", - "--integration-type", "bigquery", + "--integration-type", INTEGRATION_TYPE, "--config", WorkerConstants.DESTINATION_CONFIG_JSON_FILENAME, "--catalog", WorkerConstants.DESTINATION_CATALOG_JSON_FILENAME)) .thenReturn(process); @@ -110,8 +114,7 @@ public void tearDown() throws IOException { @Test void test() throws Exception { final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); when(process.exitValue()).thenReturn(0); @@ -122,8 +125,7 @@ void test() throws Exception { void testLog() throws Exception { final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); when(process.exitValue()).thenReturn(0); @@ -145,8 +147,7 @@ void testClose() throws Exception { when(process.isAlive()).thenReturn(true).thenReturn(false); final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); runner.normalize(JOB_ID, JOB_ATTEMPT, jobRoot, config, catalog, workerConfigs.getResourceRequirements()); runner.close(); @@ -158,8 +159,7 @@ void testFailure() throws Exception { when(process.exitValue()).thenReturn(1); final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); assertFalse(runner.normalize(JOB_ID, JOB_ATTEMPT, jobRoot, config, catalog, workerConfigs.getResourceRequirements())); verify(process).waitFor(); @@ -180,8 +180,7 @@ void testFailureWithTraceMessage() throws Exception { when(process.getInputStream()).thenReturn(new ByteArrayInputStream(errorTraceString.getBytes(StandardCharsets.UTF_8))); final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); assertFalse(runner.normalize(JOB_ID, JOB_ATTEMPT, jobRoot, config, catalog, workerConfigs.getResourceRequirements())); assertEquals(1, runner.getTraceMessages().count()); @@ -207,8 +206,7 @@ void testFailureWithDbtError() throws Exception { when(process.getInputStream()).thenReturn(new ByteArrayInputStream(dbtErrorString.getBytes(StandardCharsets.UTF_8))); final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); assertFalse(runner.normalize(JOB_ID, JOB_ATTEMPT, jobRoot, config, catalog, workerConfigs.getResourceRequirements())); assertEquals(1, runner.getTraceMessages().count()); @@ -229,8 +227,7 @@ void testFailureWithDbtErrorJsonFormat() throws Exception { when(process.getInputStream()).thenReturn(new ByteArrayInputStream(dbtErrorString.getBytes(StandardCharsets.UTF_8))); final NormalizationRunner runner = - new DefaultNormalizationRunner(DestinationType.BIGQUERY, processFactory, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME); + new DefaultNormalizationRunner(processFactory, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), INTEGRATION_TYPE); assertFalse(runner.normalize(JOB_ID, JOB_ATTEMPT, jobRoot, config, catalog, workerConfigs.getResourceRequirements())); assertEquals(1, runner.getTraceMessages().count()); diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/NormalizationRunnerFactoryTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/NormalizationRunnerFactoryTest.java deleted file mode 100644 index bc1420c6d1a5..000000000000 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/NormalizationRunnerFactoryTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.workers.normalization; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; - -import io.airbyte.workers.normalization.DefaultNormalizationRunner.DestinationType; -import io.airbyte.workers.process.ProcessFactory; -import java.util.Map.Entry; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class NormalizationRunnerFactoryTest { - - public static final String NORMALIZATION_VERSION = "dev"; - private ProcessFactory processFactory; - - @BeforeEach - void setup() { - processFactory = mock(ProcessFactory.class); - } - - @Test - void testMappings() { - for (final Entry> entry : NormalizationRunnerFactory.NORMALIZATION_MAPPING.entrySet()) { - assertEquals(entry.getValue().getValue(), - ((DefaultNormalizationRunner) NormalizationRunnerFactory.create( - String.format("%s:0.1.0", entry.getKey()), processFactory, NORMALIZATION_VERSION, String.format("%s:0.1.0", entry.getKey()))) - .getDestinationType()); - } - assertThrows(IllegalStateException.class, - () -> NormalizationRunnerFactory.create("airbyte/destination-csv:0.1.0", processFactory, - NORMALIZATION_VERSION, "airbyte/destination-csv:0.1.0")); - } - -} diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java index 3be0ab36723b..30c8779a2449 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java @@ -64,14 +64,14 @@ class AirbyteIntegrationLauncherTest { @BeforeEach void setUp() { workerConfigs = new WorkerConfigs(new EnvConfigs()); - launcher = new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, FAKE_IMAGE, processFactory, workerConfigs.getResourceRequirements()); + launcher = new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, FAKE_IMAGE, processFactory, workerConfigs.getResourceRequirements(), false); } @Test void spec() throws WorkerException { launcher.spec(JOB_ROOT); - Mockito.verify(processFactory).create(SPEC_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, Collections.emptyMap(), null, + Mockito.verify(processFactory).create(SPEC_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, Collections.emptyMap(), null, workerConfigs.getResourceRequirements(), Map.of(AirbyteIntegrationLauncher.JOB_TYPE, AirbyteIntegrationLauncher.SPEC_JOB), JOB_METADATA, Map.of(), "spec"); @@ -81,7 +81,7 @@ void spec() throws WorkerException { void check() throws WorkerException { launcher.check(JOB_ROOT, CONFIG, "{}"); - Mockito.verify(processFactory).create(CHECK_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, CONFIG_FILES, null, + Mockito.verify(processFactory).create(CHECK_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_FILES, null, workerConfigs.getResourceRequirements(), Map.of(JOB_TYPE, CHECK_JOB), JOB_METADATA, @@ -94,7 +94,7 @@ void check() throws WorkerException { void discover() throws WorkerException { launcher.discover(JOB_ROOT, CONFIG, "{}"); - Mockito.verify(processFactory).create(DISCOVER_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, CONFIG_FILES, null, + Mockito.verify(processFactory).create(DISCOVER_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_FILES, null, workerConfigs.getResourceRequirements(), Map.of(JOB_TYPE, DISCOVER_JOB), JOB_METADATA, @@ -107,7 +107,7 @@ void discover() throws WorkerException { void read() throws WorkerException { launcher.read(JOB_ROOT, CONFIG, "{}", CATALOG, "{}", "state", "{}"); - Mockito.verify(processFactory).create(READ_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, CONFIG_CATALOG_STATE_FILES, null, + Mockito.verify(processFactory).create(READ_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_CATALOG_STATE_FILES, null, workerConfigs.getResourceRequirements(), Map.of(JOB_TYPE, SYNC_JOB, SYNC_STEP, READ_STEP), JOB_METADATA, @@ -123,7 +123,7 @@ void read() throws WorkerException { void write() throws WorkerException { launcher.write(JOB_ROOT, CONFIG, "{}", CATALOG, "{}"); - Mockito.verify(processFactory).create(WRITE_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, true, CONFIG_CATALOG_FILES, null, + Mockito.verify(processFactory).create(WRITE_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, true, CONFIG_CATALOG_FILES, null, workerConfigs.getResourceRequirements(), Map.of(JOB_TYPE, SYNC_JOB, SYNC_STEP, WRITE_STEP), JOB_METADATA, diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java index ba8170320962..215fb0bb2015 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java @@ -85,7 +85,7 @@ void testFileWriting() throws IOException, WorkerException { final DockerProcessFactory processFactory = new DockerProcessFactory(new WorkerConfigs(new EnvConfigs()), workspaceRoot, null, null, null); - processFactory.create("tester", "job_id", 0, jobRoot, BUSYBOX, false, ImmutableMap.of("config.json", "{\"data\": 2}"), "echo hi", + processFactory.create("tester", "job_id", 0, jobRoot, BUSYBOX, false, false, ImmutableMap.of("config.json", "{\"data\": 2}"), "echo hi", new WorkerConfigs(new EnvConfigs()).getResourceRequirements(), Map.of(), Map.of(), Map.of()); assertEquals( @@ -121,6 +121,7 @@ void testEnvMapSet() throws IOException, WorkerException, InterruptedException { jobRoot, BUSYBOX, false, + false, Map.of(), "/bin/sh", workerConfigs.getResourceRequirements(), @@ -153,6 +154,7 @@ private void waitForDockerToInitialize(final ProcessFactory processFactory, fina jobRoot, BUSYBOX, false, + false, Map.of(), "/bin/sh", workerConfigs.getResourceRequirements(), diff --git a/airbyte-config/config-models/src/main/java/io/airbyte/config/Configs.java b/airbyte-config/config-models/src/main/java/io/airbyte/config/Configs.java index 8769119ddd27..d7a95739e748 100644 --- a/airbyte-config/config-models/src/main/java/io/airbyte/config/Configs.java +++ b/airbyte-config/config-models/src/main/java/io/airbyte/config/Configs.java @@ -405,6 +405,16 @@ public interface Configs { */ Map getJobKubeNodeSelectors(); + /** + * Define an isolated kube node selectors, so we can run risky images in it. + */ + Map getIsolatedJobKubeNodeSelectors(); + + /** + * Define if we want to run custom connector related jobs in a separate node pool. + */ + boolean getUseCustomKubeNodeSelector(); + /** * Define node selectors for Spec job pods specifically. Each kv-pair is separated by a `,`. */ @@ -457,10 +467,40 @@ public interface Configs { String getJobKubeMainContainerImagePullSecret(); /** - * Define the Job pod socat image. + * Define the Memory request for the Sidecar + */ + String getSidecarMemoryRequest(); + + /** + * Define the Memory limit for the Sidecar + */ + String getSidecarKubeMemoryLimit(); + + /** + * Define the CPU request for the Sidecar + */ + String getSidecarKubeCpuRequest(); + + /** + * Define the CPU limit for the Sidecar + */ + String getSidecarKubeCpuLimit(); + + /** + * Define the CPU request for the SOCAT Sidecar */ String getJobKubeSocatImage(); + /** + * Define the CPU limit for the SOCAT Sidecar + */ + String getSocatSidecarKubeCpuLimit(); + + /** + * Define the Job pod socat image. + */ + String getSocatSidecarKubeCpuRequest(); + /** * Define the Job pod busybox image. */ diff --git a/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java b/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java index ef3d7b6750d6..53f6cde6cab5 100644 --- a/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java +++ b/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java @@ -72,8 +72,20 @@ public class EnvConfigs implements Configs { public static final String JOB_KUBE_SIDECAR_CONTAINER_IMAGE_PULL_POLICY = "JOB_KUBE_SIDECAR_CONTAINER_IMAGE_PULL_POLICY"; public static final String JOB_KUBE_TOLERATIONS = "JOB_KUBE_TOLERATIONS"; public static final String JOB_KUBE_NODE_SELECTORS = "JOB_KUBE_NODE_SELECTORS"; + public static final String JOB_ISOLATED_KUBE_NODE_SELECTORS = "JOB_ISOLATED_KUBE_NODE_SELECTORS"; + public static final String USE_CUSTOM_NODE_SELECTOR = "USE_CUSTOM_NODE_SELECTOR"; public static final String JOB_KUBE_ANNOTATIONS = "JOB_KUBE_ANNOTATIONS"; + private static final String DEFAULT_SIDECAR_MEMORY_REQUEST = "25Mi"; + private static final String SIDECAR_MEMORY_REQUEST = "SIDECAR_MEMORY_REQUEST"; + private static final String DEFAULT_SIDECAR_KUBE_MEMORY_LIMIT = "50Mi"; + private static final String SIDECAR_KUBE_MEMORY_LIMIT = "SIDECAR_KUBE_MEMORY_LIMIT"; + private static final String DEFAULT_SIDECAR_KUBE_CPU_REQUEST = "0.1"; + private static final String SIDECAR_KUBE_CPU_REQUEST = "SIDECAR_KUBE_CPU_REQUEST"; + private static final String DEFAULT_SIDECAR_KUBE_CPU_LIMIT = "0.2"; + private static final String SIDECAR_KUBE_CPU_LIMIT = "SIDECAR_KUBE_CPU_LIMIT"; public static final String JOB_KUBE_SOCAT_IMAGE = "JOB_KUBE_SOCAT_IMAGE"; + private static final String SOCAT_KUBE_CPU_LIMIT = "SOCAT_KUBE_CPU_LIMIT"; + private static final String SOCAT_KUBE_CPU_REQUEST = "SOCAT_KUBE_CPU_REQUEST"; public static final String JOB_KUBE_BUSYBOX_IMAGE = "JOB_KUBE_BUSYBOX_IMAGE"; public static final String JOB_KUBE_CURL_IMAGE = "JOB_KUBE_CURL_IMAGE"; public static final String SYNC_JOB_MAX_ATTEMPTS = "SYNC_JOB_MAX_ATTEMPTS"; @@ -607,6 +619,16 @@ public Map getJobKubeNodeSelectors() { return splitKVPairsFromEnvString(getEnvOrDefault(JOB_KUBE_NODE_SELECTORS, "")); } + @Override + public Map getIsolatedJobKubeNodeSelectors() { + return splitKVPairsFromEnvString(getEnvOrDefault(JOB_ISOLATED_KUBE_NODE_SELECTORS, "")); + } + + @Override + public boolean getUseCustomKubeNodeSelector() { + return getEnvOrDefault(USE_CUSTOM_NODE_SELECTOR, false); + } + /** * Returns a map of node selectors for Spec job pods specifically. * @@ -725,11 +747,41 @@ public String getJobKubeMainContainerImagePullSecret() { return getEnvOrDefault(JOB_KUBE_MAIN_CONTAINER_IMAGE_PULL_SECRET, ""); } + @Override + public String getSidecarKubeCpuRequest() { + return getEnvOrDefault(SIDECAR_KUBE_CPU_REQUEST, DEFAULT_SIDECAR_KUBE_CPU_REQUEST); + } + + @Override + public String getSidecarKubeCpuLimit() { + return getEnvOrDefault(SIDECAR_KUBE_CPU_LIMIT, DEFAULT_SIDECAR_KUBE_CPU_LIMIT); + } + + @Override + public String getSidecarKubeMemoryLimit() { + return getEnvOrDefault(SIDECAR_KUBE_MEMORY_LIMIT, DEFAULT_SIDECAR_KUBE_MEMORY_LIMIT); + } + + @Override + public String getSidecarMemoryRequest() { + return getEnvOrDefault(SIDECAR_MEMORY_REQUEST, DEFAULT_SIDECAR_MEMORY_REQUEST); + } + @Override public String getJobKubeSocatImage() { return getEnvOrDefault(JOB_KUBE_SOCAT_IMAGE, DEFAULT_JOB_KUBE_SOCAT_IMAGE); } + @Override + public String getSocatSidecarKubeCpuRequest() { + return getEnvOrDefault(SOCAT_KUBE_CPU_REQUEST, getSidecarKubeCpuRequest()); + } + + @Override + public String getSocatSidecarKubeCpuLimit() { + return getEnvOrDefault(SOCAT_KUBE_CPU_LIMIT, getSidecarKubeCpuLimit()); + } + @Override public String getJobKubeBusyboxImage() { return getEnvOrDefault(JOB_KUBE_BUSYBOX_IMAGE, DEFAULT_JOB_KUBE_BUSYBOX_IMAGE); diff --git a/airbyte-config/config-models/src/main/resources/types/JobCheckConnectionConfig.yaml b/airbyte-config/config-models/src/main/resources/types/JobCheckConnectionConfig.yaml index 7f239733d589..3ec7819bfca0 100644 --- a/airbyte-config/config-models/src/main/resources/types/JobCheckConnectionConfig.yaml +++ b/airbyte-config/config-models/src/main/resources/types/JobCheckConnectionConfig.yaml @@ -18,3 +18,6 @@ properties: protocolVersion: type: object existingJavaType: io.airbyte.commons.version.Version + isCustomConnector: + description: determine if the running image is a custom connector. + type: boolean diff --git a/airbyte-config/config-models/src/main/resources/types/JobDiscoverCatalogConfig.yaml b/airbyte-config/config-models/src/main/resources/types/JobDiscoverCatalogConfig.yaml index a9f189714b69..8f60458a3e11 100644 --- a/airbyte-config/config-models/src/main/resources/types/JobDiscoverCatalogConfig.yaml +++ b/airbyte-config/config-models/src/main/resources/types/JobDiscoverCatalogConfig.yaml @@ -33,3 +33,6 @@ properties: protocolVersion: type: object existingJavaType: io.airbyte.commons.version.Version + isCustomConnector: + description: determine if the running image is a custom connector. + type: boolean diff --git a/airbyte-config/config-models/src/main/resources/types/JobGetSpecConfig.yaml b/airbyte-config/config-models/src/main/resources/types/JobGetSpecConfig.yaml index 0c5bd6fb7bc2..af3162a4b1ab 100644 --- a/airbyte-config/config-models/src/main/resources/types/JobGetSpecConfig.yaml +++ b/airbyte-config/config-models/src/main/resources/types/JobGetSpecConfig.yaml @@ -10,3 +10,6 @@ required: properties: dockerImage: type: string + isCustomConnector: + description: determine if the running image is a custom connector. + type: boolean diff --git a/airbyte-config/config-models/src/main/resources/types/JobResetConnectionConfig.yaml b/airbyte-config/config-models/src/main/resources/types/JobResetConnectionConfig.yaml index 160cdd4067d7..3bba82085306 100644 --- a/airbyte-config/config-models/src/main/resources/types/JobResetConnectionConfig.yaml +++ b/airbyte-config/config-models/src/main/resources/types/JobResetConnectionConfig.yaml @@ -52,3 +52,9 @@ properties: state: description: optional current state of the connection "$ref": State.yaml + isSourceCustomConnector: + description: determine if the running image of the source is a custom connector. + type: boolean + isDestinationCustomConnector: + description: determine if the running image of the destination is a custom connector. + type: boolean diff --git a/airbyte-config/config-models/src/main/resources/types/JobSyncConfig.yaml b/airbyte-config/config-models/src/main/resources/types/JobSyncConfig.yaml index f6b9af129a08..1862f17f884c 100644 --- a/airbyte-config/config-models/src/main/resources/types/JobSyncConfig.yaml +++ b/airbyte-config/config-models/src/main/resources/types/JobSyncConfig.yaml @@ -71,3 +71,9 @@ properties: type: object description: optional resource requirements to run sync workers - this is used for containers other than the source/dest containers existingJavaType: io.airbyte.config.ResourceRequirements + isSourceCustomConnector: + description: determine if the source running image is a custom connector. + type: boolean + isDestinationCustomConnector: + description: determine if the destination running image is a custom connector. + type: boolean diff --git a/airbyte-config/config-models/src/main/resources/types/StandardDestinationDefinition.yaml b/airbyte-config/config-models/src/main/resources/types/StandardDestinationDefinition.yaml index f3f37ebb3971..bc4a835cc8b5 100644 --- a/airbyte-config/config-models/src/main/resources/types/StandardDestinationDefinition.yaml +++ b/airbyte-config/config-models/src/main/resources/types/StandardDestinationDefinition.yaml @@ -64,4 +64,5 @@ properties: type: string supportsDbt: type: boolean - default: false + integrationType: + type: string diff --git a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java index cb836f63fbb9..52542308b784 100644 --- a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java +++ b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java @@ -178,6 +178,7 @@ static void writeStandardDestinationDefinition(final List \ No newline at end of file diff --git a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml index 03431e4601e8..fd23a658ad09 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml @@ -45,6 +45,7 @@ normalizationRepository: airbyte/normalization normalizationTag: 0.2.24 supportsDbt: true + integrationType: bigquery resourceRequirements: jobSpecific: - jobType: sync @@ -60,6 +61,7 @@ icon: bigquery.svg normalizationRepository: airbyte/normalization normalizationTag: 0.2.24 + integrationType: bigquery resourceRequirements: jobSpecific: - jobType: sync @@ -84,13 +86,14 @@ - name: Clickhouse destinationDefinitionId: ce0d828e-1dc4-496c-b122-2da42e637e48 dockerRepository: airbyte/destination-clickhouse - dockerImageTag: 0.2.0 + dockerImageTag: 0.2.1 documentationUrl: https://docs.airbyte.com/integrations/destinations/clickhouse icon: clickhouse.svg releaseStage: alpha normalizationRepository: airbyte/normalization-clickhouse normalizationTag: 0.2.24 supportsDbt: true + integrationType: clickhouse - name: Cloudflare R2 destinationDefinitionId: 0fb07be9-7c3b-4336-850d-5efc006152ee dockerRepository: airbyte/destination-r2 @@ -203,6 +206,7 @@ normalizationRepository: airbyte/normalization-mssql normalizationTag: 0.2.24 supportsDbt: true + integrationType: mssql - name: MeiliSearch destinationDefinitionId: af7c921e-5892-4ff2-b6c1-4a5ab258fb7e dockerRepository: airbyte/destination-meilisearch @@ -227,6 +231,7 @@ normalizationRepository: airbyte/normalization-mysql normalizationTag: 0.2.24 supportsDbt: true + integrationType: mysql - name: Oracle destinationDefinitionId: 3986776d-2319-4de9-8af8-db14c0996e72 dockerRepository: airbyte/destination-oracle @@ -237,6 +242,7 @@ normalizationRepository: airbyte/normalization-oracle normalizationTag: 0.2.24 supportsDbt: true + integrationType: oracle - name: Postgres destinationDefinitionId: 25c5221d-dce2-4163-ade9-739ef790f503 dockerRepository: airbyte/destination-postgres @@ -244,9 +250,10 @@ documentationUrl: https://docs.airbyte.com/integrations/destinations/postgres icon: postgresql.svg releaseStage: alpha - normalizationRepository: airbyte/normalization-postgres + normalizationRepository: airbyte/normalization normalizationTag: 0.2.24 supportsDbt: true + integrationType: postgres - name: Pulsar destinationDefinitionId: 2340cbba-358e-11ec-8d3d-0242ac130203 dockerRepository: airbyte/destination-pulsar @@ -277,6 +284,7 @@ normalizationRepository: airbyte/normalization-redshift normalizationTag: 0.2.24 supportsDbt: true + integrationType: redshift resourceRequirements: jobSpecific: - jobType: sync @@ -331,6 +339,7 @@ normalizationRepository: airbyte/normalization-snowflake normalizationTag: 0.2.24 supportsDbt: true + integrationType: snowflake resourceRequirements: jobSpecific: - jobType: sync @@ -383,6 +392,7 @@ normalizationRepository: airbyte/normalization-tidb normalizationTag: 0.2.24 supportsDbt: true + integrationType: tidb - name: Typesense destinationDefinitionId: 36be8dc6-9851-49af-b776-9d4c30e4ab6a dockerRepository: airbyte/destination-typesense diff --git a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml index 046336e4e28a..5d7ad0b1223b 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml @@ -1133,7 +1133,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-clickhouse:0.2.0" +- dockerImage: "airbyte/destination-clickhouse:0.2.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/clickhouse" connectionSpecification: diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 4216aa386801..816fb80ddf58 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -77,7 +77,7 @@ - name: Amplitude sourceDefinitionId: fa9f58c6-2d03-4237-aaa4-07d75e0c1396 dockerRepository: airbyte/source-amplitude - dockerImageTag: 0.1.17 + dockerImageTag: 0.1.18 documentationUrl: https://docs.airbyte.com/integrations/sources/amplitude icon: amplitude.svg sourceType: api @@ -177,7 +177,7 @@ - name: Bing Ads sourceDefinitionId: 47f25999-dd5e-4636-8c39-e7cea2453331 dockerRepository: airbyte/source-bing-ads - dockerImageTag: 0.1.16 + dockerImageTag: 0.1.17 documentationUrl: https://docs.airbyte.com/integrations/sources/bing-ads icon: bingads.svg sourceType: api @@ -255,7 +255,7 @@ - name: Close.com sourceDefinitionId: dfffecb7-9a13-43e9-acdc-b92af7997ca9 dockerRepository: airbyte/source-close-com - dockerImageTag: 0.1.0 + dockerImageTag: 0.2.0 documentationUrl: https://docs.airbyte.com/integrations/sources/close-com icon: close.svg sourceType: api @@ -267,7 +267,7 @@ documentationUrl: https://docs.airbyte.com/integrations/sources/coingecko-coins icon: coingeckocoins.svg sourceType: api - releaseStage: alpha + releaseStage: beta - name: Cockroachdb sourceDefinitionId: 9fa5862c-da7c-11eb-8d19-0242ac130003 dockerRepository: airbyte/source-cockroachdb @@ -451,7 +451,7 @@ - name: Facebook Marketing sourceDefinitionId: e7778cfc-e97c-4458-9ecb-b4f2bba8946c dockerRepository: airbyte/source-facebook-marketing - dockerImageTag: 0.2.76 + dockerImageTag: 0.2.78 documentationUrl: https://docs.airbyte.com/integrations/sources/facebook-marketing icon: facebook.svg sourceType: api @@ -546,8 +546,9 @@ - name: Gridly sourceDefinitionId: 6cbea164-3237-433b-9abb-36d384ee4cbf dockerRepository: airbyte/source-gridly - dockerImageTag: 0.1.0 + dockerImageTag: 0.1.1 documentationUrl: https://docs.airbyte.com/integrations/sources/gridly + icon: gridly.svg sourceType: api releaseStage: alpha - name: GitHub @@ -791,7 +792,7 @@ - name: Kafka sourceDefinitionId: d917a47b-8537-4d0d-8c10-36a9928d4265 dockerRepository: airbyte/source-kafka - dockerImageTag: 0.2.2 + dockerImageTag: 0.2.3 documentationUrl: https://docs.airbyte.com/integrations/sources/kafka icon: kafka.svg sourceType: database @@ -882,7 +883,7 @@ - name: Mailchimp sourceDefinitionId: b03a9f3e-22a5-11eb-adc1-0242ac120002 dockerRepository: airbyte/source-mailchimp - dockerImageTag: 0.2.15 + dockerImageTag: 0.3.0 documentationUrl: https://docs.airbyte.com/integrations/sources/mailchimp icon: mailchimp.svg sourceType: api @@ -997,7 +998,7 @@ - name: MySQL sourceDefinitionId: 435bb9a5-7887-4809-aa58-28c27df0d7ad dockerRepository: airbyte/source-mysql - dockerImageTag: 1.0.14 + dockerImageTag: 1.0.15 documentationUrl: https://docs.airbyte.com/integrations/sources/mysql icon: mysql.svg sourceType: database @@ -1249,7 +1250,7 @@ - name: Postgres sourceDefinitionId: decd338e-5647-4c0b-adf4-da0e75f5a750 dockerRepository: airbyte/source-postgres - dockerImageTag: 1.0.30 + dockerImageTag: 1.0.31 documentationUrl: https://docs.airbyte.com/integrations/sources/postgres icon: postgresql.svg sourceType: database @@ -1378,14 +1379,14 @@ - name: RD Station Marketing sourceDefinitionId: fb141f29-be2a-450b-a4f2-2cd203a00f84 dockerRepository: airbyte/source-rd-station-marketing - dockerImageTag: 0.1.0 + dockerImageTag: 0.1.1 documentationUrl: https://docs.airbyte.com/integrations/sources/rd-station-marketing sourceType: api releaseStage: alpha - name: RKI Covid sourceDefinitionId: d78e5de0-aa44-4744-aa4f-74c818ccfe19 dockerRepository: airbyte/source-rki-covid - dockerImageTag: 0.1.1 + dockerImageTag: 0.1.2 documentationUrl: https://docs.airbyte.com/integrations/sources/rki-covid sourceType: api releaseStage: alpha @@ -1945,14 +1946,14 @@ - name: Firebolt sourceDefinitionId: 6f2ac653-8623-43c4-8950-19218c7caf3d dockerRepository: airbyte/source-firebolt - dockerImageTag: 0.1.0 + dockerImageTag: 0.2.0 documentationUrl: https://docs.airbyte.com/integrations/sources/firebolt sourceType: database releaseStage: alpha - name: Elasticsearch sourceDefinitionId: 7cf88806-25f5-4e1a-b422-b2fa9e1b0090 dockerRepository: airbyte/source-elasticsearch - dockerImageTag: 0.1.0 + dockerImageTag: 0.1.1 documentationUrl: https://docs.airbyte.com/integrations/sources/elasticsearch sourceType: api releaseStage: alpha diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 7fceeed59030..7d174a562a60 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -1200,7 +1200,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-amplitude:0.1.17" +- dockerImage: "airbyte/source-amplitude:0.1.18" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amplitude" connectionSpecification: @@ -1208,11 +1208,20 @@ title: "Amplitude Spec" type: "object" required: + - "data_region" - "api_key" - "secret_key" - "start_date" additionalProperties: true properties: + data_region: + type: "string" + title: "Data region" + description: "Amplitude data region server" + enum: + - "Standard Server" + - "EU Residency Server" + default: "Standard Server" api_key: type: "string" title: "API Key" @@ -1762,7 +1771,7 @@ - "overwrite" - "append" - "append_dedup" -- dockerImage: "airbyte/source-bing-ads:0.1.16" +- dockerImage: "airbyte/source-bing-ads:0.1.17" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/bing-ads" connectionSpecification: @@ -2422,7 +2431,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-close-com:0.1.0" +- dockerImage: "airbyte/source-close-com:0.2.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/close-com" connectionSpecification: @@ -2431,7 +2440,7 @@ type: "object" required: - "api_key" - additionalProperties: false + additionalProperties: true properties: api_key: type: "string" @@ -3492,7 +3501,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-facebook-marketing:0.2.76" +- dockerImage: "airbyte/source-facebook-marketing:0.2.78" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/facebook-marketing" changelogUrl: "https://docs.airbyte.com/integrations/sources/facebook-marketing" @@ -4539,7 +4548,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-gridly:0.1.0" +- dockerImage: "airbyte/source-gridly:0.1.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/gridly" connectionSpecification: @@ -4548,6 +4557,7 @@ type: "object" required: - "api_key" + - "grid_id" properties: api_key: type: "string" @@ -6733,7 +6743,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-kafka:0.2.2" +- dockerImage: "airbyte/source-kafka:0.2.3" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/kafka" connectionSpecification: @@ -6744,7 +6754,7 @@ - "bootstrap_servers" - "subscription" - "protocol" - additionalProperties: false + additionalProperties: true properties: MessageFormat: title: "MessageFormat" @@ -6755,16 +6765,11 @@ properties: deserialization_type: type: "string" - enum: - - "JSON" - default: "JSON" + const: "JSON" - title: "AVRO" properties: deserialization_type: - type: "string" - enum: - - "AVRO" - default: "AVRO" + const: "AVRO" deserialization_strategy: type: "string" enum: @@ -6815,9 +6820,6 @@ \ list of topic partitions is empty, it is treated the same as unsubscribe()." type: "string" const: "assign" - enum: - - "assign" - default: "assign" topic_partitions: title: "List of topic:partition Pairs" type: "string" @@ -6832,9 +6834,6 @@ description: "The Topic pattern from which the records will be read." type: "string" const: "subscribe" - enum: - - "subscribe" - default: "subscribe" topic_pattern: title: "Topic Pattern" type: "string" @@ -6876,9 +6875,7 @@ properties: security_protocol: type: "string" - enum: - - "PLAINTEXT" - default: "PLAINTEXT" + const: "PLAINTEXT" - title: "SASL PLAINTEXT" required: - "security_protocol" @@ -6887,17 +6884,13 @@ properties: security_protocol: type: "string" - enum: - - "SASL_PLAINTEXT" - default: "SASL_PLAINTEXT" + const: "SASL_PLAINTEXT" sasl_mechanism: title: "SASL Mechanism" description: "The SASL mechanism used for client connections. This\ \ may be any mechanism for which a security provider is available." type: "string" - default: "PLAIN" - enum: - - "PLAIN" + const: "PLAIN" sasl_jaas_config: title: "SASL JAAS Config" description: "The JAAS login context parameters for SASL connections\ @@ -6913,9 +6906,7 @@ properties: security_protocol: type: "string" - enum: - - "SASL_SSL" - default: "SASL_SSL" + const: "SASL_SSL" sasl_mechanism: title: "SASL Mechanism" description: "The SASL mechanism used for client connections. This\ @@ -7587,7 +7578,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-mailchimp:0.2.15" +- dockerImage: "airbyte/source-mailchimp:0.3.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/mailchimp" connectionSpecification: @@ -8809,7 +8800,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-mysql:1.0.14" +- dockerImage: "airbyte/source-mysql:1.0.15" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/mysql" connectionSpecification: @@ -11370,7 +11361,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-postgres:1.0.30" +- dockerImage: "airbyte/source-postgres:1.0.31" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/postgres" connectionSpecification: @@ -11619,7 +11610,7 @@ enum: - "pgoutput" - "wal2json" - const: "pgoutput" + default: "pgoutput" order: 2 replication_slot: type: "string" @@ -12392,7 +12383,7 @@ path_in_connector_config: - "credentials" - "client_secret" -- dockerImage: "airbyte/source-rd-station-marketing:0.1.0" +- dockerImage: "airbyte/source-rd-station-marketing:0.1.1" spec: documentationUrl: "https://docs.airbyte.io/integrations/sources/rd-station-marketing" connectionSpecification: @@ -12456,7 +12447,7 @@ - - "client_secret" oauthFlowOutputParameters: - - "refresh_token" -- dockerImage: "airbyte/source-rki-covid:0.1.1" +- dockerImage: "airbyte/source-rki-covid:0.1.2" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/rki-covid" connectionSpecification: @@ -12465,7 +12456,7 @@ type: "object" required: - "start_date" - additionalProperties: false + additionalProperties: true properties: start_date: type: "string" @@ -16895,7 +16886,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-firebolt:0.1.0" +- dockerImage: "airbyte/source-firebolt:0.2.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/firebolt" connectionSpecification: @@ -16906,7 +16897,7 @@ - "username" - "password" - "database" - additionalProperties: false + additionalProperties: true properties: username: type: "string" @@ -16918,6 +16909,7 @@ type: "string" title: "Password" description: "Firebolt password." + airbyte_secret: true account: type: "string" title: "Account" @@ -16939,7 +16931,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-elasticsearch:0.1.0" +- dockerImage: "airbyte/source-elasticsearch:0.1.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/source/elasticsearch" connectionSpecification: @@ -16948,7 +16940,7 @@ type: "object" required: - "endpoint" - additionalProperties: false + additionalProperties: true properties: endpoint: title: "Server Endpoint" @@ -16960,7 +16952,7 @@ description: "The type of authentication to be used" oneOf: - title: "None" - additionalProperties: false + additionalProperties: true description: "No authentication will be used" required: - "method" @@ -16969,7 +16961,7 @@ type: "string" const: "none" - title: "Api Key/Secret" - additionalProperties: false + additionalProperties: true description: "Use a api key and secret combination to authenticate" required: - "method" @@ -16990,7 +16982,7 @@ type: "string" airbyte_secret: true - title: "Username/Password" - additionalProperties: false + additionalProperties: true description: "Basic auth header with a username and password" required: - "method" diff --git a/airbyte-connector-builder-server/Dockerfile b/airbyte-connector-builder-server/Dockerfile index f805708f3980..cb3a75522c6c 100644 --- a/airbyte-connector-builder-server/Dockerfile +++ b/airbyte-connector-builder-server/Dockerfile @@ -10,5 +10,5 @@ RUN pip install --no-cache-dir . ENTRYPOINT ["uvicorn", "connector_builder.entrypoint:app", "--host", "0.0.0.0", "--port", "80"] -LABEL io.airbyte.version=0.40.23 +LABEL io.airbyte.version=0.40.24 LABEL io.airbyte.name=airbyte/connector-builder-server diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/add_fields.py b/airbyte-connector-builder-server/connector_builder/generated/models/add_fields.py new file mode 100644 index 000000000000..5e9844e2fd6a --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/add_fields.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.add_fields_all_of import AddFieldsAllOf +from connector_builder.generated.models.added_field_definition import AddedFieldDefinition +from connector_builder.generated.models.parsed_add_field_definition import ParsedAddFieldDefinition + + +class AddFields(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + AddFields - a model defined in OpenAPI + + fields: The fields of this AddFields. + parsed_fields: The parsed_fields of this AddFields [Optional]. + """ + + fields: List[AddedFieldDefinition] + parsed_fields: Optional[List[ParsedAddFieldDefinition]] = None + +AddFields.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/add_fields_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/add_fields_all_of.py new file mode 100644 index 000000000000..591552ec048d --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/add_fields_all_of.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.added_field_definition import AddedFieldDefinition +from connector_builder.generated.models.parsed_add_field_definition import ParsedAddFieldDefinition + + +class AddFieldsAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + AddFieldsAllOf - a model defined in OpenAPI + + fields: The fields of this AddFieldsAllOf. + parsed_fields: The parsed_fields of this AddFieldsAllOf [Optional]. + """ + + fields: List[AddedFieldDefinition] + parsed_fields: Optional[List[ParsedAddFieldDefinition]] = None + +AddFieldsAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/added_field_definition.py b/airbyte-connector-builder-server/connector_builder/generated/models/added_field_definition.py new file mode 100644 index 000000000000..adcb5d7afcda --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/added_field_definition.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class AddedFieldDefinition(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + AddedFieldDefinition - a model defined in OpenAPI + + path: The path of this AddedFieldDefinition. + value: The value of this AddedFieldDefinition. + """ + + path: List[str] + value: AnyOfInterpolatedStringstring + +AddedFieldDefinition.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator.py b/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator.py new file mode 100644 index 000000000000..375b437201e1 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.api_key_authenticator_all_of import ApiKeyAuthenticatorAllOf + + +class ApiKeyAuthenticator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ApiKeyAuthenticator - a model defined in OpenAPI + + header: The header of this ApiKeyAuthenticator. + api_token: The api_token of this ApiKeyAuthenticator. + config: The config of this ApiKeyAuthenticator. + """ + + header: AnyOfInterpolatedStringstring + api_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + +ApiKeyAuthenticator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator_all_of.py new file mode 100644 index 000000000000..c633330edb66 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/api_key_authenticator_all_of.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class ApiKeyAuthenticatorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ApiKeyAuthenticatorAllOf - a model defined in OpenAPI + + header: The header of this ApiKeyAuthenticatorAllOf. + api_token: The api_token of this ApiKeyAuthenticatorAllOf. + config: The config of this ApiKeyAuthenticatorAllOf. + """ + + header: AnyOfInterpolatedStringstring + api_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + +ApiKeyAuthenticatorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator.py b/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator.py new file mode 100644 index 000000000000..c6211d81819a --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.basic_http_authenticator_all_of import BasicHttpAuthenticatorAllOf + + +class BasicHttpAuthenticator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + BasicHttpAuthenticator - a model defined in OpenAPI + + username: The username of this BasicHttpAuthenticator. + config: The config of this BasicHttpAuthenticator. + password: The password of this BasicHttpAuthenticator [Optional]. + """ + + username: AnyOfInterpolatedStringstring + config: Dict[str, Any] + password: Optional[AnyOfInterpolatedStringstring] = None + +BasicHttpAuthenticator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator_all_of.py new file mode 100644 index 000000000000..0a939e86120d --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/basic_http_authenticator_all_of.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class BasicHttpAuthenticatorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + BasicHttpAuthenticatorAllOf - a model defined in OpenAPI + + username: The username of this BasicHttpAuthenticatorAllOf. + config: The config of this BasicHttpAuthenticatorAllOf. + password: The password of this BasicHttpAuthenticatorAllOf [Optional]. + """ + + username: AnyOfInterpolatedStringstring + config: Dict[str, Any] + password: Optional[AnyOfInterpolatedStringstring] = None + +BasicHttpAuthenticatorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator.py b/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator.py new file mode 100644 index 000000000000..617f5450e0fa --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.bearer_authenticator_all_of import BearerAuthenticatorAllOf + + +class BearerAuthenticator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + BearerAuthenticator - a model defined in OpenAPI + + api_token: The api_token of this BearerAuthenticator. + config: The config of this BearerAuthenticator. + """ + + api_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + +BearerAuthenticator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator_all_of.py new file mode 100644 index 000000000000..be31c200fb35 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/bearer_authenticator_all_of.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class BearerAuthenticatorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + BearerAuthenticatorAllOf - a model defined in OpenAPI + + api_token: The api_token of this BearerAuthenticatorAllOf. + config: The config of this BearerAuthenticatorAllOf. + """ + + api_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + +BearerAuthenticatorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer.py b/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer.py new file mode 100644 index 000000000000..f8f8f7c2d658 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cartesian_product_stream_slicer_datetime_stream_slicer_list_stream_slicer_single_slice_substream_slicer import AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer +from connector_builder.generated.models.cartesian_product_stream_slicer_all_of import CartesianProductStreamSlicerAllOf +from connector_builder.generated.models.stream_slicer import StreamSlicer + + +class CartesianProductStreamSlicer(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CartesianProductStreamSlicer - a model defined in OpenAPI + + stream_slicers: The stream_slicers of this CartesianProductStreamSlicer. + """ + + stream_slicers: List[AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer] + +CartesianProductStreamSlicer.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer_all_of.py new file mode 100644 index 000000000000..02101282ca94 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/cartesian_product_stream_slicer_all_of.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cartesian_product_stream_slicer_datetime_stream_slicer_list_stream_slicer_single_slice_substream_slicer import AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer + + +class CartesianProductStreamSlicerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CartesianProductStreamSlicerAllOf - a model defined in OpenAPI + + stream_slicers: The stream_slicers of this CartesianProductStreamSlicerAllOf. + """ + + stream_slicers: List[AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer] + +CartesianProductStreamSlicerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/check_stream.py b/airbyte-connector-builder-server/connector_builder/generated/models/check_stream.py new file mode 100644 index 000000000000..2092cd7f0fd1 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/check_stream.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class CheckStream(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CheckStream - a model defined in OpenAPI + + stream_names: The stream_names of this CheckStream. + """ + + stream_names: List[str] + +CheckStream.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler.py b/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler.py new file mode 100644 index 000000000000..cbee68b5f18c --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler.py @@ -0,0 +1,26 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_composite_error_handler_default_error_handler import AnyOfCompositeErrorHandlerDefaultErrorHandler +from connector_builder.generated.models.composite_error_handler_all_of import CompositeErrorHandlerAllOf + + +class CompositeErrorHandler(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CompositeErrorHandler - a model defined in OpenAPI + + error_handlers: The error_handlers of this CompositeErrorHandler. + """ + + error_handlers: List[AnyOfCompositeErrorHandlerDefaultErrorHandler] + +CompositeErrorHandler.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler_all_of.py new file mode 100644 index 000000000000..a5ff0c1aad91 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/composite_error_handler_all_of.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_composite_error_handler_default_error_handler import AnyOfCompositeErrorHandlerDefaultErrorHandler + + +class CompositeErrorHandlerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CompositeErrorHandlerAllOf - a model defined in OpenAPI + + error_handlers: The error_handlers of this CompositeErrorHandlerAllOf. + """ + + error_handlers: List[AnyOfCompositeErrorHandlerDefaultErrorHandler] + +CompositeErrorHandlerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/config_component_schema.py b/airbyte-connector-builder-server/connector_builder/generated/models/config_component_schema.py new file mode 100644 index 000000000000..296640138587 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/config_component_schema.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.check_stream import CheckStream +from connector_builder.generated.models.declarative_stream import DeclarativeStream + + +class ConfigComponentSchema(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ConfigComponentSchema - a model defined in OpenAPI + + version: The version of this ConfigComponentSchema. + check: The check of this ConfigComponentSchema. + streams: The streams of this ConfigComponentSchema. + """ + + version: str + check: CheckStream + streams: List[DeclarativeStream] + +ConfigComponentSchema.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/connector_manifest.py b/airbyte-connector-builder-server/connector_builder/generated/models/connector_manifest.py new file mode 100644 index 000000000000..a17fc7e4c531 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/connector_manifest.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.check_stream import CheckStream +from connector_builder.generated.models.declarative_stream import DeclarativeStream + + +class ConnectorManifest(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ConnectorManifest - a model defined in OpenAPI + + version: The version of this ConnectorManifest. + check: The check of this ConnectorManifest. + streams: The streams of this ConnectorManifest. + """ + + version: str + check: CheckStream + streams: List[DeclarativeStream] + +ConnectorManifest.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy.py b/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy.py new file mode 100644 index 000000000000..13211ad00a77 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring +from connector_builder.generated.models.constant_backoff_strategy_all_of import ConstantBackoffStrategyAllOf + + +class ConstantBackoffStrategy(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ConstantBackoffStrategy - a model defined in OpenAPI + + backoff_time_in_seconds: The backoff_time_in_seconds of this ConstantBackoffStrategy. + config: The config of this ConstantBackoffStrategy. + """ + + backoff_time_in_seconds: AnyOfInterpolatedStringnumberstring + config: Dict[str, Any] + +ConstantBackoffStrategy.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy_all_of.py new file mode 100644 index 000000000000..a2124a321866 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/constant_backoff_strategy_all_of.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring + + +class ConstantBackoffStrategyAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ConstantBackoffStrategyAllOf - a model defined in OpenAPI + + backoff_time_in_seconds: The backoff_time_in_seconds of this ConstantBackoffStrategyAllOf. + config: The config of this ConstantBackoffStrategyAllOf. + """ + + backoff_time_in_seconds: AnyOfInterpolatedStringnumberstring + config: Dict[str, Any] + +ConstantBackoffStrategyAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy.py b/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy.py new file mode 100644 index 000000000000..0b151f5a9bb1 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy.py @@ -0,0 +1,36 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_booleanstring import AnyOfInterpolatedBooleanstring +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.cursor_pagination_strategy_all_of import CursorPaginationStrategyAllOf +from connector_builder.generated.models.json_decoder import JsonDecoder + + +class CursorPaginationStrategy(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CursorPaginationStrategy - a model defined in OpenAPI + + cursor_value: The cursor_value of this CursorPaginationStrategy. + config: The config of this CursorPaginationStrategy. + page_size: The page_size of this CursorPaginationStrategy [Optional]. + stop_condition: The stop_condition of this CursorPaginationStrategy [Optional]. + decoder: The decoder of this CursorPaginationStrategy [Optional]. + """ + + cursor_value: AnyOfInterpolatedStringstring + config: Dict[str, Any] + page_size: Optional[int] = None + stop_condition: Optional[AnyOfInterpolatedBooleanstring] = None + decoder: Optional[JsonDecoder] = None + +CursorPaginationStrategy.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy_all_of.py new file mode 100644 index 000000000000..7610ad4e6cc5 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/cursor_pagination_strategy_all_of.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_booleanstring import AnyOfInterpolatedBooleanstring +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.json_decoder import JsonDecoder + + +class CursorPaginationStrategyAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + CursorPaginationStrategyAllOf - a model defined in OpenAPI + + cursor_value: The cursor_value of this CursorPaginationStrategyAllOf. + config: The config of this CursorPaginationStrategyAllOf. + page_size: The page_size of this CursorPaginationStrategyAllOf [Optional]. + stop_condition: The stop_condition of this CursorPaginationStrategyAllOf [Optional]. + decoder: The decoder of this CursorPaginationStrategyAllOf [Optional]. + """ + + cursor_value: AnyOfInterpolatedStringstring + config: Dict[str, Any] + page_size: Optional[int] = None + stop_condition: Optional[AnyOfInterpolatedBooleanstring] = None + decoder: Optional[JsonDecoder] = None + +CursorPaginationStrategyAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer.py b/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer.py new file mode 100644 index 000000000000..987eaa931db8 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_of_min_max_datetimestring import AnyOfMinMaxDatetimestring +from connector_builder.generated.models.datetime_stream_slicer_all_of import DatetimeStreamSlicerAllOf +from connector_builder.generated.models.request_option import RequestOption +from connector_builder.generated.models.stream_slicer import StreamSlicer + + +class DatetimeStreamSlicer(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DatetimeStreamSlicer - a model defined in OpenAPI + + start_datetime: The start_datetime of this DatetimeStreamSlicer. + end_datetime: The end_datetime of this DatetimeStreamSlicer. + step: The step of this DatetimeStreamSlicer. + cursor_field: The cursor_field of this DatetimeStreamSlicer. + datetime_format: The datetime_format of this DatetimeStreamSlicer. + config: The config of this DatetimeStreamSlicer. + cursor: The cursor of this DatetimeStreamSlicer [Optional]. + cursor_end: The cursor_end of this DatetimeStreamSlicer [Optional]. + start_time_option: The start_time_option of this DatetimeStreamSlicer [Optional]. + end_time_option: The end_time_option of this DatetimeStreamSlicer [Optional]. + stream_state_field_start: The stream_state_field_start of this DatetimeStreamSlicer [Optional]. + stream_state_field_end: The stream_state_field_end of this DatetimeStreamSlicer [Optional]. + lookback_window: The lookback_window of this DatetimeStreamSlicer [Optional]. + """ + + start_datetime: AnyOfMinMaxDatetimestring + end_datetime: AnyOfMinMaxDatetimestring + step: str + cursor_field: AnyOfInterpolatedStringstring + datetime_format: str + config: Dict[str, Any] + cursor: Optional[Dict[str, Any]] = None + cursor_end: Optional[Dict[str, Any]] = None + start_time_option: Optional[RequestOption] = None + end_time_option: Optional[RequestOption] = None + stream_state_field_start: Optional[str] = None + stream_state_field_end: Optional[str] = None + lookback_window: Optional[AnyOfInterpolatedStringstring] = None + +DatetimeStreamSlicer.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer_all_of.py new file mode 100644 index 000000000000..ffc381ab7374 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/datetime_stream_slicer_all_of.py @@ -0,0 +1,51 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_of_min_max_datetimestring import AnyOfMinMaxDatetimestring +from connector_builder.generated.models.request_option import RequestOption + + +class DatetimeStreamSlicerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DatetimeStreamSlicerAllOf - a model defined in OpenAPI + + start_datetime: The start_datetime of this DatetimeStreamSlicerAllOf. + end_datetime: The end_datetime of this DatetimeStreamSlicerAllOf. + step: The step of this DatetimeStreamSlicerAllOf. + cursor_field: The cursor_field of this DatetimeStreamSlicerAllOf. + datetime_format: The datetime_format of this DatetimeStreamSlicerAllOf. + config: The config of this DatetimeStreamSlicerAllOf. + cursor: The cursor of this DatetimeStreamSlicerAllOf [Optional]. + cursor_end: The cursor_end of this DatetimeStreamSlicerAllOf [Optional]. + start_time_option: The start_time_option of this DatetimeStreamSlicerAllOf [Optional]. + end_time_option: The end_time_option of this DatetimeStreamSlicerAllOf [Optional]. + stream_state_field_start: The stream_state_field_start of this DatetimeStreamSlicerAllOf [Optional]. + stream_state_field_end: The stream_state_field_end of this DatetimeStreamSlicerAllOf [Optional]. + lookback_window: The lookback_window of this DatetimeStreamSlicerAllOf [Optional]. + """ + + start_datetime: AnyOfMinMaxDatetimestring + end_datetime: AnyOfMinMaxDatetimestring + step: str + cursor_field: AnyOfInterpolatedStringstring + datetime_format: str + config: Dict[str, Any] + cursor: Optional[Dict[str, Any]] = None + cursor_end: Optional[Dict[str, Any]] = None + start_time_option: Optional[RequestOption] = None + end_time_option: Optional[RequestOption] = None + stream_state_field_start: Optional[str] = None + stream_state_field_end: Optional[str] = None + lookback_window: Optional[AnyOfInterpolatedStringstring] = None + +DatetimeStreamSlicerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator.py b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator.py new file mode 100644 index 000000000000..7adaafdea186 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator.py @@ -0,0 +1,48 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.declarative_oauth2_authenticator_all_of import DeclarativeOauth2AuthenticatorAllOf + + +class DeclarativeOauth2Authenticator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DeclarativeOauth2Authenticator - a model defined in OpenAPI + + token_refresh_endpoint: The token_refresh_endpoint of this DeclarativeOauth2Authenticator. + client_id: The client_id of this DeclarativeOauth2Authenticator. + client_secret: The client_secret of this DeclarativeOauth2Authenticator. + refresh_token: The refresh_token of this DeclarativeOauth2Authenticator. + config: The config of this DeclarativeOauth2Authenticator. + scopes: The scopes of this DeclarativeOauth2Authenticator [Optional]. + token_expiry_date: The token_expiry_date of this DeclarativeOauth2Authenticator [Optional]. + token_expiry_date: The token_expiry_date of this DeclarativeOauth2Authenticator [Optional]. + access_token_name: The access_token_name of this DeclarativeOauth2Authenticator [Optional]. + expires_in_name: The expires_in_name of this DeclarativeOauth2Authenticator [Optional]. + refresh_request_body: The refresh_request_body of this DeclarativeOauth2Authenticator [Optional]. + grant_type: The grant_type of this DeclarativeOauth2Authenticator [Optional]. + """ + + token_refresh_endpoint: AnyOfInterpolatedStringstring + client_id: AnyOfInterpolatedStringstring + client_secret: AnyOfInterpolatedStringstring + refresh_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + scopes: Optional[List[str]] = None + token_expiry_date: Optional[AnyOfInterpolatedStringstring] = None + token_expiry_date: Optional[object] = None + access_token_name: Optional[AnyOfInterpolatedStringstring] = None + expires_in_name: Optional[AnyOfInterpolatedStringstring] = None + refresh_request_body: Optional[Dict[str, Any]] = None + grant_type: Optional[AnyOfInterpolatedStringstring] = None + +DeclarativeOauth2Authenticator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator_all_of.py new file mode 100644 index 000000000000..4bf8137cc300 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_oauth2_authenticator_all_of.py @@ -0,0 +1,47 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class DeclarativeOauth2AuthenticatorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DeclarativeOauth2AuthenticatorAllOf - a model defined in OpenAPI + + token_refresh_endpoint: The token_refresh_endpoint of this DeclarativeOauth2AuthenticatorAllOf. + client_id: The client_id of this DeclarativeOauth2AuthenticatorAllOf. + client_secret: The client_secret of this DeclarativeOauth2AuthenticatorAllOf. + refresh_token: The refresh_token of this DeclarativeOauth2AuthenticatorAllOf. + config: The config of this DeclarativeOauth2AuthenticatorAllOf. + scopes: The scopes of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + token_expiry_date: The token_expiry_date of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + token_expiry_date: The token_expiry_date of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + access_token_name: The access_token_name of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + expires_in_name: The expires_in_name of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + refresh_request_body: The refresh_request_body of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + grant_type: The grant_type of this DeclarativeOauth2AuthenticatorAllOf [Optional]. + """ + + token_refresh_endpoint: AnyOfInterpolatedStringstring + client_id: AnyOfInterpolatedStringstring + client_secret: AnyOfInterpolatedStringstring + refresh_token: AnyOfInterpolatedStringstring + config: Dict[str, Any] + scopes: Optional[List[str]] = None + token_expiry_date: Optional[AnyOfInterpolatedStringstring] = None + token_expiry_date: Optional[object] = None + access_token_name: Optional[AnyOfInterpolatedStringstring] = None + expires_in_name: Optional[AnyOfInterpolatedStringstring] = None + refresh_request_body: Optional[Dict[str, Any]] = None + grant_type: Optional[AnyOfInterpolatedStringstring] = None + +DeclarativeOauth2AuthenticatorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/declarative_stream.py b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_stream.py new file mode 100644 index 000000000000..ebc8314360d1 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/declarative_stream.py @@ -0,0 +1,49 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_add_fields_remove_fields import AnyOfAddFieldsRemoveFields +from connector_builder.generated.models.any_of_json_file_schema_loader_default_schema_loader import AnyOfJsonFileSchemaLoaderDefaultSchemaLoader +from connector_builder.generated.models.any_ofarrayarraystring import AnyOfarrayarraystring +from connector_builder.generated.models.any_ofarraystring import AnyOfarraystring +from connector_builder.generated.models.simple_retriever import SimpleRetriever + + +class DeclarativeStream(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DeclarativeStream - a model defined in OpenAPI + + retriever: The retriever of this DeclarativeStream. + config: The config of this DeclarativeStream. + name: The name of this DeclarativeStream [Optional]. + primary_key: The primary_key of this DeclarativeStream [Optional]. + schema_loader: The schema_loader of this DeclarativeStream [Optional]. + name: The name of this DeclarativeStream [Optional]. + primary_key: The primary_key of this DeclarativeStream [Optional]. + schema_loader: The schema_loader of this DeclarativeStream [Optional]. + stream_cursor_field: The stream_cursor_field of this DeclarativeStream [Optional]. + transformations: The transformations of this DeclarativeStream [Optional]. + checkpoint_interval: The checkpoint_interval of this DeclarativeStream [Optional]. + """ + + retriever: SimpleRetriever + config: Dict[str, Any] + name: Optional[str] = None + primary_key: Optional[AnyOfarrayarraystring] = None + schema_loader: Optional[AnyOfJsonFileSchemaLoaderDefaultSchemaLoader] = None + name: Optional[str] = None + primary_key: Optional[str] = None + schema_loader: Optional[AnyOfJsonFileSchemaLoaderDefaultSchemaLoader] = None + stream_cursor_field: Optional[AnyOfarraystring] = None + transformations: Optional[List[AnyOfAddFieldsRemoveFields]] = None + checkpoint_interval: Optional[int] = None + +DeclarativeStream.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler.py new file mode 100644 index 000000000000..501a69510102 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_constant_backoff_strategy_exponential_backoff_strategy_wait_time_from_header_backoff_strategy_wait_until_time_from_header_backoff_strategy import AnyOfConstantBackoffStrategyExponentialBackoffStrategyWaitTimeFromHeaderBackoffStrategyWaitUntilTimeFromHeaderBackoffStrategy +from connector_builder.generated.models.default_error_handler_all_of import DefaultErrorHandlerAllOf +from connector_builder.generated.models.http_response_filter import HttpResponseFilter + + +class DefaultErrorHandler(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultErrorHandler - a model defined in OpenAPI + + config: The config of this DefaultErrorHandler. + response_filters: The response_filters of this DefaultErrorHandler [Optional]. + max_retries: The max_retries of this DefaultErrorHandler [Optional]. + max_retries: The max_retries of this DefaultErrorHandler [Optional]. + backoff_strategies: The backoff_strategies of this DefaultErrorHandler [Optional]. + """ + + config: Dict[str, Any] + response_filters: Optional[List[HttpResponseFilter]] = None + max_retries: Optional[int] = None + max_retries: Optional[int] = None + backoff_strategies: Optional[List[AnyOfConstantBackoffStrategyExponentialBackoffStrategyWaitTimeFromHeaderBackoffStrategyWaitUntilTimeFromHeaderBackoffStrategy]] = None + +DefaultErrorHandler.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler_all_of.py new file mode 100644 index 000000000000..2e245a68d4b9 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_error_handler_all_of.py @@ -0,0 +1,34 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_constant_backoff_strategy_exponential_backoff_strategy_wait_time_from_header_backoff_strategy_wait_until_time_from_header_backoff_strategy import AnyOfConstantBackoffStrategyExponentialBackoffStrategyWaitTimeFromHeaderBackoffStrategyWaitUntilTimeFromHeaderBackoffStrategy +from connector_builder.generated.models.http_response_filter import HttpResponseFilter + + +class DefaultErrorHandlerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultErrorHandlerAllOf - a model defined in OpenAPI + + config: The config of this DefaultErrorHandlerAllOf. + response_filters: The response_filters of this DefaultErrorHandlerAllOf [Optional]. + max_retries: The max_retries of this DefaultErrorHandlerAllOf [Optional]. + max_retries: The max_retries of this DefaultErrorHandlerAllOf [Optional]. + backoff_strategies: The backoff_strategies of this DefaultErrorHandlerAllOf [Optional]. + """ + + config: Dict[str, Any] + response_filters: Optional[List[HttpResponseFilter]] = None + max_retries: Optional[int] = None + max_retries: Optional[int] = None + backoff_strategies: Optional[List[AnyOfConstantBackoffStrategyExponentialBackoffStrategyWaitTimeFromHeaderBackoffStrategyWaitUntilTimeFromHeaderBackoffStrategy]] = None + +DefaultErrorHandlerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator.py new file mode 100644 index 000000000000..82844bb9812e --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator.py @@ -0,0 +1,42 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cursor_pagination_strategy_offset_increment_page_increment import AnyOfCursorPaginationStrategyOffsetIncrementPageIncrement +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.default_paginator_all_of import DefaultPaginatorAllOf +from connector_builder.generated.models.json_decoder import JsonDecoder +from connector_builder.generated.models.paginator import Paginator +from connector_builder.generated.models.request_option import RequestOption + + +class DefaultPaginator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultPaginator - a model defined in OpenAPI + + pagination_strategy: The pagination_strategy of this DefaultPaginator. + config: The config of this DefaultPaginator. + url_base: The url_base of this DefaultPaginator. + decoder: The decoder of this DefaultPaginator [Optional]. + token: The token of this DefaultPaginator [Optional]. + page_size_option: The page_size_option of this DefaultPaginator [Optional]. + page_token_option: The page_token_option of this DefaultPaginator [Optional]. + """ + + pagination_strategy: AnyOfCursorPaginationStrategyOffsetIncrementPageIncrement + config: Dict[str, Any] + url_base: AnyOfInterpolatedStringstring + decoder: Optional[JsonDecoder] = None + token: Optional[object] = None + page_size_option: Optional[RequestOption] = None + page_token_option: Optional[RequestOption] = None + +DefaultPaginator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator_all_of.py new file mode 100644 index 000000000000..2fe29829dd60 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_paginator_all_of.py @@ -0,0 +1,40 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cursor_pagination_strategy_offset_increment_page_increment import AnyOfCursorPaginationStrategyOffsetIncrementPageIncrement +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.json_decoder import JsonDecoder +from connector_builder.generated.models.request_option import RequestOption + + +class DefaultPaginatorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultPaginatorAllOf - a model defined in OpenAPI + + pagination_strategy: The pagination_strategy of this DefaultPaginatorAllOf. + config: The config of this DefaultPaginatorAllOf. + url_base: The url_base of this DefaultPaginatorAllOf. + decoder: The decoder of this DefaultPaginatorAllOf [Optional]. + token: The token of this DefaultPaginatorAllOf [Optional]. + page_size_option: The page_size_option of this DefaultPaginatorAllOf [Optional]. + page_token_option: The page_token_option of this DefaultPaginatorAllOf [Optional]. + """ + + pagination_strategy: AnyOfCursorPaginationStrategyOffsetIncrementPageIncrement + config: Dict[str, Any] + url_base: AnyOfInterpolatedStringstring + decoder: Optional[JsonDecoder] = None + token: Optional[object] = None + page_size_option: Optional[RequestOption] = None + page_token_option: Optional[RequestOption] = None + +DefaultPaginatorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader.py new file mode 100644 index 000000000000..e0efbfd8133f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.default_schema_loader_all_of import DefaultSchemaLoaderAllOf + + +class DefaultSchemaLoader(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultSchemaLoader - a model defined in OpenAPI + + config: The config of this DefaultSchemaLoader. + """ + + config: Dict[str, Any] + +DefaultSchemaLoader.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader_all_of.py new file mode 100644 index 000000000000..8685761cd21d --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/default_schema_loader_all_of.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class DefaultSchemaLoaderAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DefaultSchemaLoaderAllOf - a model defined in OpenAPI + + config: The config of this DefaultSchemaLoaderAllOf. + """ + + config: Dict[str, Any] + +DefaultSchemaLoaderAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor.py b/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor.py new file mode 100644 index 000000000000..75aff57ef78a --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor.py @@ -0,0 +1,31 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.dpath_extractor_all_of import DpathExtractorAllOf +from connector_builder.generated.models.json_decoder import JsonDecoder + + +class DpathExtractor(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DpathExtractor - a model defined in OpenAPI + + field_pointer: The field_pointer of this DpathExtractor. + config: The config of this DpathExtractor. + decoder: The decoder of this DpathExtractor [Optional]. + """ + + field_pointer: List[AnyOfInterpolatedStringstring] + config: Dict[str, Any] + decoder: Optional[JsonDecoder] = None + +DpathExtractor.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor_all_of.py new file mode 100644 index 000000000000..4a19bd59d387 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/dpath_extractor_all_of.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.json_decoder import JsonDecoder + + +class DpathExtractorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + DpathExtractorAllOf - a model defined in OpenAPI + + field_pointer: The field_pointer of this DpathExtractorAllOf. + config: The config of this DpathExtractorAllOf. + decoder: The decoder of this DpathExtractorAllOf [Optional]. + """ + + field_pointer: List[AnyOfInterpolatedStringstring] + config: Dict[str, Any] + decoder: Optional[JsonDecoder] = None + +DpathExtractorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy.py b/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy.py new file mode 100644 index 000000000000..66bc051df6af --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring +from connector_builder.generated.models.exponential_backoff_strategy_all_of import ExponentialBackoffStrategyAllOf + + +class ExponentialBackoffStrategy(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ExponentialBackoffStrategy - a model defined in OpenAPI + + config: The config of this ExponentialBackoffStrategy. + factor: The factor of this ExponentialBackoffStrategy [Optional]. + """ + + config: Dict[str, Any] + factor: Optional[AnyOfInterpolatedStringnumberstring] = None + +ExponentialBackoffStrategy.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy_all_of.py new file mode 100644 index 000000000000..5ce2f5a1a2b0 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/exponential_backoff_strategy_all_of.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring + + +class ExponentialBackoffStrategyAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ExponentialBackoffStrategyAllOf - a model defined in OpenAPI + + config: The config of this ExponentialBackoffStrategyAllOf. + factor: The factor of this ExponentialBackoffStrategyAllOf [Optional]. + """ + + config: Dict[str, Any] + factor: Optional[AnyOfInterpolatedStringnumberstring] = None + +ExponentialBackoffStrategyAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/http_request.py b/airbyte-connector-builder-server/connector_builder/generated/models/http_request.py index e72d94e9aaa9..5f29b9d0b7c5 100644 --- a/airbyte-connector-builder-server/connector_builder/generated/models/http_request.py +++ b/airbyte-connector-builder-server/connector_builder/generated/models/http_request.py @@ -20,11 +20,13 @@ class HttpRequest(BaseModel): parameters: The parameters of this HttpRequest [Optional]. body: The body of this HttpRequest [Optional]. headers: The headers of this HttpRequest [Optional]. + http_method: The http_method of this HttpRequest. """ url: str parameters: Optional[Dict[str, Any]] = None body: Optional[Dict[str, Any]] = None headers: Optional[Dict[str, Any]] = None + http_method: str HttpRequest.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/http_requester.py b/airbyte-connector-builder-server/connector_builder/generated/models/http_requester.py new file mode 100644 index 000000000000..a850ad85c86f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/http_requester.py @@ -0,0 +1,45 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_composite_error_handler_default_error_handler import AnyOfCompositeErrorHandlerDefaultErrorHandler +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_of_no_auth_declarative_oauth2_authenticator_api_key_authenticator_bearer_authenticator_basic_http_authenticator import AnyOfNoAuthDeclarativeOauth2AuthenticatorApiKeyAuthenticatorBearerAuthenticatorBasicHttpAuthenticator +from connector_builder.generated.models.any_ofstringstring import AnyOfstringstring +from connector_builder.generated.models.http_requester_all_of import HttpRequesterAllOf +from connector_builder.generated.models.interpolated_request_options_provider import InterpolatedRequestOptionsProvider +from connector_builder.generated.models.requester import Requester + + +class HttpRequester(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + HttpRequester - a model defined in OpenAPI + + name: The name of this HttpRequester. + url_base: The url_base of this HttpRequester. + path: The path of this HttpRequester. + config: The config of this HttpRequester. + http_method: The http_method of this HttpRequester [Optional]. + request_options_provider: The request_options_provider of this HttpRequester [Optional]. + authenticator: The authenticator of this HttpRequester [Optional]. + error_handler: The error_handler of this HttpRequester [Optional]. + """ + + name: str + url_base: AnyOfInterpolatedStringstring + path: AnyOfInterpolatedStringstring + config: Dict[str, Any] + http_method: Optional[AnyOfstringstring] = None + request_options_provider: Optional[InterpolatedRequestOptionsProvider] = None + authenticator: Optional[AnyOfNoAuthDeclarativeOauth2AuthenticatorApiKeyAuthenticatorBearerAuthenticatorBasicHttpAuthenticator] = None + error_handler: Optional[AnyOfCompositeErrorHandlerDefaultErrorHandler] = None + +HttpRequester.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/http_requester_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/http_requester_all_of.py new file mode 100644 index 000000000000..720fccba8360 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/http_requester_all_of.py @@ -0,0 +1,43 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_composite_error_handler_default_error_handler import AnyOfCompositeErrorHandlerDefaultErrorHandler +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_of_no_auth_declarative_oauth2_authenticator_api_key_authenticator_bearer_authenticator_basic_http_authenticator import AnyOfNoAuthDeclarativeOauth2AuthenticatorApiKeyAuthenticatorBearerAuthenticatorBasicHttpAuthenticator +from connector_builder.generated.models.any_ofstringstring import AnyOfstringstring +from connector_builder.generated.models.interpolated_request_options_provider import InterpolatedRequestOptionsProvider + + +class HttpRequesterAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + HttpRequesterAllOf - a model defined in OpenAPI + + name: The name of this HttpRequesterAllOf. + url_base: The url_base of this HttpRequesterAllOf. + path: The path of this HttpRequesterAllOf. + config: The config of this HttpRequesterAllOf. + http_method: The http_method of this HttpRequesterAllOf [Optional]. + request_options_provider: The request_options_provider of this HttpRequesterAllOf [Optional]. + authenticator: The authenticator of this HttpRequesterAllOf [Optional]. + error_handler: The error_handler of this HttpRequesterAllOf [Optional]. + """ + + name: str + url_base: AnyOfInterpolatedStringstring + path: AnyOfInterpolatedStringstring + config: Dict[str, Any] + http_method: Optional[AnyOfstringstring] = None + request_options_provider: Optional[InterpolatedRequestOptionsProvider] = None + authenticator: Optional[AnyOfNoAuthDeclarativeOauth2AuthenticatorApiKeyAuthenticatorBearerAuthenticatorBasicHttpAuthenticator] = None + error_handler: Optional[AnyOfCompositeErrorHandlerDefaultErrorHandler] = None + +HttpRequesterAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/http_response_filter.py b/airbyte-connector-builder-server/connector_builder/generated/models/http_response_filter.py new file mode 100644 index 000000000000..ac251b7027e2 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/http_response_filter.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_booleanstring import AnyOfInterpolatedBooleanstring +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_ofstringstring import AnyOfstringstring + + +class HttpResponseFilter(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + HttpResponseFilter - a model defined in OpenAPI + + action: The action of this HttpResponseFilter. + config: The config of this HttpResponseFilter. + http_codes: The http_codes of this HttpResponseFilter [Optional]. + error_message_contains: The error_message_contains of this HttpResponseFilter [Optional]. + predicate: The predicate of this HttpResponseFilter [Optional]. + error_message: The error_message of this HttpResponseFilter [Optional]. + """ + + action: AnyOfstringstring + config: Dict[str, Any] + http_codes: Optional[list[int]] = None + error_message_contains: Optional[str] = None + predicate: Optional[AnyOfInterpolatedBooleanstring] = None + error_message: Optional[AnyOfInterpolatedStringstring] = None + +HttpResponseFilter.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_boolean.py b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_boolean.py new file mode 100644 index 000000000000..6f12a9e05bf1 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_boolean.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class InterpolatedBoolean(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + InterpolatedBoolean - a model defined in OpenAPI + + condition: The condition of this InterpolatedBoolean. + """ + + condition: str + +InterpolatedBoolean.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider.py b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider.py new file mode 100644 index 000000000000..0a32652eac5f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider.py @@ -0,0 +1,34 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_ofmapstring import AnyOfmapstring +from connector_builder.generated.models.interpolated_request_options_provider_all_of import InterpolatedRequestOptionsProviderAllOf + + +class InterpolatedRequestOptionsProvider(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + InterpolatedRequestOptionsProvider - a model defined in OpenAPI + + config: The config of this InterpolatedRequestOptionsProvider [Optional]. + request_parameters: The request_parameters of this InterpolatedRequestOptionsProvider [Optional]. + request_headers: The request_headers of this InterpolatedRequestOptionsProvider [Optional]. + request_body_data: The request_body_data of this InterpolatedRequestOptionsProvider [Optional]. + request_body_json: The request_body_json of this InterpolatedRequestOptionsProvider [Optional]. + """ + + config: Optional[Dict[str, Any]] = None + request_parameters: Optional[AnyOfmapstring] = None + request_headers: Optional[AnyOfmapstring] = None + request_body_data: Optional[AnyOfmapstring] = None + request_body_json: Optional[AnyOfmapstring] = None + +InterpolatedRequestOptionsProvider.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider_all_of.py new file mode 100644 index 000000000000..25817c925b23 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_request_options_provider_all_of.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_ofmapstring import AnyOfmapstring + + +class InterpolatedRequestOptionsProviderAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + InterpolatedRequestOptionsProviderAllOf - a model defined in OpenAPI + + config: The config of this InterpolatedRequestOptionsProviderAllOf [Optional]. + request_parameters: The request_parameters of this InterpolatedRequestOptionsProviderAllOf [Optional]. + request_headers: The request_headers of this InterpolatedRequestOptionsProviderAllOf [Optional]. + request_body_data: The request_body_data of this InterpolatedRequestOptionsProviderAllOf [Optional]. + request_body_json: The request_body_json of this InterpolatedRequestOptionsProviderAllOf [Optional]. + """ + + config: Optional[Dict[str, Any]] = None + request_parameters: Optional[AnyOfmapstring] = None + request_headers: Optional[AnyOfmapstring] = None + request_body_data: Optional[AnyOfmapstring] = None + request_body_json: Optional[AnyOfmapstring] = None + +InterpolatedRequestOptionsProviderAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_string.py b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_string.py new file mode 100644 index 000000000000..4ecd14edefe4 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/interpolated_string.py @@ -0,0 +1,26 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class InterpolatedString(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + InterpolatedString - a model defined in OpenAPI + + string: The string of this InterpolatedString. + default: The default of this InterpolatedString [Optional]. + """ + + string: str + default: Optional[str] = None + +InterpolatedString.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/json_decoder.py b/airbyte-connector-builder-server/connector_builder/generated/models/json_decoder.py new file mode 100644 index 000000000000..c3bdc1243df6 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/json_decoder.py @@ -0,0 +1,22 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class JsonDecoder(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + JsonDecoder - a model defined in OpenAPI + + """ + + +JsonDecoder.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader.py b/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader.py new file mode 100644 index 000000000000..1ea9355a4ca4 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.json_file_schema_loader_all_of import JsonFileSchemaLoaderAllOf + + +class JsonFileSchemaLoader(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + JsonFileSchemaLoader - a model defined in OpenAPI + + config: The config of this JsonFileSchemaLoader. + file_path: The file_path of this JsonFileSchemaLoader [Optional]. + """ + + config: Dict[str, Any] + file_path: Optional[AnyOfInterpolatedStringstring] = None + +JsonFileSchemaLoader.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader_all_of.py new file mode 100644 index 000000000000..85b8c37399ea --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/json_file_schema_loader_all_of.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class JsonFileSchemaLoaderAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + JsonFileSchemaLoaderAllOf - a model defined in OpenAPI + + config: The config of this JsonFileSchemaLoaderAllOf. + file_path: The file_path of this JsonFileSchemaLoaderAllOf [Optional]. + """ + + config: Dict[str, Any] + file_path: Optional[AnyOfInterpolatedStringstring] = None + +JsonFileSchemaLoaderAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer.py b/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer.py new file mode 100644 index 000000000000..4b754b46ff89 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_ofarraystring import AnyOfarraystring +from connector_builder.generated.models.list_stream_slicer_all_of import ListStreamSlicerAllOf +from connector_builder.generated.models.request_option import RequestOption +from connector_builder.generated.models.stream_slicer import StreamSlicer + + +class ListStreamSlicer(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ListStreamSlicer - a model defined in OpenAPI + + slice_values: The slice_values of this ListStreamSlicer. + cursor_field: The cursor_field of this ListStreamSlicer. + config: The config of this ListStreamSlicer. + request_option: The request_option of this ListStreamSlicer [Optional]. + """ + + slice_values: AnyOfarraystring + cursor_field: AnyOfInterpolatedStringstring + config: Dict[str, Any] + request_option: Optional[RequestOption] = None + +ListStreamSlicer.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer_all_of.py new file mode 100644 index 000000000000..6269fe8ae05a --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/list_stream_slicer_all_of.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_ofarraystring import AnyOfarraystring +from connector_builder.generated.models.request_option import RequestOption + + +class ListStreamSlicerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ListStreamSlicerAllOf - a model defined in OpenAPI + + slice_values: The slice_values of this ListStreamSlicerAllOf. + cursor_field: The cursor_field of this ListStreamSlicerAllOf. + config: The config of this ListStreamSlicerAllOf. + request_option: The request_option of this ListStreamSlicerAllOf [Optional]. + """ + + slice_values: AnyOfarraystring + cursor_field: AnyOfInterpolatedStringstring + config: Dict[str, Any] + request_option: Optional[RequestOption] = None + +ListStreamSlicerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/min_max_datetime.py b/airbyte-connector-builder-server/connector_builder/generated/models/min_max_datetime.py new file mode 100644 index 000000000000..42dafe63ac87 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/min_max_datetime.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class MinMaxDatetime(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + MinMaxDatetime - a model defined in OpenAPI + + datetime: The datetime of this MinMaxDatetime. + datetime_format: The datetime_format of this MinMaxDatetime [Optional]. + datetime_format: The datetime_format of this MinMaxDatetime [Optional]. + min_datetime: The min_datetime of this MinMaxDatetime [Optional]. + max_datetime: The max_datetime of this MinMaxDatetime [Optional]. + """ + + datetime: AnyOfInterpolatedStringstring + datetime_format: Optional[str] = None + datetime_format: Optional[str] = None + min_datetime: Optional[AnyOfInterpolatedStringstring] = None + max_datetime: Optional[AnyOfInterpolatedStringstring] = None + +MinMaxDatetime.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/no_auth.py b/airbyte-connector-builder-server/connector_builder/generated/models/no_auth.py new file mode 100644 index 000000000000..6d5a0644d993 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/no_auth.py @@ -0,0 +1,22 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class NoAuth(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + NoAuth - a model defined in OpenAPI + + """ + + +NoAuth.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/no_pagination.py b/airbyte-connector-builder-server/connector_builder/generated/models/no_pagination.py new file mode 100644 index 000000000000..4e11771c0eea --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/no_pagination.py @@ -0,0 +1,23 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.paginator import Paginator + + +class NoPagination(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + NoPagination - a model defined in OpenAPI + + """ + + +NoPagination.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment.py b/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment.py new file mode 100644 index 000000000000..5b7d3981d205 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.offset_increment_all_of import OffsetIncrementAllOf + + +class OffsetIncrement(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + OffsetIncrement - a model defined in OpenAPI + + page_size: The page_size of this OffsetIncrement. + """ + + page_size: int + +OffsetIncrement.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment_all_of.py new file mode 100644 index 000000000000..59800a328238 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/offset_increment_all_of.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class OffsetIncrementAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + OffsetIncrementAllOf - a model defined in OpenAPI + + page_size: The page_size of this OffsetIncrementAllOf. + """ + + page_size: int + +OffsetIncrementAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/page_increment.py b/airbyte-connector-builder-server/connector_builder/generated/models/page_increment.py new file mode 100644 index 000000000000..de20840e0fa8 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/page_increment.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.page_increment_all_of import PageIncrementAllOf + + +class PageIncrement(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + PageIncrement - a model defined in OpenAPI + + page_size: The page_size of this PageIncrement. + start_from_page: The start_from_page of this PageIncrement [Optional]. + """ + + page_size: int + start_from_page: Optional[int] = None + +PageIncrement.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/page_increment_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/page_increment_all_of.py new file mode 100644 index 000000000000..6f99f310bb07 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/page_increment_all_of.py @@ -0,0 +1,26 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class PageIncrementAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + PageIncrementAllOf - a model defined in OpenAPI + + page_size: The page_size of this PageIncrementAllOf. + start_from_page: The start_from_page of this PageIncrementAllOf [Optional]. + """ + + page_size: int + start_from_page: Optional[int] = None + +PageIncrementAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/paginator.py b/airbyte-connector-builder-server/connector_builder/generated/models/paginator.py new file mode 100644 index 000000000000..f700868ef563 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/paginator.py @@ -0,0 +1,22 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class Paginator(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + Paginator - a model defined in OpenAPI + + """ + + +Paginator.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/parent_stream_config.py b/airbyte-connector-builder-server/connector_builder/generated/models/parent_stream_config.py new file mode 100644 index 000000000000..bc1cc78ed22f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/parent_stream_config.py @@ -0,0 +1,31 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.request_option import RequestOption + + +class ParentStreamConfig(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ParentStreamConfig - a model defined in OpenAPI + + stream: The stream of this ParentStreamConfig. + parent_key: The parent_key of this ParentStreamConfig. + stream_slice_field: The stream_slice_field of this ParentStreamConfig. + request_option: The request_option of this ParentStreamConfig [Optional]. + """ + + stream: object + parent_key: str + stream_slice_field: str + request_option: Optional[RequestOption] = None + +ParentStreamConfig.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/parsed_add_field_definition.py b/airbyte-connector-builder-server/connector_builder/generated/models/parsed_add_field_definition.py new file mode 100644 index 000000000000..3e05adad9791 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/parsed_add_field_definition.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.interpolated_string import InterpolatedString + + +class ParsedAddFieldDefinition(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ParsedAddFieldDefinition - a model defined in OpenAPI + + path: The path of this ParsedAddFieldDefinition. + value: The value of this ParsedAddFieldDefinition. + """ + + path: List[str] + value: InterpolatedString + +ParsedAddFieldDefinition.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/record_filter.py b/airbyte-connector-builder-server/connector_builder/generated/models/record_filter.py new file mode 100644 index 000000000000..9c60d29b7027 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/record_filter.py @@ -0,0 +1,26 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class RecordFilter(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RecordFilter - a model defined in OpenAPI + + config: The config of this RecordFilter. + condition: The condition of this RecordFilter [Optional]. + """ + + config: Dict[str, Any] + condition: Optional[str] = None + +RecordFilter.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/record_selector.py b/airbyte-connector-builder-server/connector_builder/generated/models/record_selector.py new file mode 100644 index 000000000000..7eede580f9ce --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/record_selector.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.dpath_extractor import DpathExtractor +from connector_builder.generated.models.record_filter import RecordFilter +from connector_builder.generated.models.record_selector_all_of import RecordSelectorAllOf + + +class RecordSelector(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RecordSelector - a model defined in OpenAPI + + extractor: The extractor of this RecordSelector. + record_filter: The record_filter of this RecordSelector [Optional]. + """ + + extractor: DpathExtractor + record_filter: Optional[RecordFilter] = None + +RecordSelector.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/record_selector_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/record_selector_all_of.py new file mode 100644 index 000000000000..df5621c51e75 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/record_selector_all_of.py @@ -0,0 +1,28 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.dpath_extractor import DpathExtractor +from connector_builder.generated.models.record_filter import RecordFilter + + +class RecordSelectorAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RecordSelectorAllOf - a model defined in OpenAPI + + extractor: The extractor of this RecordSelectorAllOf. + record_filter: The record_filter of this RecordSelectorAllOf [Optional]. + """ + + extractor: DpathExtractor + record_filter: Optional[RecordFilter] = None + +RecordSelectorAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields.py b/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields.py new file mode 100644 index 000000000000..8671c817fc14 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.remove_fields_all_of import RemoveFieldsAllOf + + +class RemoveFields(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RemoveFields - a model defined in OpenAPI + + field_pointers: The field_pointers of this RemoveFields. + """ + + field_pointers: List[List[str]] + +RemoveFields.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields_all_of.py new file mode 100644 index 000000000000..c8ede590cc2d --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/remove_fields_all_of.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class RemoveFieldsAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RemoveFieldsAllOf - a model defined in OpenAPI + + field_pointers: The field_pointers of this RemoveFieldsAllOf. + """ + + field_pointers: List[List[str]] + +RemoveFieldsAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/request_option.py b/airbyte-connector-builder-server/connector_builder/generated/models/request_option.py new file mode 100644 index 000000000000..e65e7b375515 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/request_option.py @@ -0,0 +1,26 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class RequestOption(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + RequestOption - a model defined in OpenAPI + + inject_into: The inject_into of this RequestOption. + field_name: The field_name of this RequestOption [Optional]. + """ + + inject_into: str + field_name: Optional[str] = None + +RequestOption.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/requester.py b/airbyte-connector-builder-server/connector_builder/generated/models/requester.py new file mode 100644 index 000000000000..5793d77c9e57 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/requester.py @@ -0,0 +1,22 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class Requester(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + Requester - a model defined in OpenAPI + + """ + + +Requester.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever.py b/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever.py new file mode 100644 index 000000000000..1e97520b2911 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever.py @@ -0,0 +1,47 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cartesian_product_stream_slicer_datetime_stream_slicer_list_stream_slicer_single_slice_substream_slicer import AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer +from connector_builder.generated.models.any_of_default_paginator_no_pagination import AnyOfDefaultPaginatorNoPagination +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_ofarrayarraystring import AnyOfarrayarraystring +from connector_builder.generated.models.http_requester import HttpRequester +from connector_builder.generated.models.record_selector import RecordSelector +from connector_builder.generated.models.simple_retriever_all_of import SimpleRetrieverAllOf + + +class SimpleRetriever(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + SimpleRetriever - a model defined in OpenAPI + + requester: The requester of this SimpleRetriever. + record_selector: The record_selector of this SimpleRetriever. + config: The config of this SimpleRetriever. + name: The name of this SimpleRetriever [Optional]. + name: The name of this SimpleRetriever [Optional]. + primary_key: The primary_key of this SimpleRetriever [Optional]. + primary_key: The primary_key of this SimpleRetriever [Optional]. + paginator: The paginator of this SimpleRetriever [Optional]. + stream_slicer: The stream_slicer of this SimpleRetriever [Optional]. + """ + + requester: HttpRequester + record_selector: RecordSelector + config: Dict[str, Any] + name: Optional[str] = None + name: Optional[AnyOfInterpolatedStringstring] = None + primary_key: Optional[AnyOfarrayarraystring] = None + primary_key: Optional[str] = None + paginator: Optional[AnyOfDefaultPaginatorNoPagination] = None + stream_slicer: Optional[AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer] = None + +SimpleRetriever.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever_all_of.py new file mode 100644 index 000000000000..447308153da8 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/simple_retriever_all_of.py @@ -0,0 +1,46 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_cartesian_product_stream_slicer_datetime_stream_slicer_list_stream_slicer_single_slice_substream_slicer import AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer +from connector_builder.generated.models.any_of_default_paginator_no_pagination import AnyOfDefaultPaginatorNoPagination +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.any_ofarrayarraystring import AnyOfarrayarraystring +from connector_builder.generated.models.http_requester import HttpRequester +from connector_builder.generated.models.record_selector import RecordSelector + + +class SimpleRetrieverAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + SimpleRetrieverAllOf - a model defined in OpenAPI + + requester: The requester of this SimpleRetrieverAllOf. + record_selector: The record_selector of this SimpleRetrieverAllOf. + config: The config of this SimpleRetrieverAllOf. + name: The name of this SimpleRetrieverAllOf [Optional]. + name: The name of this SimpleRetrieverAllOf [Optional]. + primary_key: The primary_key of this SimpleRetrieverAllOf [Optional]. + primary_key: The primary_key of this SimpleRetrieverAllOf [Optional]. + paginator: The paginator of this SimpleRetrieverAllOf [Optional]. + stream_slicer: The stream_slicer of this SimpleRetrieverAllOf [Optional]. + """ + + requester: HttpRequester + record_selector: RecordSelector + config: Dict[str, Any] + name: Optional[str] = None + name: Optional[AnyOfInterpolatedStringstring] = None + primary_key: Optional[AnyOfarrayarraystring] = None + primary_key: Optional[str] = None + paginator: Optional[AnyOfDefaultPaginatorNoPagination] = None + stream_slicer: Optional[AnyOfCartesianProductStreamSlicerDatetimeStreamSlicerListStreamSlicerSingleSliceSubstreamSlicer] = None + +SimpleRetrieverAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/single_slice.py b/airbyte-connector-builder-server/connector_builder/generated/models/single_slice.py new file mode 100644 index 000000000000..a98a77383664 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/single_slice.py @@ -0,0 +1,23 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.stream_slicer import StreamSlicer + + +class SingleSlice(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + SingleSlice - a model defined in OpenAPI + + """ + + +SingleSlice.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/stream_read_request_body.py b/airbyte-connector-builder-server/connector_builder/generated/models/stream_read_request_body.py index e57be491017d..d6f7219f1668 100644 --- a/airbyte-connector-builder-server/connector_builder/generated/models/stream_read_request_body.py +++ b/airbyte-connector-builder-server/connector_builder/generated/models/stream_read_request_body.py @@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.connector_manifest import ConnectorManifest class StreamReadRequestBody(BaseModel): @@ -22,7 +23,7 @@ class StreamReadRequestBody(BaseModel): state: The state of this StreamReadRequestBody [Optional]. """ - manifest: Dict[str, Any] + manifest: ConnectorManifest stream: str config: Dict[str, Any] state: Optional[Dict[str, Any]] = None diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/stream_slicer.py b/airbyte-connector-builder-server/connector_builder/generated/models/stream_slicer.py new file mode 100644 index 000000000000..1b76007c802f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/stream_slicer.py @@ -0,0 +1,22 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class StreamSlicer(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + StreamSlicer - a model defined in OpenAPI + + """ + + +StreamSlicer.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/streams_list_request_body.py b/airbyte-connector-builder-server/connector_builder/generated/models/streams_list_request_body.py index 1cee99805f05..10a260cc456f 100644 --- a/airbyte-connector-builder-server/connector_builder/generated/models/streams_list_request_body.py +++ b/airbyte-connector-builder-server/connector_builder/generated/models/streams_list_request_body.py @@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional # noqa: F401 from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.connector_manifest import ConnectorManifest class StreamsListRequestBody(BaseModel): @@ -20,7 +21,7 @@ class StreamsListRequestBody(BaseModel): config: The config of this StreamsListRequestBody. """ - manifest: Dict[str, Any] + manifest: ConnectorManifest config: Dict[str, Any] StreamsListRequestBody.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer.py b/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer.py new file mode 100644 index 000000000000..150d9d1536ea --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer.py @@ -0,0 +1,27 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.parent_stream_config import ParentStreamConfig +from connector_builder.generated.models.stream_slicer import StreamSlicer +from connector_builder.generated.models.substream_slicer_all_of import SubstreamSlicerAllOf + + +class SubstreamSlicer(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + SubstreamSlicer - a model defined in OpenAPI + + parent_stream_configs: The parent_stream_configs of this SubstreamSlicer. + """ + + parent_stream_configs: List[ParentStreamConfig] + +SubstreamSlicer.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer_all_of.py new file mode 100644 index 000000000000..4d377777d1a3 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/substream_slicer_all_of.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.parent_stream_config import ParentStreamConfig + + +class SubstreamSlicerAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + SubstreamSlicerAllOf - a model defined in OpenAPI + + parent_stream_configs: The parent_stream_configs of this SubstreamSlicerAllOf. + """ + + parent_stream_configs: List[ParentStreamConfig] + +SubstreamSlicerAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy.py b/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy.py new file mode 100644 index 000000000000..68b43740c6da --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.wait_time_from_header_backoff_strategy_all_of import WaitTimeFromHeaderBackoffStrategyAllOf + + +class WaitTimeFromHeaderBackoffStrategy(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + WaitTimeFromHeaderBackoffStrategy - a model defined in OpenAPI + + header: The header of this WaitTimeFromHeaderBackoffStrategy. + config: The config of this WaitTimeFromHeaderBackoffStrategy. + regex: The regex of this WaitTimeFromHeaderBackoffStrategy [Optional]. + """ + + header: AnyOfInterpolatedStringstring + config: Dict[str, Any] + regex: Optional[str] = None + +WaitTimeFromHeaderBackoffStrategy.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy_all_of.py new file mode 100644 index 000000000000..26a99724c7db --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/wait_time_from_header_backoff_strategy_all_of.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class WaitTimeFromHeaderBackoffStrategyAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + WaitTimeFromHeaderBackoffStrategyAllOf - a model defined in OpenAPI + + header: The header of this WaitTimeFromHeaderBackoffStrategyAllOf. + config: The config of this WaitTimeFromHeaderBackoffStrategyAllOf. + regex: The regex of this WaitTimeFromHeaderBackoffStrategyAllOf [Optional]. + """ + + header: AnyOfInterpolatedStringstring + config: Dict[str, Any] + regex: Optional[str] = None + +WaitTimeFromHeaderBackoffStrategyAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy.py b/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy.py new file mode 100644 index 000000000000..70a5b1167f9f --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring +from connector_builder.generated.models.wait_until_time_from_header_backoff_strategy_all_of import WaitUntilTimeFromHeaderBackoffStrategyAllOf + + +class WaitUntilTimeFromHeaderBackoffStrategy(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + WaitUntilTimeFromHeaderBackoffStrategy - a model defined in OpenAPI + + header: The header of this WaitUntilTimeFromHeaderBackoffStrategy. + config: The config of this WaitUntilTimeFromHeaderBackoffStrategy. + min_wait: The min_wait of this WaitUntilTimeFromHeaderBackoffStrategy [Optional]. + regex: The regex of this WaitUntilTimeFromHeaderBackoffStrategy [Optional]. + """ + + header: AnyOfInterpolatedStringstring + config: Dict[str, Any] + min_wait: Optional[AnyOfInterpolatedStringnumberstring] = None + regex: Optional[AnyOfInterpolatedStringstring] = None + +WaitUntilTimeFromHeaderBackoffStrategy.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy_all_of.py b/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy_all_of.py new file mode 100644 index 000000000000..636cad582c88 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/wait_until_time_from_header_backoff_strategy_all_of.py @@ -0,0 +1,32 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 +from connector_builder.generated.models.any_of_interpolated_stringnumberstring import AnyOfInterpolatedStringnumberstring +from connector_builder.generated.models.any_of_interpolated_stringstring import AnyOfInterpolatedStringstring + + +class WaitUntilTimeFromHeaderBackoffStrategyAllOf(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + WaitUntilTimeFromHeaderBackoffStrategyAllOf - a model defined in OpenAPI + + header: The header of this WaitUntilTimeFromHeaderBackoffStrategyAllOf. + config: The config of this WaitUntilTimeFromHeaderBackoffStrategyAllOf. + min_wait: The min_wait of this WaitUntilTimeFromHeaderBackoffStrategyAllOf [Optional]. + regex: The regex of this WaitUntilTimeFromHeaderBackoffStrategyAllOf [Optional]. + """ + + header: AnyOfInterpolatedStringstring + config: Dict[str, Any] + min_wait: Optional[AnyOfInterpolatedStringnumberstring] = None + regex: Optional[AnyOfInterpolatedStringstring] = None + +WaitUntilTimeFromHeaderBackoffStrategyAllOf.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/impl/default_api.py b/airbyte-connector-builder-server/connector_builder/impl/default_api.py index 4a46c87834ee..4516dc79791b 100644 --- a/airbyte-connector-builder-server/connector_builder/impl/default_api.py +++ b/airbyte-connector-builder-server/connector_builder/impl/default_api.py @@ -177,7 +177,13 @@ def _create_request_from_log_message(self, log_message: AirbyteLogMessage) -> Op url = urlparse(request.get("url", "")) full_path = f"{url.scheme}://{url.hostname}{url.path}" if url else "" parameters = parse_qs(url.query) or None - return HttpRequest(url=full_path, headers=request.get("headers"), parameters=parameters, body=request.get("body")) + return HttpRequest( + url=full_path, + http_method=request.get("http_method", ""), + headers=request.get("headers"), + parameters=parameters, + body=request.get("body"), + ) except JSONDecodeError as error: self.logger.warning(f"Failed to parse log message into request object with error: {error}") return None diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index 3f1110204603..f8efbba6c10b 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -14,7 +14,7 @@ setup( name="connector-builder-server", - version="0.40.23", + version="0.40.24", description="", long_description=README, author="Airbyte", diff --git a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml index 97ae958a7ba3..c24f0a04bcb5 100644 --- a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml +++ b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml @@ -83,7 +83,6 @@ components: description: The LOG AirbyteMessages that were emitted during the read of this slice items: type: object - # $ref: "#/components/schemas/AirbyteProtocol/definitions/AirbyteLogMessage" slices: type: array description: The stream slices returned from the read command. If no stream slicer is configured, this should contain a single item containing all of the results. @@ -105,7 +104,6 @@ components: description: The RECORD AirbyteMessages coming from the read operation for this page items: type: object - # $ref: "#/components/schemas/AirbyteProtocol/definitions/AirbyteRecordMessage" request: $ref: "#/components/schemas/HttpRequest" response: @@ -122,7 +120,6 @@ components: state: type: object description: The STATE AirbyteMessage emitted at the end of this slice. This can be omitted if a stream slicer is not configured. - # $ref: "#/components/schemas/AirbyteProtocol/definitions/AirbyteStateMessage" StreamReadRequestBody: type: object required: @@ -131,9 +128,7 @@ components: - config properties: manifest: - type: object - description: The config-based connector manifest contents - # $ref: "#/components/schemas/ConnectorManifest" + $ref: "#/components/schemas/ConnectorManifest" stream: type: string description: Name of the stream to read @@ -143,7 +138,6 @@ components: state: type: object description: The AirbyteStateMessage object to use as the starting state for this read - # $ref: "#/components/schemas/AirbyteProtocol/definitions/AirbyteStateMessage" # --- Potential addition for a later phase --- # numPages: # type: integer @@ -153,6 +147,7 @@ components: type: object required: - url + - http_method properties: url: type: string @@ -166,6 +161,10 @@ components: headers: type: object description: The headers of the HTTP request, if any + http_method: + type: string + enum: ["GET", "POST", "PUT", "PATCH"] + description: The http method of the request ("GET", "POST", "PUT", or "PATCH") HttpResponse: type: object required: @@ -180,11 +179,8 @@ components: headers: type: object description: The headers of the HTTP response, if any - # --- Commenting out for now since they do not work with our orval openapi client generator --- - # ConnectorManifest: - # $ref: ../../../../airbyte-cdk/python/airbyte_cdk/sources/declarative/config_component_schema.json - # AirbyteProtocol: - # $ref: ../../../../airbyte-protocol/protocol-models/src/main/resources/airbyte_protocol/airbyte_protocol.yaml + ConnectorManifest: + $ref: ../../../../airbyte-cdk/python/airbyte_cdk/sources/declarative/config_component_schema.json StreamsListRequestBody: type: object required: @@ -192,9 +188,7 @@ components: - config properties: manifest: - type: object - description: The config-based connector manifest contents - # $ref: "#/components/schemas/ConnectorManifest" + $ref: "#/components/schemas/ConnectorManifest" config: type: object description: The config blob containing the user inputs for testing diff --git a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py index 1520ba893df2..c92497cc0cae 100644 --- a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py +++ b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py @@ -386,25 +386,27 @@ def test_read_stream_returns_error_if_stream_does_not_exist(): "log_message, expected_request", [ pytest.param( - 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "headers": {"field": "name"}, "body":{"key": "value"}}', + 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "http_method": "PUT", "headers": {"field": "name"}, "body":{"key": "value"}}', HttpRequest( - url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, headers={"field": "name"}, body={"key": "value"} + url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, headers={"field": "name"}, body={"key": "value"}, + http_method="PUT", ), id="test_create_request_with_all_fields", ), pytest.param( - 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "headers": {"field": "name"}}', - HttpRequest(url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, headers={"field": "name"}), + 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "http_method": "GET", "headers": {"field": "name"}}', + HttpRequest(url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, headers={"field": "name"}, + http_method="GET"), id="test_create_request_with_no_body", ), pytest.param( - 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "body":{"key": "value"}}', - HttpRequest(url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, body={"key": "value"}), + 'request:{"url": "https://nichirin.com/v1/swords?color=orange", "http_method": "PUT", "body":{"key": "value"}}', + HttpRequest(url="https://nichirin.com/v1/swords", parameters={"color": ["orange"]}, body={"key": "value"}, http_method="PUT"), id="test_create_request_with_no_headers", ), pytest.param( - 'request:{"url": "https://nichirin.com/v1/swords", "headers": {"field": "name"}, "body":{"key": "value"}}', - HttpRequest(url="https://nichirin.com/v1/swords", headers={"field": "name"}, body={"key": "value"}), + 'request:{"url": "https://nichirin.com/v1/swords", "http_method": "PUT", "headers": {"field": "name"}, "body":{"key": "value"}}', + HttpRequest(url="https://nichirin.com/v1/swords", headers={"field": "name"}, body={"key": "value"}, http_method="PUT"), id="test_create_request_with_no_parameters", ), pytest.param("request:{invalid_json: }", None, id="test_invalid_json_still_does_not_crash"), diff --git a/airbyte-container-orchestrator/Dockerfile b/airbyte-container-orchestrator/Dockerfile index c52a1b2693e5..c0653fc9dde6 100644 --- a/airbyte-container-orchestrator/Dockerfile +++ b/airbyte-container-orchestrator/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-container-orchestrator ENV VERSION=${VERSION} diff --git a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/DbtJobOrchestrator.java b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/DbtJobOrchestrator.java index d5cd4f89b3a0..f7e2bd177b69 100644 --- a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/DbtJobOrchestrator.java +++ b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/DbtJobOrchestrator.java @@ -18,7 +18,7 @@ import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.general.DbtTransformationRunner; import io.airbyte.workers.general.DbtTransformationWorker; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; +import io.airbyte.workers.normalization.DefaultNormalizationRunner; import io.airbyte.workers.process.KubePodProcess; import io.airbyte.workers.process.ProcessFactory; import io.airbyte.workers.sync.ReplicationLauncherWorker; @@ -77,11 +77,10 @@ public Optional runJob() throws Exception { Math.toIntExact(jobRunConfig.getAttemptId()), workerConfigs.getResourceRequirements(), new DbtTransformationRunner( - processFactory, NormalizationRunnerFactory.create( - destinationLauncherConfig.getDockerImage(), + processFactory, new DefaultNormalizationRunner( processFactory, - NormalizationRunnerFactory.NORMALIZATION_VERSION, - destinationLauncherConfig.getNormalizationDockerImage()))); + destinationLauncherConfig.getNormalizationDockerImage(), + destinationLauncherConfig.getIntegrationType()))); log.info("Running dbt worker..."); final Path jobRoot = TemporalUtils.getJobRoot(configs.getWorkspaceRoot(), diff --git a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/NormalizationJobOrchestrator.java b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/NormalizationJobOrchestrator.java index aec91a39b78b..cb6c2f26102f 100644 --- a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/NormalizationJobOrchestrator.java +++ b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/NormalizationJobOrchestrator.java @@ -18,7 +18,7 @@ import io.airbyte.persistence.job.models.IntegrationLauncherConfig; import io.airbyte.persistence.job.models.JobRunConfig; import io.airbyte.workers.general.DefaultNormalizationWorker; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; +import io.airbyte.workers.normalization.DefaultNormalizationRunner; import io.airbyte.workers.normalization.NormalizationWorker; import io.airbyte.workers.process.KubePodProcess; import io.airbyte.workers.process.ProcessFactory; @@ -70,11 +70,10 @@ public Optional runJob() throws Exception { final NormalizationWorker normalizationWorker = new DefaultNormalizationWorker( jobRunConfig.getJobId(), Math.toIntExact(jobRunConfig.getAttemptId()), - NormalizationRunnerFactory.create( - destinationLauncherConfig.getDockerImage(), + new DefaultNormalizationRunner( processFactory, - NormalizationRunnerFactory.NORMALIZATION_VERSION, - destinationLauncherConfig.getNormalizationDockerImage()), + destinationLauncherConfig.getNormalizationDockerImage(), + destinationLauncherConfig.getIntegrationType()), configs.getWorkerEnvironment()); log.info("Running normalization worker..."); diff --git a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java index bc04e8232633..114052263ca4 100644 --- a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java +++ b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java @@ -96,19 +96,24 @@ public Optional runJob() throws Exception { final var destinationLauncherConfig = JobOrchestrator.readAndDeserializeFile( Path.of(KubePodProcess.CONFIG_DIR, ReplicationLauncherWorker.INIT_FILE_DESTINATION_LAUNCHER_CONFIG), IntegrationLauncherConfig.class); + log.info("sourceLauncherConfig is: " + sourceLauncherConfig.toString()); ApmTraceUtils.addTagsToTrace( Map.of(JOB_ID_KEY, jobRunConfig.getJobId(), DESTINATION_DOCKER_IMAGE_KEY, destinationLauncherConfig.getDockerImage(), SOURCE_DOCKER_IMAGE_KEY, sourceLauncherConfig.getDockerImage())); + // At this moment, if either source or destination is from custom connector image, we will put all + // jobs into isolated pool to run. + boolean useIsolatedPool = sourceLauncherConfig.getIsCustomConnector() || destinationLauncherConfig.getIsCustomConnector(); log.info("Setting up source launcher..."); final var sourceLauncher = new AirbyteIntegrationLauncher( sourceLauncherConfig.getJobId(), Math.toIntExact(sourceLauncherConfig.getAttemptId()), sourceLauncherConfig.getDockerImage(), processFactory, - syncInput.getSourceResourceRequirements()); + syncInput.getSourceResourceRequirements(), + useIsolatedPool); log.info("Setting up destination launcher..."); final var destinationLauncher = new AirbyteIntegrationLauncher( @@ -116,7 +121,8 @@ public Optional runJob() throws Exception { Math.toIntExact(destinationLauncherConfig.getAttemptId()), destinationLauncherConfig.getDockerImage(), processFactory, - syncInput.getDestinationResourceRequirements()); + syncInput.getDestinationResourceRequirements(), + useIsolatedPool); log.info("Setting up source..."); // reset jobs use an empty source to induce resetting all data in destination. diff --git a/airbyte-cron/Dockerfile b/airbyte-cron/Dockerfile index c26f9f22b48b..e470d32da236 100644 --- a/airbyte-cron/Dockerfile +++ b/airbyte-cron/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS cron -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-cron ENV VERSION ${VERSION} diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_001__AddFieldSelectionDataToConnections.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_001__AddFieldSelectionDataToConnections.java new file mode 100644 index 000000000000..ce4b483c11db --- /dev/null +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_001__AddFieldSelectionDataToConnections.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.db.instance.configs.migrations; + +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.jooq.DSLContext; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class V0_40_23_001__AddFieldSelectionDataToConnections extends BaseJavaMigration { + + private static final Logger LOGGER = LoggerFactory.getLogger(V0_40_23_001__AddFieldSelectionDataToConnections.class); + + @Override + public void migrate(final Context context) throws Exception { + LOGGER.info("Running migration: {}", this.getClass().getSimpleName()); + + // Warning: please do not use any jOOQ generated code to write a migration. + // As database schema changes, the generated jOOQ code can be deprecated. So + // old migration may not compile if there is any generated code. + final DSLContext ctx = DSL.using(context.getConnection()); + addFieldSelectionData(ctx); + } + + private static void addFieldSelectionData(final DSLContext ctx) { + ctx.alterTable("connection") + .addColumnIfNotExists(DSL.field("field_selection_data", SQLDataType.JSONB.nullable(true))) + .execute(); + } + +} diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_002__AddIntegrationTypeToActorDefinition.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_002__AddIntegrationTypeToActorDefinition.java new file mode 100644 index 000000000000..4d168177ead2 --- /dev/null +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_23_002__AddIntegrationTypeToActorDefinition.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.db.instance.configs.migrations; + +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.jooq.DSLContext; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// TODO: update migration description in the class name +public class V0_40_23_002__AddIntegrationTypeToActorDefinition extends BaseJavaMigration { + + private static final Logger LOGGER = LoggerFactory.getLogger( + V0_40_23_002__AddIntegrationTypeToActorDefinition.class); + + @Override + public void migrate(final Context context) throws Exception { + LOGGER.info("Running migration: {}", this.getClass().getSimpleName()); + final DSLContext ctx = DSL.using(context.getConnection()); + addIntegrationTypeColumn(ctx); + } + + static void addIntegrationTypeColumn(final DSLContext ctx) { + ctx.alterTable("actor_definition") + .addColumnIfNotExists(DSL.field( + "integration_type", + SQLDataType.VARCHAR(255).nullable(true))) + .execute(); + } + +} diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/jobs/migrations/V0_35_40_001__MigrateFailureReasonEnumValues.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/jobs/migrations/V0_35_40_001__MigrateFailureReasonEnumValues.java index 88ea9b915919..6e4890275916 100644 --- a/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/jobs/migrations/V0_35_40_001__MigrateFailureReasonEnumValues.java +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/jobs/migrations/V0_35_40_001__MigrateFailureReasonEnumValues.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import org.flywaydb.core.api.migration.BaseJavaMigration; import org.flywaydb.core.api.migration.Context; import org.jooq.DSLContext; @@ -322,14 +323,14 @@ public boolean equals(final Object other) { return false; } final FailureReasonForMigration rhs = ((FailureReasonForMigration) other); - return (((((((((this.retryable == rhs.retryable) || ((this.retryable != null) && this.retryable.equals(rhs.retryable))) - && ((this.metadata == rhs.metadata) || ((this.metadata != null) && this.metadata.equals(rhs.metadata)))) - && ((this.stacktrace == rhs.stacktrace) || ((this.stacktrace != null) && this.stacktrace.equals(rhs.stacktrace)))) - && ((this.failureOrigin == rhs.failureOrigin) || ((this.failureOrigin != null) && this.failureOrigin.equals(rhs.failureOrigin)))) - && ((this.failureType == rhs.failureType) || ((this.failureType != null) && this.failureType.equals(rhs.failureType)))) - && ((this.internalMessage == rhs.internalMessage) || ((this.internalMessage != null) && this.internalMessage.equals(rhs.internalMessage)))) - && ((this.externalMessage == rhs.externalMessage) || ((this.externalMessage != null) && this.externalMessage.equals(rhs.externalMessage)))) - && ((this.timestamp == rhs.timestamp) || ((this.timestamp != null) && this.timestamp.equals(rhs.timestamp)))); + return ((((((((Objects.equals(this.retryable, rhs.retryable)) + && (Objects.equals(this.metadata, rhs.metadata))) + && (Objects.equals(this.stacktrace, rhs.stacktrace))) + && (Objects.equals(this.failureOrigin, rhs.failureOrigin))) + && (Objects.equals(this.failureType, rhs.failureType))) + && (Objects.equals(this.internalMessage, rhs.internalMessage))) + && (Objects.equals(this.externalMessage, rhs.externalMessage))) + && (Objects.equals(this.timestamp, rhs.timestamp))); } } diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcSourceOperations.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcSourceOperations.java index 5950da239a6a..2c38b91b679c 100644 --- a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcSourceOperations.java +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcSourceOperations.java @@ -55,6 +55,7 @@ public void setJsonField(final ResultSet resultSet, final int colIndex, final Ob case DATE -> putDate(json, columnName, resultSet, colIndex); case TIME -> putTime(json, columnName, resultSet, colIndex); case TIMESTAMP -> putTimestamp(json, columnName, resultSet, colIndex); + case TIMESTAMP_WITH_TIMEZONE -> putTimestampWithTimezone(json, columnName, resultSet, colIndex); case BLOB, BINARY, VARBINARY, LONGVARBINARY -> putBinary(json, columnName, resultSet, colIndex); case ARRAY -> putArray(json, columnName, resultSet, colIndex); default -> putDefault(json, columnName, resultSet, colIndex); @@ -103,7 +104,7 @@ public JDBCType getFieldType(final JsonNode field) { } @Override - public boolean isCursorType(JDBCType type) { + public boolean isCursorType(final JDBCType type) { return ALLOWED_CURSOR_TYPES.contains(type); } diff --git a/airbyte-db/db-lib/src/main/resources/configs_database/normalized_tables_schema.txt b/airbyte-db/db-lib/src/main/resources/configs_database/normalized_tables_schema.txt index fa9c708d43d9..c4b9a68f331a 100644 --- a/airbyte-db/db-lib/src/main/resources/configs_database/normalized_tables_schema.txt +++ b/airbyte-db/db-lib/src/main/resources/configs_database/normalized_tables_schema.txt @@ -91,6 +91,7 @@ Referenced by: normalization_repository | character varying(255) | | | normalization_tag | character varying(255) | | | supports_dbt | boolean | | | + integration_type | character varying(255) | | | Indexes: "actor_definition_pkey" PRIMARY KEY, btree (id) Referenced by: diff --git a/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt b/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt index 33298d85df3b..473d5999b054 100644 --- a/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt +++ b/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt @@ -57,6 +57,7 @@ create table "public"."actor_definition"( "normalization_repository" varchar(255) null, "normalization_tag" varchar(255) null, "supports_dbt" bool null, + "integration_type" varchar(255) null, constraint "actor_definition_pkey" primary key ("id") ); @@ -112,6 +113,7 @@ create table "public"."connection"( "non_breaking_change_preference" varchar(7) not null default '''ignore''::character varying', "breaking_change" bool not null default false, "unsupported_protocol_version" bool not null default false, + "field_selection_data" jsonb null, constraint "connection_pkey" primary key ("id") ); diff --git a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/IntegrationRunner.java b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/IntegrationRunner.java index 0ea6ec7f2ea7..cda5830460e1 100644 --- a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/IntegrationRunner.java +++ b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/IntegrationRunner.java @@ -9,14 +9,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import io.airbyte.commons.exceptions.ConfigErrorException; -import io.airbyte.commons.exceptions.ConnectionErrorException; import io.airbyte.commons.io.IOs; import io.airbyte.commons.json.Jsons; import io.airbyte.commons.lang.Exceptions.Procedure; import io.airbyte.commons.string.Strings; import io.airbyte.commons.util.AutoCloseableIterator; -import io.airbyte.integrations.base.errors.messages.ErrorMessage; +import io.airbyte.integrations.util.ConnectorExceptionUtil; import io.airbyte.protocol.models.AirbyteConnectionStatus; import io.airbyte.protocol.models.AirbyteMessage; import io.airbyte.protocol.models.AirbyteMessage.Type; @@ -157,11 +155,11 @@ private void runInternal(final IntegrationConfig parsed) throws Exception { // to // find the root exception that corresponds to a configuration error. If that does not exist, we // just return the original exception. - final Throwable rootThrowable = getRootConfigError(e); - final String displayMessage = getDisplayMessage(rootThrowable); + final Throwable rootThrowable = ConnectorExceptionUtil.getRootConfigError(e); + final String displayMessage = ConnectorExceptionUtil.getDisplayMessage(rootThrowable); // If the source connector throws a config error, a trace message with the relevant message should // be surfaced. - if (isConfigError(rootThrowable)) { + if (ConnectorExceptionUtil.isConfigError(rootThrowable)) { AirbyteTraceMessageUtility.emitConfigErrorTrace(e, displayMessage); } if (parsed.getCommand().equals(Command.CHECK)) { @@ -184,37 +182,6 @@ private void runInternal(final IntegrationConfig parsed) throws Exception { LOGGER.info("Completed integration: {}", integration.getClass().getName()); } - /** - * Returns the first instance of an exception associated with a configuration error (if it exists). - * Otherwise, the original exception is returned. - */ - private Throwable getRootConfigError(final Exception e) { - Throwable current = e; - while (current != null) { - if (isConfigError(current)) { - return current; - } else { - current = current.getCause(); - } - } - return e; - } - - private boolean isConfigError(final Throwable e) { - return e instanceof ConfigErrorException || e instanceof ConnectionErrorException; - } - - private String getDisplayMessage(final Throwable e) { - if (e instanceof ConfigErrorException) { - return ((ConfigErrorException) e).getDisplayMessage(); - } else if (e instanceof ConnectionErrorException) { - final ConnectionErrorException connEx = (ConnectionErrorException) e; - return ErrorMessage.getErrorMessage(connEx.getStateCode(), connEx.getErrorCode(), connEx.getExceptionMessage(), connEx); - } else { - return "Could not connect with provided configuration. Error: " + e.getMessage() != null ? e.getMessage() : ""; - } - } - private void produceMessages(final AutoCloseableIterator messageIterator) throws Exception { watchForOrphanThreads( () -> messageIterator.forEachRemaining(outputRecordCollector), diff --git a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java new file mode 100644 index 000000000000..a87e85b3c92e --- /dev/null +++ b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.integrations.util; + +import io.airbyte.commons.exceptions.ConfigErrorException; +import io.airbyte.commons.exceptions.ConnectionErrorException; +import io.airbyte.integrations.base.errors.messages.ErrorMessage; +import java.sql.SQLException; +import java.util.List; +import java.util.Locale; +import java.util.function.Predicate; + +/** + * Utility class defining methods for handling configuration exceptions in connectors. + */ +public class ConnectorExceptionUtil { + + public static final String COMMON_EXCEPTION_MESSAGE_TEMPLATE = "Could not connect with provided configuration. Error: %s"; + static final String RECOVERY_CONNECTION_ERROR_MESSAGE = + "We're having issues syncing from a Postgres replica that is configured as a hot standby server. " + + "Please see https://docs.airbyte.com/integrations/sources/postgres/#sync-data-from-postgres-hot-standby-server for options and workarounds"; + private static final List> configErrorPredicates = + List.of(getConfigErrorPredicate(), getConnectionErrorPredicate(), isRecoveryConnectionExceptionPredicate()); + + public static boolean isConfigError(final Throwable e) { + return configErrorPredicates.stream().anyMatch(predicate -> predicate.test(e)); + } + + public static String getDisplayMessage(final Throwable e) { + if (e instanceof ConfigErrorException) { + return ((ConfigErrorException) e).getDisplayMessage(); + } else if (e instanceof ConnectionErrorException) { + final ConnectionErrorException connEx = (ConnectionErrorException) e; + return ErrorMessage.getErrorMessage(connEx.getStateCode(), connEx.getErrorCode(), connEx.getExceptionMessage(), connEx); + } else if (isRecoveryConnectionExceptionPredicate().test(e)) { + return RECOVERY_CONNECTION_ERROR_MESSAGE; + } else { + return String.format(COMMON_EXCEPTION_MESSAGE_TEMPLATE, e.getMessage() != null ? e.getMessage() : ""); + } + } + + /** + * Returns the first instance of an exception associated with a configuration error (if it exists). + * Otherwise, the original exception is returned. + */ + public static Throwable getRootConfigError(final Exception e) { + Throwable current = e; + while (current != null) { + if (ConnectorExceptionUtil.isConfigError(current)) { + return current; + } else { + current = current.getCause(); + } + } + return e; + } + + private static Predicate getConfigErrorPredicate() { + return e -> e instanceof ConfigErrorException; + } + + private static Predicate getConnectionErrorPredicate() { + return e -> e instanceof ConnectionErrorException; + } + + private static Predicate isRecoveryConnectionExceptionPredicate() { + return e -> e instanceof SQLException && e.getMessage() + .toLowerCase(Locale.ROOT) + .contains("due to conflict with recovery"); + } + +} diff --git a/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/base/IntegrationRunnerTest.java b/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/base/IntegrationRunnerTest.java index 5b9bd4cb183f..eb00200a72f6 100644 --- a/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/base/IntegrationRunnerTest.java +++ b/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/base/IntegrationRunnerTest.java @@ -4,6 +4,7 @@ package io.airbyte.integrations.base; +import static io.airbyte.integrations.util.ConnectorExceptionUtil.COMMON_EXCEPTION_MESSAGE_TEMPLATE; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.catchThrowable; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -269,7 +270,8 @@ void testCheckNestedException() throws Exception { @Test void testCheckRuntimeException() throws Exception { final IntegrationConfig intConfig = IntegrationConfig.check(configPath); - final AirbyteConnectionStatus output = new AirbyteConnectionStatus().withStatus(Status.FAILED).withMessage("Runtime Error"); + final AirbyteConnectionStatus output = + new AirbyteConnectionStatus().withStatus(Status.FAILED).withMessage(String.format(COMMON_EXCEPTION_MESSAGE_TEMPLATE, "Runtime Error")); final RuntimeException runtimeException = new RuntimeException("Runtime Error"); when(cliParser.parse(ARGS)).thenReturn(intConfig); diff --git a/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/util/ConnectorExceptionUtilTest.java b/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/util/ConnectorExceptionUtilTest.java new file mode 100644 index 000000000000..2b040478b585 --- /dev/null +++ b/airbyte-integrations/bases/base-java/src/test/java/io/airbyte/integrations/util/ConnectorExceptionUtilTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.integrations.util; + +import static io.airbyte.integrations.util.ConnectorExceptionUtil.COMMON_EXCEPTION_MESSAGE_TEMPLATE; +import static io.airbyte.integrations.util.ConnectorExceptionUtil.RECOVERY_CONNECTION_ERROR_MESSAGE; +import static org.junit.jupiter.api.Assertions.*; + +import io.airbyte.commons.exceptions.ConfigErrorException; +import io.airbyte.commons.exceptions.ConnectionErrorException; +import java.sql.SQLException; +import org.junit.jupiter.api.Test; + +class ConnectorExceptionUtilTest { + + public static final String CONFIG_EXCEPTION_MESSAGE = "test message"; + public static final String RECOVERY_EXCEPTION_MESSAGE = "FATAL: terminating connection due to conflict with recovery"; + public static final String COMMON_EXCEPTION_MESSAGE = "something happens with connection"; + public static final String CONNECTION_ERROR_MESSAGE_TEMPLATE = "State code: %s; Error code: %s; Message: %s"; + + @Test() + void isConfigErrorForConfigException() { + ConfigErrorException configErrorException = new ConfigErrorException(CONFIG_EXCEPTION_MESSAGE); + assertTrue(ConnectorExceptionUtil.isConfigError(configErrorException)); + + } + + @Test + void isConfigErrorForConnectionException() { + ConnectionErrorException connectionErrorException = new ConnectionErrorException(CONFIG_EXCEPTION_MESSAGE); + assertTrue(ConnectorExceptionUtil.isConfigError(connectionErrorException)); + } + + @Test + void isConfigErrorForRecoveryPSQLException() { + SQLException recoveryPSQLException = new SQLException(RECOVERY_EXCEPTION_MESSAGE); + assertTrue(ConnectorExceptionUtil.isConfigError(recoveryPSQLException)); + } + + @Test + void isConfigErrorForCommonSQLException() { + SQLException recoveryPSQLException = new SQLException(COMMON_EXCEPTION_MESSAGE); + assertFalse(ConnectorExceptionUtil.isConfigError(recoveryPSQLException)); + } + + @Test + void isConfigErrorForCommonException() { + assertFalse(ConnectorExceptionUtil.isConfigError(new Exception())); + } + + @Test + void getDisplayMessageForConfigException() { + ConfigErrorException configErrorException = new ConfigErrorException(CONFIG_EXCEPTION_MESSAGE); + String actualDisplayMessage = ConnectorExceptionUtil.getDisplayMessage(configErrorException); + assertEquals(CONFIG_EXCEPTION_MESSAGE, actualDisplayMessage); + } + + @Test + void getDisplayMessageForConnectionError() { + String testCode = "test code"; + int errorCode = -1; + ConnectionErrorException connectionErrorException = new ConnectionErrorException(testCode, errorCode, CONFIG_EXCEPTION_MESSAGE, new Exception()); + String actualDisplayMessage = ConnectorExceptionUtil.getDisplayMessage(connectionErrorException); + assertEquals(String.format(CONNECTION_ERROR_MESSAGE_TEMPLATE, testCode, errorCode, CONFIG_EXCEPTION_MESSAGE), actualDisplayMessage); + } + + @Test + void getDisplayMessageForRecoveryException() { + SQLException recoveryException = new SQLException(RECOVERY_EXCEPTION_MESSAGE); + String actualDisplayMessage = ConnectorExceptionUtil.getDisplayMessage(recoveryException); + assertEquals(RECOVERY_CONNECTION_ERROR_MESSAGE, actualDisplayMessage); + } + + @Test + void getDisplayMessageForCommonException() { + Exception exception = new SQLException(COMMON_EXCEPTION_MESSAGE); + String actualDisplayMessage = ConnectorExceptionUtil.getDisplayMessage(exception); + assertEquals(String.format(COMMON_EXCEPTION_MESSAGE_TEMPLATE, COMMON_EXCEPTION_MESSAGE), actualDisplayMessage); + } + + @Test + void getRootConfigErrorFromConfigException() { + ConfigErrorException configErrorException = new ConfigErrorException(CONFIG_EXCEPTION_MESSAGE); + Exception exception = new Exception(COMMON_EXCEPTION_MESSAGE, configErrorException); + + Throwable actualRootConfigError = ConnectorExceptionUtil.getRootConfigError(exception); + assertEquals(configErrorException, actualRootConfigError); + } + + @Test + void getRootConfigErrorFromRecoverySQLException() { + SQLException recoveryException = new SQLException(RECOVERY_EXCEPTION_MESSAGE); + RuntimeException runtimeException = new RuntimeException(COMMON_EXCEPTION_MESSAGE, recoveryException); + Exception exception = new Exception(runtimeException); + + Throwable actualRootConfigError = ConnectorExceptionUtil.getRootConfigError(exception); + assertEquals(recoveryException, actualRootConfigError); + } + + @Test + void getRootConfigErrorFromNonConfigException() { + SQLException configErrorException = new SQLException(CONFIG_EXCEPTION_MESSAGE); + Exception exception = new Exception(COMMON_EXCEPTION_MESSAGE, configErrorException); + + Throwable actualRootConfigError = ConnectorExceptionUtil.getRootConfigError(exception); + assertEquals(exception, actualRootConfigError); + } + +} diff --git a/airbyte-integrations/bases/base-normalization/Dockerfile b/airbyte-integrations/bases/base-normalization/Dockerfile index c30c4e43478f..71cbb2f88b6e 100644 --- a/airbyte-integrations/bases/base-normalization/Dockerfile +++ b/airbyte-integrations/bases/base-normalization/Dockerfile @@ -28,5 +28,5 @@ WORKDIR /airbyte ENV AIRBYTE_ENTRYPOINT "/airbyte/entrypoint.sh" ENTRYPOINT ["/airbyte/entrypoint.sh"] -LABEL io.airbyte.version=0.2.24 +LABEL io.airbyte.version=0.2.25 LABEL io.airbyte.name=airbyte/normalization diff --git a/airbyte-integrations/bases/base-normalization/clickhouse.Dockerfile b/airbyte-integrations/bases/base-normalization/clickhouse.Dockerfile index b69479a95f0b..d4f4eb5091fd 100644 --- a/airbyte-integrations/bases/base-normalization/clickhouse.Dockerfile +++ b/airbyte-integrations/bases/base-normalization/clickhouse.Dockerfile @@ -1,4 +1,4 @@ -FROM fishtownanalytics/dbt:1.0.0 +FROM ghcr.io/dbt-labs/dbt-core:1.3.1 COPY --from=airbyte/base-airbyte-protocol-python:0.1.1 /airbyte /airbyte # Install SSH Tunneling dependencies @@ -20,7 +20,7 @@ WORKDIR /airbyte/normalization_code RUN pip install . WORKDIR /airbyte/normalization_code/dbt-template/ -RUN pip install dbt-clickhouse==1.1.8 +RUN pip install "dbt-clickhouse>=1.3.1" # Download external dbt dependencies RUN dbt deps diff --git a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md index 017634fd619b..c678e58b9e87 100644 --- a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md +++ b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.2.22 +Capture control messages to store and use updated configurations. [#19979](https://github.com/airbytehq/airbyte/pull/19979). + ## 0.2.21 Optionally disable discovered catalog caching. [#19806](https://github.com/airbytehq/airbyte/pull/19806). diff --git a/airbyte-integrations/bases/source-acceptance-test/Dockerfile b/airbyte-integrations/bases/source-acceptance-test/Dockerfile index d1f803f6eca8..e7a3eff1bcd4 100644 --- a/airbyte-integrations/bases/source-acceptance-test/Dockerfile +++ b/airbyte-integrations/bases/source-acceptance-test/Dockerfile @@ -33,7 +33,7 @@ COPY pytest.ini setup.py ./ COPY source_acceptance_test ./source_acceptance_test RUN pip install . -LABEL io.airbyte.version=0.2.21 +LABEL io.airbyte.version=0.2.22 LABEL io.airbyte.name=airbyte/source-acceptance-test ENTRYPOINT ["python", "-m", "pytest", "-p", "source_acceptance_test.plugin", "-r", "fEsx"] diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/conftest.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/conftest.py index 0696b55e134c..60333371b81d 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/conftest.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/conftest.py @@ -7,6 +7,7 @@ import json import logging import os +from glob import glob from logging import Logger from pathlib import Path from subprocess import STDOUT, check_output, run @@ -55,8 +56,19 @@ def cache_discovered_catalog_fixture(acceptance_test_config: Config) -> bool: @pytest.fixture(name="connector_config_path") def connector_config_path_fixture(inputs, base_path) -> Path: - """Fixture with connector's config path""" - return Path(base_path) / getattr(inputs, "config_path") + """Fixture with connector's config path. The path to the latest updated configurations will be returned if any.""" + original_configuration_path = Path(base_path) / getattr(inputs, "config_path") + updated_configurations_glob = f"{original_configuration_path.parent}/updated_configurations/{original_configuration_path.stem}|**{original_configuration_path.suffix}" + existing_configurations_path_creation_time = [ + (config_file_path, os.path.getctime(config_file_path)) for config_file_path in glob(updated_configurations_glob) + ] + if existing_configurations_path_creation_time: + existing_configurations_path_creation_time.sort(key=lambda x: x[1]) + most_recent_configuration_path = existing_configurations_path_creation_time[-1][0] + else: + most_recent_configuration_path = original_configuration_path + logging.info(f"Using {most_recent_configuration_path} as configuration. It is the most recent version.") + return Path(most_recent_configuration_path) @pytest.fixture(name="invalid_connector_config_path") @@ -127,8 +139,8 @@ def connector_spec_fixture(connector_spec_path) -> ConnectorSpecification: @pytest.fixture(name="docker_runner") -def docker_runner_fixture(image_tag, tmp_path) -> ConnectorRunner: - return ConnectorRunner(image_tag, volume=tmp_path) +def docker_runner_fixture(image_tag, tmp_path, connector_config_path) -> ConnectorRunner: + return ConnectorRunner(image_tag, volume=tmp_path, connector_configuration_path=connector_config_path) @pytest.fixture(name="previous_connector_image_name") diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py index 0d7aa48045a3..006c3a534013 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py @@ -9,14 +9,15 @@ from typing import Iterable, List, Mapping, Optional import docker -from airbyte_cdk.models import AirbyteMessage, ConfiguredAirbyteCatalog +from airbyte_cdk.models import AirbyteMessage, ConfiguredAirbyteCatalog, OrchestratorType +from airbyte_cdk.models import Type as AirbyteMessageType from docker.errors import ContainerError, NotFound from docker.models.containers import Container from pydantic import ValidationError class ConnectorRunner: - def __init__(self, image_name: str, volume: Path): + def __init__(self, image_name: str, volume: Path, connector_configuration_path: Optional[Path] = None): self._client = docker.from_env() try: self._image = self._client.images.get(image_name) @@ -26,6 +27,7 @@ def __init__(self, image_name: str, volume: Path): print("Pulling completed") self._runs = 0 self._volume_base = volume + self._connector_configuration_path = connector_configuration_path @property def output_folder(self) -> Path: @@ -93,6 +95,7 @@ def call_read_with_state(self, config, catalog, state, **kwargs) -> List[Airbyte return output def run(self, cmd, config=None, state=None, catalog=None, raise_container_error: bool = True, **kwargs) -> Iterable[AirbyteMessage]: + self._runs += 1 volumes = self._prepare_volumes(config, state, catalog) logging.debug(f"Docker run {self._image}: \n{cmd}\n" f"input: {self.input_folder}\noutput: {self.output_folder}") @@ -109,7 +112,15 @@ def run(self, cmd, config=None, state=None, catalog=None, raise_container_error: for line in self.read(container, command=cmd, with_ext=raise_container_error): f.write(line.encode()) try: - yield AirbyteMessage.parse_raw(line) + airbyte_message = AirbyteMessage.parse_raw(line) + if ( + airbyte_message.type is AirbyteMessageType.CONTROL + and airbyte_message.control.type is OrchestratorType.CONNECTOR_CONFIG + ): + self._persist_new_configuration( + airbyte_message.control.connectorConfig.config, int(airbyte_message.control.emitted_at) + ) + yield airbyte_message except ValidationError as exc: logging.warning("Unable to parse connector's output %s, error: %s", line, exc) @@ -168,3 +179,37 @@ def env_variables(self): @property def entry_point(self): return self._image.attrs["Config"]["Entrypoint"] + + def _persist_new_configuration(self, new_configuration: dict, configuration_emitted_at: int) -> Optional[Path]: + """Store new configuration values to an updated_configurations subdir under the original configuration path. + N.B. The new configuration will not be stored if no configuration path was passed to the ConnectorRunner. + Args: + new_configuration (dict): The updated configuration + configuration_emitted_at (int): Timestamp at which the configuration was emitted (ms) + + Returns: + Optional[Path]: The updated configuration path if it was persisted. + """ + if self._connector_configuration_path is None: + logging.warning("No configuration path was passed to the ConnectorRunner. The new configuration was not persisted") + return None + + with open(self._connector_configuration_path) as old_configuration_file: + old_configuration = json.load(old_configuration_file) + + if new_configuration != old_configuration: + file_prefix = self._connector_configuration_path.stem.split("|")[0] + if "/updated_configurations/" not in str(self._connector_configuration_path): + Path(self._connector_configuration_path.parent / "updated_configurations").mkdir(exist_ok=True) + new_configuration_file_path = Path( + f"{self._connector_configuration_path.parent}/updated_configurations/{file_prefix}|{configuration_emitted_at}{self._connector_configuration_path.suffix}" + ) + else: + new_configuration_file_path = Path( + f"{self._connector_configuration_path.parent}/{file_prefix}|{configuration_emitted_at}{self._connector_configuration_path.suffix}" + ) + + with open(new_configuration_file_path, "w") as new_configuration_file: + json.dump(new_configuration, new_configuration_file) + logging.info(f"Stored most recent configuration value to {new_configuration_file_path}") + return new_configuration_file_path diff --git a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_container_runner.py b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_container_runner.py new file mode 100644 index 000000000000..eee26a3763d0 --- /dev/null +++ b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_container_runner.py @@ -0,0 +1,91 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +import json + +import pytest +from airbyte_cdk.models import ( + AirbyteControlConnectorConfigMessage, + AirbyteControlMessage, + AirbyteMessage, + AirbyteRecordMessage, + OrchestratorType, +) +from airbyte_cdk.models import Type as AirbyteMessageType +from source_acceptance_test.utils import connector_runner + + +class TestContainerRunner: + def test_run_call_persist_configuration(self, mocker, tmp_path): + old_configuration_path = tmp_path / "config.json" + new_configuration = {"field_a": "new_value_a"} + mocker.patch.object(connector_runner, "docker") + records_reads = [ + AirbyteMessage( + type=AirbyteMessageType.RECORD, record=AirbyteRecordMessage(stream="test_stream", data={"foo": "bar"}, emitted_at=1.0) + ).json(exclude_unset=False), + AirbyteMessage( + type=AirbyteMessageType.CONTROL, + control=AirbyteControlMessage( + type=OrchestratorType.CONNECTOR_CONFIG, + emitted_at=1.0, + connectorConfig=AirbyteControlConnectorConfigMessage(config=new_configuration), + ), + ).json(exclude_unset=False), + ] + mocker.patch.object(connector_runner.ConnectorRunner, "read", mocker.Mock(return_value=records_reads)) + mocker.patch.object(connector_runner.ConnectorRunner, "_persist_new_configuration") + + runner = connector_runner.ConnectorRunner("source-test:dev", tmp_path, connector_configuration_path=old_configuration_path) + list(runner.run("dummy_cmd")) + runner._persist_new_configuration.assert_called_once_with(new_configuration, 1) + + @pytest.mark.parametrize( + "pass_configuration_path, old_configuration, new_configuration, new_configuration_emitted_at, expect_new_configuration", + [ + pytest.param( + True, + {"field_a": "value_a"}, + {"field_a": "value_a"}, + 1, + False, + id="Config unchanged: No new configuration persisted", + ), + pytest.param( + True, {"field_a": "value_a"}, {"field_a": "new_value_a"}, 1, True, id="Config changed: New configuration persisted" + ), + pytest.param( + False, + {"field_a": "value_a"}, + {"field_a": "new_value_a"}, + 1, + False, + id="Config changed but persistence is disable: New configuration not persisted", + ), + ], + ) + def test_persist_new_configuration( + self, + mocker, + tmp_path, + pass_configuration_path, + old_configuration, + new_configuration, + new_configuration_emitted_at, + expect_new_configuration, + ): + if pass_configuration_path: + old_configuration_path = tmp_path / "config.json" + with open(old_configuration_path, "w") as old_configuration_file: + json.dump(old_configuration, old_configuration_file) + else: + old_configuration_path = None + mocker.patch.object(connector_runner, "docker") + runner = connector_runner.ConnectorRunner("source-test:dev", tmp_path, old_configuration_path) + new_configuration_path = runner._persist_new_configuration(new_configuration, new_configuration_emitted_at) + if not expect_new_configuration: + assert new_configuration_path is None + else: + assert new_configuration_path == tmp_path / "updated_configurations" / f"config|{new_configuration_emitted_at}.json" diff --git a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_global_fixtures.py b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_global_fixtures.py index 9b1ecf07ab5f..7420c193bd4c 100644 --- a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_global_fixtures.py +++ b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_global_fixtures.py @@ -179,3 +179,23 @@ def test_configured_catalog_fixture(mocker, configured_catalog_path): else: assert configured_catalog == conftest.build_configured_catalog_from_discovered_catalog_and_empty_streams.return_value conftest.build_configured_catalog_from_discovered_catalog_and_empty_streams.assert_called_once_with(mock_discovered_catalog, set()) + + +@pytest.mark.parametrize( + "updated_configurations", [[], ["config|created_last.json"], ["config|created_first.json", "config|created_last.json"]] +) +def test_connector_config_path_fixture(mocker, tmp_path, updated_configurations): + inputs = mocker.Mock(config_path="config.json") + base_path = tmp_path + if updated_configurations: + updated_configurations_dir = tmp_path / "updated_configurations" + updated_configurations_dir.mkdir() + for configuration_file_name in updated_configurations: + updated_configuration_path = updated_configurations_dir / configuration_file_name + updated_configuration_path.touch() + + connector_config_path = conftest.connector_config_path_fixture.__wrapped__(inputs, base_path) + if not updated_configurations: + assert connector_config_path == base_path / "config.json" + else: + assert connector_config_path == base_path / "updated_configurations" / "config|created_last.json" diff --git a/airbyte-integrations/bases/standard-destination-test/build.gradle b/airbyte-integrations/bases/standard-destination-test/build.gradle index d69a666b31fa..7b73aa3d1da7 100644 --- a/airbyte-integrations/bases/standard-destination-test/build.gradle +++ b/airbyte-integrations/bases/standard-destination-test/build.gradle @@ -5,6 +5,9 @@ dependencies { implementation project(':airbyte-db:db-lib') implementation project(':airbyte-commons-worker') implementation project(':airbyte-config:config-models') + implementation project(':airbyte-config:config-persistence') + implementation project(':airbyte-config:init') + implementation project(':airbyte-json-validation') implementation project(':airbyte-integrations:bases:base-java') implementation project(':airbyte-protocol:protocol-models') implementation project(':airbyte-commons-worker') diff --git a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java index 4e077a96eadd..99429b629d4b 100644 --- a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java +++ b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java @@ -30,7 +30,9 @@ import io.airbyte.config.StandardCheckConnectionInput; import io.airbyte.config.StandardCheckConnectionOutput; import io.airbyte.config.StandardCheckConnectionOutput.Status; +import io.airbyte.config.StandardDestinationDefinition; import io.airbyte.config.WorkerDestinationConfig; +import io.airbyte.config.init.LocalDefinitionsProvider; import io.airbyte.integrations.destination.NamingConventionTransformer; import io.airbyte.integrations.standardtest.destination.argproviders.DataArgumentsProvider; import io.airbyte.integrations.standardtest.destination.argproviders.DataTypeTestArgumentProvider; @@ -57,8 +59,8 @@ import io.airbyte.workers.helper.EntrypointEnvChecker; import io.airbyte.workers.internal.AirbyteDestination; import io.airbyte.workers.internal.DefaultAirbyteDestination; +import io.airbyte.workers.normalization.DefaultNormalizationRunner; import io.airbyte.workers.normalization.NormalizationRunner; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; import io.airbyte.workers.process.AirbyteIntegrationLauncher; import io.airbyte.workers.process.DockerProcessFactory; import io.airbyte.workers.process.ProcessFactory; @@ -72,6 +74,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Random; import java.util.UUID; @@ -121,6 +124,28 @@ public abstract class DestinationAcceptanceTest { */ protected abstract String getImageName(); + private String getImageNameWithoutTag() { + return getImageName().contains(":") ? getImageName().split(":")[0] : getImageName(); + } + + private Optional getOptionalDestinationDefinitionFromProvider(final String imageNameWithoutTag) { + try { + LocalDefinitionsProvider provider = new LocalDefinitionsProvider(LocalDefinitionsProvider.DEFAULT_SEED_DEFINITION_RESOURCE_CLASS); + return provider.getDestinationDefinitions().stream() + .filter(definition -> imageNameWithoutTag.equalsIgnoreCase(definition.getDockerRepository())) + .findFirst(); + } catch (IOException e) { + return Optional.empty(); + } + } + + protected String getNormalizationImageName() { + return getOptionalDestinationDefinitionFromProvider(getImageNameWithoutTag()) + .map(standardDestinationDefinition -> standardDestinationDefinition.getNormalizationRepository() + ":" + + NORMALIZATION_VERSION) + .orElse(null); + } + /** * Configuration specific to the integration. Will be passed to integration where appropriate in * each test. Should be valid. @@ -200,24 +225,24 @@ protected boolean implementsAppend() throws WorkerException { } } - protected boolean normalizationFromSpec() throws Exception { - final ConnectorSpecification spec = runSpec(); - assertNotNull(spec); - if (spec.getSupportsNormalization() != null) { - return spec.getSupportsNormalization(); - } else { - return false; - } + protected boolean normalizationFromDefinition() { + return getOptionalDestinationDefinitionFromProvider(getImageNameWithoutTag()) + .map(standardDestinationDefinition -> Objects.nonNull(standardDestinationDefinition.getNormalizationRepository()) + && Objects.nonNull(standardDestinationDefinition.getNormalizationTag())) + .orElse(false); } - protected boolean dbtFromSpec() throws WorkerException { - final ConnectorSpecification spec = runSpec(); - assertNotNull(spec); - if (spec.getSupportsDBT() != null) { - return spec.getSupportsDBT(); - } else { - return false; - } + protected boolean dbtFromDefinition() { + return getOptionalDestinationDefinitionFromProvider(getImageNameWithoutTag()) + .map(standardDestinationDefinition -> Objects.nonNull(standardDestinationDefinition.getSupportsDbt()) + && standardDestinationDefinition.getSupportsDbt()) + .orElse(false); + } + + protected String getIntegrationType() { + return getOptionalDestinationDefinitionFromProvider(getImageNameWithoutTag()) + .map(StandardDestinationDefinition::getIntegrationType) + .orElse(null); } /** @@ -278,7 +303,7 @@ protected boolean implementsRecordSizeLimitChecks() { * Same idea as {@link #retrieveRecords(TestDestinationEnv, String, String, JsonNode)}. Except this * method should pull records from the table that contains the normalized records and convert them * back into the data as it would appear in an {@link AirbyteRecordMessage}. Only need to override - * this method if {@link #normalizationFromSpec} returns true. + * this method if {@link #normalizationFromDefinition} returns true. * * @param testEnv - information about the test environment. * @param streamName - name of the stream for which we are retrieving records. @@ -537,23 +562,26 @@ public void testLineBreakCharacters() throws Exception { @Test public void specNormalizationValueShouldBeCorrect() throws Exception { - final boolean normalizationFromSpec = normalizationFromSpec(); - assertEquals(normalizationFromSpec, supportsNormalization()); - if (normalizationFromSpec) { + final boolean normalizationFromDefinition = normalizationFromDefinition(); + assertEquals(normalizationFromDefinition, supportsNormalization()); + if (normalizationFromDefinition) { boolean normalizationRunnerFactorySupportsDestinationImage; try { - NormalizationRunnerFactory.create(getImageName(), processFactory, NORMALIZATION_VERSION, ""); + new DefaultNormalizationRunner( + processFactory, + getNormalizationImageName(), + getIntegrationType()); normalizationRunnerFactorySupportsDestinationImage = true; } catch (final IllegalStateException e) { normalizationRunnerFactorySupportsDestinationImage = false; } - assertEquals(normalizationFromSpec, normalizationRunnerFactorySupportsDestinationImage); + assertEquals(normalizationFromDefinition, normalizationRunnerFactorySupportsDestinationImage); } } @Test - public void specDBTValueShouldBeCorrect() throws WorkerException { - assertEquals(dbtFromSpec(), supportsDBT()); + public void specDBTValueShouldBeCorrect() { + assertEquals(dbtFromDefinition(), supportsDBT()); } /** @@ -622,7 +650,7 @@ public void testIncrementalSync() throws Exception { @ArgumentsSource(DataArgumentsProvider.class) public void testSyncWithNormalization(final String messagesFilename, final String catalogFilename) throws Exception { - if (!normalizationFromSpec()) { + if (!normalizationFromDefinition()) { return; } @@ -829,7 +857,7 @@ protected int getMaxRecordValueLimit() { @Test public void testCustomDbtTransformations() throws Exception { - if (!dbtFromSpec()) { + if (!dbtFromDefinition()) { return; } @@ -845,10 +873,10 @@ public void testCustomDbtTransformations() throws Exception { // 'profiles.yml' // (we don't actually rely on normalization running anything else here though) final DbtTransformationRunner runner = new DbtTransformationRunner(processFactory, - NormalizationRunnerFactory.create( - getImageName(), + new DefaultNormalizationRunner( processFactory, - NORMALIZATION_VERSION, "")); + getNormalizationImageName(), + getIntegrationType())); runner.start(); final Path transformationRoot = Files.createDirectories(jobRoot.resolve("transform")); final OperatorDbt dbtConfig = new OperatorDbt() @@ -861,9 +889,7 @@ public void testCustomDbtTransformations() throws Exception { // TODO once we're on DBT 1.x, switch this back to using the main branch .withGitRepoUrl("https://github.com/airbytehq/jaffle_shop.git") .withGitRepoBranch("pre_dbt_upgrade") - .withDockerImage( - NormalizationRunnerFactory.getNormalizationInfoForConnector(getImageName()).getLeft() - + ":" + NORMALIZATION_VERSION); + .withDockerImage(getNormalizationImageName()); // // jaffle_shop is a fictional ecommerce store maintained by fishtownanalytics/dbt. // @@ -913,7 +939,7 @@ public void testCustomDbtTransformations() throws Exception { @Test void testCustomDbtTransformationsFailure() throws Exception { - if (!normalizationFromSpec() || !dbtFromSpec()) { + if (!normalizationFromDefinition() || !dbtFromDefinition()) { // we require normalization implementation for this destination, because we make sure to install // required dbt dependency in the normalization docker image in order to run this test successfully // (we don't actually rely on normalization running anything here though) @@ -923,10 +949,10 @@ void testCustomDbtTransformationsFailure() throws Exception { final JsonNode config = getConfig(); final DbtTransformationRunner runner = new DbtTransformationRunner(processFactory, - NormalizationRunnerFactory.create( - getImageName(), + new DefaultNormalizationRunner( processFactory, - NORMALIZATION_VERSION, "")); + getNormalizationImageName(), + getIntegrationType())); runner.start(); final Path transformationRoot = Files.createDirectories(jobRoot.resolve("transform")); final OperatorDbt dbtConfig = new OperatorDbt() @@ -1169,13 +1195,13 @@ protected void assertNamespaceNormalization(final String testCaseId, private ConnectorSpecification runSpec() throws WorkerException { return new DefaultGetSpecWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null)) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false)) .run(new JobGetSpecConfig().withDockerImage(getImageName()), jobRoot).getSpec(); } protected StandardCheckConnectionOutput runCheck(final JsonNode config) throws WorkerException { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null)) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false)) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot) .getCheckConnection(); } @@ -1184,7 +1210,7 @@ protected StandardCheckConnectionOutput.Status runCheckWithCatchedException( final JsonNode config) { try { final StandardCheckConnectionOutput standardCheckConnectionOutput = new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null)) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false)) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot) .getCheckConnection(); return standardCheckConnectionOutput.getStatus(); @@ -1196,7 +1222,7 @@ protected StandardCheckConnectionOutput.Status runCheckWithCatchedException( protected AirbyteDestination getDestination() { return new DefaultAirbyteDestination( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null)); + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false)); } protected void runSyncAndVerifyStateOutput(final JsonNode config, @@ -1270,10 +1296,10 @@ private List runSync( return destinationOutput; } - final NormalizationRunner runner = NormalizationRunnerFactory.create( - getImageName(), + final NormalizationRunner runner = new DefaultNormalizationRunner( processFactory, - NORMALIZATION_VERSION, ""); + getNormalizationImageName(), + getIntegrationType()); runner.start(); final Path normalizationRoot = Files.createDirectories(jobRoot.resolve("normalize")); if (!runner.normalize(JOB_ID, JOB_ATTEMPT, normalizationRoot, diff --git a/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java b/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java index 26d786fa784e..0a7013c97ea2 100644 --- a/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java +++ b/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java @@ -125,6 +125,7 @@ public void setUpInternal() throws Exception { jobRoot = Files.createDirectories(Path.of(workspaceRoot.toString(), "job")); localRoot = Files.createTempDirectory(testDir, "output"); environment = new TestDestinationEnv(localRoot); + setupEnvironment(environment); workerConfigs = new WorkerConfigs(new EnvConfigs()); mConfigRepository = mock(ConfigRepository.class); processFactory = new DockerProcessFactory( @@ -134,9 +135,15 @@ public void setUpInternal() throws Exception { localRoot.toString(), "host"); - setupEnvironment(environment); + postSetup(); } + /** + * Override this method if you want to do any per-test setup that depends on being able to e.g. + * {@link #runRead(ConfiguredAirbyteCatalog)}. + */ + protected void postSetup() throws Exception {} + @AfterEach public void tearDownInternal() throws Exception { tearDown(environment); @@ -144,26 +151,26 @@ public void tearDownInternal() throws Exception { protected ConnectorSpecification runSpec() throws WorkerException { return new DefaultGetSpecWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements())) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false)) .run(new JobGetSpecConfig().withDockerImage(getImageName()), jobRoot).getSpec(); } protected StandardCheckConnectionOutput runCheck() throws Exception { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements())) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false)) .run(new StandardCheckConnectionInput().withConnectionConfiguration(getConfig()), jobRoot).getCheckConnection(); } protected String runCheckAndGetStatusAsString(final JsonNode config) throws Exception { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements())) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false)) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot).getCheckConnection().getStatus().toString(); } protected UUID runDiscover() throws Exception { final UUID toReturn = new DefaultDiscoverCatalogWorker( mConfigRepository, - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements())) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false)) .run(new StandardDiscoverCatalogInput().withSourceId(SOURCE_ID.toString()).withConnectionConfiguration(getConfig()), jobRoot) .getDiscoverCatalogId(); verify(mConfigRepository).writeActorCatalogFetchEvent(lastPersistedCatalog.capture(), any(), any(), any()); @@ -194,7 +201,7 @@ protected List runRead(final ConfiguredAirbyteCatalog catalog, f .withCatalog(catalog); final AirbyteSource source = new DefaultAirbyteSource( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements())); + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false)); final List messages = new ArrayList<>(); source.start(sourceConfig, jobRoot); while (!source.isFinished()) { @@ -244,8 +251,8 @@ protected ResourceRequirements prepareResourceRequirements(final Map", "api_key": "", "secret_key": "", "start_date": "2021-05-25T00:00:00Z" diff --git a/airbyte-integrations/connectors/source-amplitude/integration_tests/sample_config.json b/airbyte-integrations/connectors/source-amplitude/integration_tests/sample_config.json index 629cbd8815f6..1e9e4864d6cc 100644 --- a/airbyte-integrations/connectors/source-amplitude/integration_tests/sample_config.json +++ b/airbyte-integrations/connectors/source-amplitude/integration_tests/sample_config.json @@ -1,4 +1,5 @@ { + "data_region": "", "api_key": "", "secret_key": "", "start_date": "2021-05-25T00:00:00Z" diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py b/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py index 24356e221ae5..89289c795ec6 100644 --- a/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py +++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py @@ -21,10 +21,17 @@ class AmplitudeStream(HttpStream, ABC): - - url_base = "https://amplitude.com/api/" api_version = 2 + def __init__(self, data_region: str, **kwargs): + self.data_region = data_region + super().__init__(**kwargs) + + @property + def url_base(self) -> str: + subdomain = "analytics.eu." if self.data_region == "EU Residency Server" else "" + return f"https://{subdomain}amplitude.com/api/" + def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: return None diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py b/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py index 39315fadbb83..bf43ac7dc947 100644 --- a/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py +++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py @@ -26,7 +26,7 @@ def _convert_auth_to_token(self, username: str, password: str) -> str: def check_connection(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> Tuple[bool, any]: try: auth = TokenAuthenticator(token=self._convert_auth_to_token(config["api_key"], config["secret_key"]), auth_method="Basic") - list(Cohorts(authenticator=auth).read_records(SyncMode.full_refresh)) + list(Cohorts(authenticator=auth, data_region=config["data_region"]).read_records(SyncMode.full_refresh)) return True, None except Exception as error: return False, f"Unable to connect to Amplitude API with the provided credentials - {repr(error)}" @@ -52,9 +52,9 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: auth = TokenAuthenticator(token=self._convert_auth_to_token(config["api_key"], config["secret_key"]), auth_method="Basic") return [ - Cohorts(authenticator=auth), - Annotations(authenticator=auth), - Events(authenticator=auth, start_date=config["start_date"]), - ActiveUsers(authenticator=auth, start_date=config["start_date"]), - AverageSessionLength(authenticator=auth, start_date=config["start_date"]), + Cohorts(authenticator=auth, data_region=config["data_region"]), + Annotations(authenticator=auth, data_region=config["data_region"]), + Events(authenticator=auth, start_date=config["start_date"], data_region=config["data_region"]), + ActiveUsers(authenticator=auth, start_date=config["start_date"], data_region=config["data_region"]), + AverageSessionLength(authenticator=auth, start_date=config["start_date"], data_region=config["data_region"]), ] diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/spec.json b/airbyte-integrations/connectors/source-amplitude/source_amplitude/spec.json index dde8d92de7ad..3ea2f5a60f18 100644 --- a/airbyte-integrations/connectors/source-amplitude/source_amplitude/spec.json +++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/spec.json @@ -4,9 +4,16 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Amplitude Spec", "type": "object", - "required": ["api_key", "secret_key", "start_date"], + "required": ["data_region", "api_key", "secret_key", "start_date"], "additionalProperties": true, "properties": { + "data_region": { + "type": "string", + "title": "Data region", + "description": "Amplitude data region server", + "enum": ["Standard Server", "EU Residency Server"], + "default": "Standard Server" + }, "api_key": { "type": "string", "title": "API Key", diff --git a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py index 8568dcbd66c6..1f781aa95a94 100644 --- a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py +++ b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py @@ -24,7 +24,7 @@ class TestFullRefreshStreams: ids=["Cohorts", "Annotations"], ) def test_parse_response(self, requests_mock, stream_cls, data, expected): - stream = stream_cls() + stream = stream_cls(data_region="Standard Server") url = f"{stream.url_base}{stream.path()}" data = {stream.data_field: data} requests_mock.get(url, json=data) @@ -40,7 +40,7 @@ def test_parse_response(self, requests_mock, stream_cls, data, expected): ids=["Cohorts", "Annotations"], ) def test_next_page_token(self, requests_mock, stream_cls, expected): - stream = stream_cls() + stream = stream_cls(data_region="Standard Server") url = f"{stream.url_base}{stream.path()}" requests_mock.get(url, json={}) response = requests.get(url) @@ -55,7 +55,7 @@ def test_next_page_token(self, requests_mock, stream_cls, expected): ids=["Cohorts", "Annotations"], ) def test_path(self, stream_cls, expected): - stream = stream_cls() + stream = stream_cls(data_region="Standard Server") assert stream.path() == expected @@ -111,7 +111,7 @@ class TestIncrementalStreams: ids=["ActiveUsers", "EmptyActiveUsers", "AverageSessionLength", "EmptyAverageSessionLength"], ) def test_parse_response(self, requests_mock, stream_cls, data, expected): - stream = stream_cls("2021-01-01T00:00:00Z") + stream = stream_cls("2021-01-01T00:00:00Z", data_region="Standard Server") url = f"{stream.url_base}{stream.path()}" data = {stream.data_field: data} requests_mock.get(url, json=data) @@ -129,7 +129,7 @@ def test_parse_response(self, requests_mock, stream_cls, data, expected): ids=["ActiveUsers", "AverageSessionLength", "Events"], ) def test_path(self, stream_cls, expected): - stream = stream_cls(pendulum.now().isoformat()) + stream = stream_cls(pendulum.now().isoformat(), data_region="Standard Server") assert stream.path() == expected @pytest.mark.parametrize( @@ -142,7 +142,7 @@ def test_path(self, stream_cls, expected): ) def test_request_params(self, stream_cls, expected): now = pendulum.now() - stream = stream_cls(now.isoformat()) + stream = stream_cls(now.isoformat(), data_region="Standard Server") # update expected with valid start,end dates expected.update(**{"start": now.strftime(stream.date_template), "end": stream._get_end_date(now).strftime(stream.date_template)}) assert stream.request_params({}) == expected @@ -157,7 +157,7 @@ def test_request_params(self, stream_cls, expected): ) def test_next_page_token(self, requests_mock, stream_cls, expected): days_ago = pendulum.now().subtract(days=2) - stream = stream_cls(days_ago.isoformat()) + stream = stream_cls(days_ago.isoformat(), data_region="Standard Server") start = days_ago.strftime(stream.date_template) end = pendulum.yesterday().strftime(stream.date_template) url = f"{stream.url_base}{stream.path()}?start={start}&end={end}" @@ -181,7 +181,7 @@ def test_next_page_token(self, requests_mock, stream_cls, expected): def test_get_end_date(self, stream_cls, expected): now = pendulum.now() yesterday = pendulum.yesterday() - stream = stream_cls(yesterday.isoformat()) + stream = stream_cls(yesterday.isoformat(), data_region="Standard Server") # update expected with test values. expected = now.strftime(stream.date_template) assert stream._get_end_date(yesterday).strftime(stream.date_template) == expected @@ -189,13 +189,13 @@ def test_get_end_date(self, stream_cls, expected): class TestEventsStream: def test_parse_zip(self): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") expected = [{"id": 123}] result = list(stream._parse_zip_file("unit_tests/api_data/zipped.json")) assert expected == result def test_stream_slices(self): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") now = pendulum.now() expected = [ { @@ -206,20 +206,20 @@ def test_stream_slices(self): assert expected == stream.stream_slices() def test_request_params(self): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") now = pendulum.now().subtract(hours=6) slice = {"start": now.strftime(stream.date_template), "end": stream._get_end_date(now).strftime(stream.date_template)} assert slice == stream.request_params(slice) def test_get_updated_state(self): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") current_state = {"event_time": ""} latest_record = {"event_time": "2021-05-27 11:59:53.710000"} result = stream.get_updated_state(current_state, latest_record) assert result == latest_record def test_get_date_time_items_from_schema(self): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") expected = [ "server_received_time", "event_time", @@ -241,6 +241,6 @@ def test_get_date_time_items_from_schema(self): ids=["empty_record", "transformed_record"], ) def test_date_time_to_rfc3339(self, record, expected): - stream = Events(pendulum.now().isoformat()) + stream = Events(pendulum.now().isoformat(), data_region="Standard Server") result = stream._date_time_to_rfc3339(record) assert result == expected diff --git a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_errors.py b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_errors.py index b249e4148fd3..98cb0c2c0db2 100755 --- a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_errors.py +++ b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_errors.py @@ -14,7 +14,7 @@ def __init__(self, status_code): def test_incremental_http_error_handler(mocker): - stream = Events(start_date="2021-01-01T00:00:00Z") + stream = Events(start_date="2021-01-01T00:00:00Z", data_region="Standard Server") stream_slice = stream.stream_slices()[0] mock_response = MockRequest(404) diff --git a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_source.py b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_source.py index 0c8347b3291a..a8ca5bac2f9d 100644 --- a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_source.py @@ -12,7 +12,12 @@ from source_amplitude import SourceAmplitude from source_amplitude.api import ActiveUsers, Annotations, AverageSessionLength, Cohorts, Events -TEST_CONFIG: dict = {"api_key": "test_api_key", "secret_key": "test_secret_key", "start_date": "2022-05-01T00:00:00Z"} +TEST_CONFIG: dict = { + "data_region": "test_data_region", + "api_key": "test_api_key", + "secret_key": "test_secret_key", + "start_date": "2022-05-01T00:00:00Z" +} TEST_INSTANCE: SourceAmplitude = SourceAmplitude() diff --git a/airbyte-integrations/connectors/source-bigquery/acceptance-test-config.yml b/airbyte-integrations/connectors/source-bigquery/acceptance-test-config.yml index d634ced570a5..b893dfbbb071 100644 --- a/airbyte-integrations/connectors/source-bigquery/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-bigquery/acceptance-test-config.yml @@ -1,7 +1,29 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-bigquery:dev -tests: +acceptance_tests: spec: - - spec_path: "src/test-integration/resources/expected_spec.json" - config_path: "src/test-integration/resources/dummy_config.json" + tests: + - spec_path: "src/test-integration/resources/expected_spec.json" + config_path: "src/test-integration/resources/dummy_config.json" + connection: + tests: + - config_path: "secrets/sat-config.json" + status: "succeed" + discovery: + tests: + - config_path: "secrets/sat-config.json" + basic_read: + tests: + - config_path: "secrets/sat-config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + expect_records: + path: "integration_tests/expected_records.json" + full_refresh: + tests: + - config_path: "secrets/sat-config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + incremental: + tests: + - config_path: "secrets/sat-config.json" + configured_catalog_path: "integration_tests/configured_catalog_inc.json" diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/README.md b/airbyte-integrations/connectors/source-bigquery/integration_tests/README.md new file mode 100644 index 000000000000..96aa5492669b --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/README.md @@ -0,0 +1,3 @@ +# Seeding the dataset +You can find the SQL scripts in this folder if you need to create or fix the SAT dataset. +For more instructions and information about valid scripts, please check this [doc](https://docs.google.com/document/d/1k5TvxaNhKdr44aJIHWWtLk14Tzd2gbNX-J8YNoTj8u0/edit#heading=h.ls9oiedt9wyy). diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/basic_dataset.sql b/airbyte-integrations/connectors/source-bigquery/integration_tests/basic_dataset.sql new file mode 100644 index 000000000000..b87f8a5efb08 --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/basic_dataset.sql @@ -0,0 +1,33 @@ +CREATE TABLE + `sat_test_dataset.sat_basic_dataset`(id NUMERIC(29), + test_column_1 int64, + test_column_10 decimal(29, + 9), + test_column_11 bigdecimal(76, + 38), + test_column_12 float64, + test_column_13 bool, + test_column_15 date, + test_column_16 datetime, + test_column_17 timestamp, + test_column_19 string, + test_column_2 int, + test_column_21 time, + test_column_3 smallint, + test_column_4 integer, + test_column_5 bigint, + test_column_6 tinyint, + test_column_7 byteint, + test_column_8 numeric(29, + 9), + test_column_9 bignumeric(76, + 38) ); + + +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (1, -128, -128, -128, -128, true, date('2021-10-20'), datetime('2021-10-20 11:22:33'), timestamp('2021-10-20 11:22:33'), 'qwe', -128, TIME(15, 30, 00), -128, -128, -128, -128, -128, -128, -128); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (2, 127, 127, 127, 127, false, date('9999-12-31'), datetime('9999-12-31 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, 127, 127); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (3, 9223372036854775807, 999999999999999999, 999999999999999999, 0.123456789, false, date('0001-01-01'), datetime('0001-01-01 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, 999999999999999999, 999999999999999999); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (4, -9223372036854775808, -999999999999999999, -999999999999999999, -0.123456789, false, date('0001-01-01'), datetime('0001-01-01 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, -999999999999999999, -999999999999999999); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (5, -9223372036854775808, 0.123456789, 0.123456789, -0.123456789, false, date('0001-01-01'), datetime('0001-01-01 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, 0.123456789, 0.123456789); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (6, -9223372036854775808, -0.123456789, -0.123456789, -0.123456789, false, date('0001-01-01'), datetime('0001-01-01 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, -0.123456789, -0.123456789); +INSERT INTO sat_test_dataset.sat_basic_dataset VALUES (7, -9223372036854775808, -0.123456789, -0.123456789, -0.123456789, false, date('0001-01-01'), datetime('0001-01-01 11:22:33'), timestamp('2021-10-20 11:22:33'), 'йцу', 127, TIME(15, 30, 00), 127, 127, 127, 127, 127, -0.123456789, -0.123456789); diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog.json new file mode 100644 index 000000000000..b1153b2a245c --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog.json @@ -0,0 +1,19 @@ +{ + "streams": [ + { + "stream": { + "name": "sat_basic_dataset", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": null, + "default_cursor_field": null, + "source_defined_primary_key": [["id"]], + "namespace": null + }, + "sync_mode": "full_refresh", + "cursor_field": null, + "destination_sync_mode": "append", + "primary_key": null + } + ] +} diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog_inc.json b/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog_inc.json new file mode 100644 index 000000000000..55458dbbfe40 --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/configured_catalog_inc.json @@ -0,0 +1,16 @@ +{ + "streams": [ + { + "stream": { + "name": "sat_basic_dataset", + "json_schema": {}, + "supported_sync_modes": ["incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["id"] + }, + "sync_mode": "incremental", + "cursor_field": ["id"], + "destination_sync_mode": "append" + } + ] +} diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/expected_records.json b/airbyte-integrations/connectors/source-bigquery/integration_tests/expected_records.json new file mode 100644 index 000000000000..9e3198b3e2b0 --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/expected_records.json @@ -0,0 +1,7 @@ +{"stream": "sat_basic_dataset", "data": {"id": 1, "test_column_1": -128, "test_column_10": -128, "test_column_11": -128, "test_column_12": -128.0, "test_column_13": true, "test_column_15": "2021-10-20T00:00:00Z", "test_column_16": "2021-10-20T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "qwe", "test_column_2": -128, "test_column_21": "15:30:00", "test_column_3": -128, "test_column_4": -128, "test_column_5": -128, "test_column_6": -128, "test_column_7": -128, "test_column_8": -128, "test_column_9": -128 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 2, "test_column_1": 127, "test_column_10": 127, "test_column_11": 127, "test_column_12": 127.0, "test_column_13": false, "test_column_15": "9999-12-31T00:00:00Z", "test_column_16": "9999-12-31T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": 127, "test_column_9": 127 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 3, "test_column_1": 9223372036854775807, "test_column_10": 999999999999999999, "test_column_11": 999999999999999999, "test_column_12": 0.123456789, "test_column_13": false, "test_column_15": "0001-01-01T00:00:00Z", "test_column_16": "0001-01-01T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": 999999999999999999, "test_column_9": 999999999999999999 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 7, "test_column_1": -9223372036854775808, "test_column_10": -0.123456789, "test_column_11": -0.123456789, "test_column_12": -0.123456789, "test_column_13": false, "test_column_15": "0001-01-01T00:00:00Z", "test_column_16": "0001-01-01T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": -0.123456789, "test_column_9": -0.123456789 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 4, "test_column_1": -9223372036854775808, "test_column_10": -999999999999999999, "test_column_11": -999999999999999999, "test_column_12": -0.123456789, "test_column_13": false, "test_column_15": "0001-01-01T00:00:00Z", "test_column_16": "0001-01-01T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": -999999999999999999, "test_column_9": -999999999999999999 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 5, "test_column_1": -9223372036854775808, "test_column_10": 0.123456789, "test_column_11": 0.123456789, "test_column_12": -0.123456789, "test_column_13": false, "test_column_15": "0001-01-01T00:00:00Z", "test_column_16": "0001-01-01T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": 0.123456789, "test_column_9": 0.123456789 }, "emitted_at": 1669643054045 } +{"stream": "sat_basic_dataset", "data": {"id": 6, "test_column_1": -9223372036854775808, "test_column_10": -0.123456789, "test_column_11": -0.123456789, "test_column_12": -0.123456789, "test_column_13": false, "test_column_15": "0001-01-01T00:00:00Z", "test_column_16": "0001-01-01T11:22:33Z", "test_column_17": "2021-10-20T11:22:33Z", "test_column_19": "\u0439\u0446\u0443", "test_column_2": 127, "test_column_21": "15:30:00", "test_column_3": 127, "test_column_4": 127, "test_column_5": 127, "test_column_6": 127, "test_column_7": 127, "test_column_8": -0.123456789, "test_column_9": -0.123456789 }, "emitted_at": 1669643054045 } diff --git a/airbyte-integrations/connectors/source-bigquery/integration_tests/full_dataset.sql b/airbyte-integrations/connectors/source-bigquery/integration_tests/full_dataset.sql new file mode 100644 index 000000000000..2bae50237ede --- /dev/null +++ b/airbyte-integrations/connectors/source-bigquery/integration_tests/full_dataset.sql @@ -0,0 +1,47 @@ +CREATE TABLE + sat_test_dataset.sat_full_dataset(id NUMERIC(29), + test_column_1 int64, + test_column_10 decimal(29, + 9), + test_column_11 bigdecimal(76, + 38), + test_column_12 float64, + test_column_13 bool, + test_column_14 bytes, + test_column_15 date, + test_column_16 datetime, + test_column_17 timestamp, + test_column_18 geography, + test_column_19 string, + test_column_2 int, + test_column_20 STRUCT, + test_column_21 time, + test_column_22 ARRAY, + test_column_23 STRUCT>>, + test_column_24 ARRAY>, + test_column_25 ARRAY>>>, + test_column_26 INTERVAL, + test_column_3 smallint, + test_column_4 integer, + test_column_5 bigint, + test_column_6 tinyint, + test_column_7 byteint, + test_column_8 numeric(29, + 9), + test_column_9 bignumeric(76, + 38) ); + +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (1, null, null, null, null, true, FROM_BASE64("test"), date('2021-10-20'), datetime('2021-10-20 11:22:33'), timestamp('2021-10-20 11:22:33'), ST_GEOGFROMTEXT('POINT(1 2)'), 'qwe', null, STRUCT("B.A",12), TIME(15, 30, 00), ['a', 'b'], STRUCT('s' as frst, 1 as sec, STRUCT(555 as id_col, STRUCT(TIME(15, 30, 00) as time) as mega_obbj) as obbj), [STRUCT('qqq' as fff, 1 as ggg), STRUCT('kkk' as fff, 2 as ggg)], [STRUCT('qqq' as fff, [STRUCT('fff' as ooo, 1 as kkk), STRUCT('hhh' as ooo, 2 as kkk)] as ggg)], MAKE_INTERVAL(2021, 10, 10, 10, 10, 10), null, null, null, null, null, null, null); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (2, -128, -128, -128, -128, false, null, date('9999-12-31'), datetime('9999-12-31 11:22:33'), null, null, 'йцу', -128, null, null, null, null, null, null, null, -128, -128, -128, -128, -128, -128, -128); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (3, 127, 127, 127, 127, null, null, date('0001-01-01'), datetime('0001-01-01 11:22:33'), null, null, null, 127, null, null, null, null, null, null, null, 127, 127, 127, 127, 127, 127, 127); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (4, 9223372036854775807, 999999999999999999, 999999999999999999, 0.123456789, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 999999999999999999, 999999999999999999); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (5, -9223372036854775808, -999999999999999999, -999999999999999999, -0.123456789, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, -999999999999999999, -999999999999999999); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (6, null, 0.123456789, 0.123456789, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0.123456789, 0.123456789); +INSERT INTO sat_test_dataset.sat_full_dataset VALUES (7, null, -0.123456789, -0.123456789, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, -0.123456789, -0.123456789); diff --git a/airbyte-integrations/connectors/source-bing-ads/Dockerfile b/airbyte-integrations/connectors/source-bing-ads/Dockerfile index cd473cc50954..c7ff0c4c0f2d 100644 --- a/airbyte-integrations/connectors/source-bing-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-bing-ads/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.16 +LABEL io.airbyte.version=0.1.17 LABEL io.airbyte.name=airbyte/source-bing-ads diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/keyword_performance_report.json b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/keyword_performance_report.json index 94007f074572..b7ec91ee647e 100644 --- a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/keyword_performance_report.json +++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/schemas/keyword_performance_report.json @@ -1,6 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", + "additionalProperties": true, "properties": { "AccountId": { "type": ["null", "integer"] @@ -14,6 +15,9 @@ "KeywordId": { "type": ["null", "integer"] }, + "Keyword": { + "type": ["null", "string"] + }, "AdId": { "type": ["null", "integer"] }, diff --git a/airbyte-integrations/connectors/source-close-com/Dockerfile b/airbyte-integrations/connectors/source-close-com/Dockerfile index 8ae4d853fc97..76440ca576f9 100644 --- a/airbyte-integrations/connectors/source-close-com/Dockerfile +++ b/airbyte-integrations/connectors/source-close-com/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.version=0.2.0 LABEL io.airbyte.name=airbyte/source-close-com diff --git a/airbyte-integrations/connectors/source-close-com/acceptance-test-config.yml b/airbyte-integrations/connectors/source-close-com/acceptance-test-config.yml index c8b56b0b5f2c..661766bc5276 100644 --- a/airbyte-integrations/connectors/source-close-com/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-close-com/acceptance-test-config.yml @@ -1,27 +1,52 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-close-com:dev -tests: +acceptance_tests: spec: - - spec_path: "source_close_com/spec.json" + tests: + - spec_path: "source_close_com/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" + # Some field types was changed for streams. + # custom_activities: id field was added + # custom_email_connected_accounts: imap field was changed to object + # smart_views: imap field was changed to object + backward_compatibility_tests_config: + disable_for_version: "0.1.0" basic_read: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - empty_streams: ["meeting_activities", "missed_call_tasks", "email_followup_tasks", "answered_detached_call_tasks", - "incoming_sms_tasks", "zoom_connected_accounts", "custom_email_connected_accounts", - "google_connected_accounts", "send_as", "email_sequences", "dialer", "email_bulk_actions", - "sequence_subscription_bulk_actions", "delete_bulk_actions"] + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + expect_records: + path: "integration_tests/expected_records.txt" + extra_fields: no + exact_order: no + extra_records: yes + empty_streams: + - name: missed_call_tasks + bypass_reason: "unable to populate" + - name: answered_detached_call_tasks + bypass_reason: "unable to populate" + - name: incoming_sms_tasks + bypass_reason: "unable to populate" + - name: send_as + bypass_reason: "unable to populate" + - name: voicemail_tasks + bypass_reason: "unable to populate" 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" + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-close-com/acceptance-test-docker.sh b/airbyte-integrations/connectors/source-close-com/acceptance-test-docker.sh old mode 100644 new mode 100755 index e4d8b1cef896..c51577d10690 --- a/airbyte-integrations/connectors/source-close-com/acceptance-test-docker.sh +++ b/airbyte-integrations/connectors/source-close-com/acceptance-test-docker.sh @@ -1,7 +1,7 @@ #!/usr/bin/env sh # Build latest connector image -docker build . -t $(cat acceptance-test-config.yml | grep "connector_image" | head -n 1 | cut -d: -f2) +docker build . -t $(cat acceptance-test-config.yml | grep "connector_image" | head -n 1 | cut -d: -f2-) # Pull latest acctest image docker pull airbyte/source-acceptance-test:latest diff --git a/airbyte-integrations/connectors/source-close-com/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-close-com/integration_tests/abnormal_state.json index 4825ea7533c1..fa1da2d874b7 100644 --- a/airbyte-integrations/connectors/source-close-com/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-close-com/integration_tests/abnormal_state.json @@ -30,7 +30,7 @@ "date_created": "2050-07-13T11:39:05.012000+00:00" }, "leads": { - "date_updated": "2050-07-16T00:00:12.701000" + "date_updated": "2050-07-16T00:00:12.701000+00:00" }, "lead_tasks": { "date_created": "2050-07-13T11:39:03.520000+00:00" diff --git a/airbyte-integrations/connectors/source-close-com/integration_tests/expected_records.txt b/airbyte-integrations/connectors/source-close-com/integration_tests/expected_records.txt new file mode 100644 index 000000000000..892231231ba4 --- /dev/null +++ b/airbyte-integrations/connectors/source-close-com/integration_tests/expected_records.txt @@ -0,0 +1,679 @@ +{"stream": "created_activities", "data": {"import_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2021-07-13T11:39:05.012000+00:00", "activity_at": "2021-07-13T11:39:05.012000+00:00", "id": "acti_CO9Th9maeKbnjp8XiG6gPada9OL2icBKBjuWK0aSzi5", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "source": "ui", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Created", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:05.012000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413430160} +{"stream": "created_activities", "data": {"import_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-07-13T11:39:03.413000+00:00", "activity_at": "2021-07-13T11:39:03.413000+00:00", "id": "acti_Vu4EowJ5vQVaTp2UviBUWsah2gfHfzEhToD0qt20awK", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "source": "ui", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Created", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:03.413000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413430167} +{"stream": "created_activities", "data": {"import_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-07-04T11:39:00.850000+00:00", "activity_at": "2021-07-04T11:39:00.850000+00:00", "id": "acti_1vDHprrVKawVMTbb4XmRtOJeP407lC7VeHwJu47cNzQ", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "source": "ui", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Created", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:04.485000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413430173} +{"stream": "created_activities", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "date_updated": "2022-11-11T09:00:52.304000+00:00", "_type": "Created", "contact_id": null, "date_created": "2022-11-11T09:00:52.285000+00:00", "id": "acti_LBTzFHimY46YWxvE0xpsR3tiZCHKgj3LCFil3pIfgmg", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "source": "ui", "import_id": null, "users": [], "activity_at": "2022-11-11T09:00:52.285000+00:00", "user_name": "Jean Lafleur"}, "emitted_at": 1670413430816} +{"stream": "created_activities", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "date_updated": "2022-11-08T15:54:42.398000+00:00", "_type": "Created", "contact_id": null, "date_created": "2022-11-08T15:54:42.377000+00:00", "id": "acti_CojceqMDlW46aVmKCv6YXS8oMJGPfchHYfXXySGMm39", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "source": "ui", "import_id": null, "users": [], "activity_at": "2022-11-08T15:54:42.377000+00:00", "user_name": "Jean Lafleur"}, "emitted_at": 1670413430818} +{"stream": "created_activities", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "date_updated": "2022-07-05T21:01:25.647000+00:00", "_type": "Created", "contact_id": null, "date_created": "2022-07-05T21:01:25.608000+00:00", "id": "acti_A2H4d5uvLXHTlxQjuUkg1SZNdYAcVEqLcTQ3EhlDZme", "lead_id": "lead_Eohw2Vf6WOKZHQ97nS1UTL3iV62pAJFX3ROgJ5WT4cY", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "source": "ui", "import_id": null, "users": [], "activity_at": "2022-07-05T21:01:25.608000+00:00", "user_name": "Jean Lafleur"}, "emitted_at": 1670413430820} +{"stream": "opportunity_status_change_activities", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "users": [], "opportunity_value_formatted": "$500", "opportunity_date_won": "2021-07-15T00:00:00+00:00", "old_status_type": "active", "id": "acti_wYiwpVt6MU3LVce1p8JHW8TowOW8GlDikXHkIHvl5xM", "opportunity_id": "oppo_1TfmaSLuECcdSQIBnjUOBj1gAXdyrp4SFaogvcEmtbk", "old_pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy", "user_name": "Jean Lafleur", "date_updated": "2021-08-18T10:26:44.228000+00:00", "new_status_id": "stat_AWXzFJkvkHVyJQPFulY0wM7LrQRiMEtQChGumG035bH", "opportunity_value_period": "one_time", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "old_pipeline_name": "Sales", "date_created": "2021-08-18T10:26:44.228000+00:00", "created_by_name": "Jean Lafleur", "_type": "OpportunityStatusChange", "updated_by_name": "Jean Lafleur", "old_status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "opportunity_value": 50000, "opportunity_confidence": 75, "contact_id": null, "new_status_type": "active", "old_status_label": "Demo Completed", "activity_at": "2021-08-18T10:26:44.228000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "opportunity_value_currency": "USD", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "new_pipeline_name": "Sales", "new_pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy", "new_status_label": "Proposal Sent"}, "emitted_at": 1670413432138} +{"stream": "note_activities", "data": {"lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-09-08T09:52:33.209000+00:00", "activity_at": "2021-09-08T09:52:33.209000+00:00", "id": "acti_S8FCREkmsz7QYukb5ce25aMwDD09ojKF5R9eXiPJczw", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "test", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-09-08T09:52:33.209000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413433988} +{"stream": "note_activities", "data": {"lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-08-12T14:16:54.027000+00:00", "activity_at": "2021-08-12T14:16:54.027000+00:00", "id": "acti_MEZjvRruzMu1YJP9VFz8AIlJPLNCINLJjKO3bw7TAW7", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "demo note", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-08-12T14:16:55.644000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413433998} +{"stream": "note_activities", "data": {"lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-08-12T12:10:32.670000+00:00", "activity_at": "2021-08-12T12:10:32.670000+00:00", "id": "acti_MWsXtWl1ouu73mqy8wFOsz6rskZ5fYky1XlB3UqlGwr", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "test 2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-08-18T10:00:40.586000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413434004} +{"stream": "note_activities", "data": {"lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-07-13T11:39:03.728000+00:00", "activity_at": "2021-07-13T11:39:03.728000+00:00", "id": "acti_7VhyfbgDQp9a9d4CfRYhtpd1QiRCexSp9iMAYTYGonW", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "Workflows & Sequences\n\nThe 5 Smart Views on the left side of Close make up an entire workflow! This workflow will help you automate your daily activity, such as calling, bulk emailing, and follow-ups.\n\nThe workflow here is just an example, so be sure to refer to https://help.close.com/docs/creating-smart-views-for-calling", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:03.728000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413434009} +{"stream": "note_activities", "data": {"lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-07-13T11:39:03.678000+00:00", "activity_at": "2021-07-13T11:39:03.678000+00:00", "id": "acti_HiGIISs8TJIH0oG2RrFKCNEIxn1rFyASoBoYsBwcPib", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "Import Your Contacts\n\nThere are several ways for you to import your data, including migrating from your current CRM, uploading an Excel file and more: https://help.close.com/docs/importing-leads-from-file \n\nOnce your import is complete, all email conversations between your email address and your contacts\u2019 email addresses will be displayed.", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:03.678000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413434013} +{"stream": "note_activities", "data": {"lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-07-13T11:39:03.633000+00:00", "activity_at": "2021-07-13T11:39:03.633000+00:00", "id": "acti_VmYlFVYdmnQGj0pelypp3m5h5YpOZBowuZNIDUXO18e", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "Built-In, Unlimited, Worldwide Calling\n\nYour trial is on our Business plan with unlimited incoming and outgoing calls. No setup required. You already have your own dedicated phone line; click on the phone icon in the toolbar to see your phone number.\n\nClick the Call button to make a call, and it will be automatically logged. You can enable Call Recording by clicking the phone icon in the toolbar.\n\nReady to get started? Test calling Nick.", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:03.633000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413434016} +{"stream": "note_activities", "data": {"lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-07-13T11:39:03.586000+00:00", "activity_at": "2021-07-13T11:39:03.586000+00:00", "id": "acti_aAODz5lPBplJxwalbFKUTKhlqaIryrqiiaItVSOpI0b", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "note": "2-Way Email Sync\n\nClose will pull up historical email conversations with your lead contacts and automatically log sent and received emails. Whether you send an email from your existing email client (Outlook, Gmail, etc.) or from Close, your emails will be logged in Close automatically.\n\nEmail histories and tracking only occur for lead contacts in Close that have an email address. Sync your email address under Settings > Your Email Settings.", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Note", "updated_by_name": "Jean Lafleur", "contact_id": null, "user_name": "Jean Lafleur", "users": [], "date_updated": "2021-07-13T11:39:03.586000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413434019} +{"stream": "meeting_activities", "data": {"title": "Test meeting 2", "user_name": "Jean Lafleur", "calendar_event_link": "https://www.google.com/calendar/event?eid=MWRlcDU1cDZtamY0MGxnYnJ2OXI5ajlocG8gaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbw", "source": "calendar", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-12T19:00:03.639000+00:00", "_type": "Meeting", "date_created": "2022-11-12T18:00:00+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "contact_id": null, "updated_by_name": "Jean Lafleur", "ends_at": "2022-11-12T19:00:00+00:00", "created_by_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "is_recurring": false, "starts_at": "2022-11-12T18:00:00+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "location": null, "attendees": [{"email": "irina.grankova@gmail.com", "is_organizer": false, "user_id": null, "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "status": "yes", "name": null}, {"email": "iryna.grankova@airbyte.io", "is_organizer": true, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "status": "yes", "name": null}], "activity_at": "2022-11-12T18:00:00+00:00", "note": "", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "status": "completed", "integrations": [], "duration": 3600, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"]}, "emitted_at": 1670413436543} +{"stream": "call_activities", "data": {"local_phone_formatted": null, "user_name": null, "created_by_name": null, "dialer_saved_search_id": null, "phone": "+16505176539", "sequence_id": null, "updated_by_name": null, "cost": null, "voicemail_duration": 28, "remote_phone": "+16505176539", "sequence_subscription_id": null, "voicemail_url": "https://api.close.com/call/acti_NsDheeFBzEAmjRfpBmclxdzKWqLnGZaIvU3ZvvyrDJt/voicemail/", "disposition": "vm-left", "created_by": null, "updated_by": null, "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "date_created": "2021-07-16T00:00:12.646000+00:00", "status": "completed", "date_updated": "2021-07-16T00:00:12.646000+00:00", "local_phone": null, "user_id": null, "activity_at": "2021-07-16T00:00:12.646000+00:00", "forwarded_to": null, "source": "Close.io", "users": [], "date_answered": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "has_recording": false, "direction": "inbound", "transferred_from": null, "is_joinable": false, "recording_url": null, "local_country_iso": "", "transferred_to": null, "duration": 0, "is_to_group_number": false, "transferred_to_user_id": null, "recording_expires_at": null, "dialer_id": null, "id": "acti_NsDheeFBzEAmjRfpBmclxdzKWqLnGZaIvU3ZvvyrDJt", "remote_phone_formatted": "+1 650-517-6539", "is_forwarded": false, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "transferred_from_user_id": null, "_type": "Call", "call_method": "regular", "remote_country_iso": "US", "coach_legs": [], "note": null}, "emitted_at": 1670413437878} +{"stream": "call_activities", "data": {"local_phone_formatted": null, "user_name": "Jean Lafleur", "created_by_name": "Jean Lafleur", "dialer_saved_search_id": null, "phone": "+12025550186", "sequence_id": null, "updated_by_name": "Jean Lafleur", "cost": null, "voicemail_duration": 0, "remote_phone": "+12025550186", "sequence_subscription_id": null, "voicemail_url": null, "disposition": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "date_created": "2021-07-05T11:39:00.850000+00:00", "status": "no-answer", "date_updated": "2021-07-13T11:39:04.536000+00:00", "local_phone": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "activity_at": "2021-07-05T11:39:00.850000+00:00", "forwarded_to": null, "source": "Close.io", "users": [], "date_answered": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "has_recording": false, "direction": "outbound", "transferred_from": null, "is_joinable": false, "recording_url": null, "local_country_iso": "", "transferred_to": null, "duration": 0, "is_to_group_number": false, "transferred_to_user_id": null, "recording_expires_at": null, "dialer_id": null, "id": "acti_wszWUd92D7wNYSbn5gKWXCf55NeyU0jc1Vguv7DfUiH", "remote_phone_formatted": "+1 202-555-0186", "is_forwarded": false, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "transferred_from_user_id": null, "_type": "Call", "call_method": "regular", "remote_country_iso": "US", "coach_legs": [], "note": "Gob never answered."}, "emitted_at": 1670413437881} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-09T13:57:14.751000+00:00", "sequence_subscription_id": null, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "disposition": "answered", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "completed", "cost": "2", "local_phone_formatted": "+1 415-625-1293", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "is_to_group_number": false, "transferred_to": null, "duration": 17, "source": "Close.io", "local_country_iso": "US", "is_forwarded": false, "remote_phone": "+14156236785", "remote_country_iso": "US", "forwarded_to": null, "date_updated": "2022-11-09T13:57:40.167000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-09T13:57:14.751000+00:00", "voicemail_url": null, "phone": "+14156236785", "user_name": "Jean Lafleur", "remote_phone_formatted": "+1 415-623-6785", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "", "local_phone": "+14156251293"}, "emitted_at": 1670413438491} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "sequence_subscription_id": null, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "disposition": "answered", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "completed", "cost": null, "local_phone_formatted": "+1 415-625-1293", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "is_to_group_number": false, "transferred_to": null, "duration": 0, "source": "Close.io", "local_country_iso": "US", "is_forwarded": false, "remote_phone": "+14156236785", "remote_country_iso": "US", "forwarded_to": null, "date_updated": "2022-11-09T12:57:27.648000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-09T12:55:26.751000+00:00", "voicemail_url": null, "phone": "+14156236785", "user_name": "Jean Lafleur", "remote_phone_formatted": "+1 415-623-6785", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": null, "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "", "local_phone": "+14156251293"}, "emitted_at": 1670413438500} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-09T12:55:03.314000+00:00", "sequence_subscription_id": null, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "disposition": "answered", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "completed", "cost": "2", "local_phone_formatted": "+1 415-625-1293", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "is_to_group_number": false, "transferred_to": null, "duration": 10, "source": "Close.io", "local_country_iso": "US", "is_forwarded": false, "remote_phone": "+14156236785", "remote_country_iso": "US", "forwarded_to": null, "date_updated": "2022-11-09T12:55:23.356000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-09T12:55:03.314000+00:00", "voicemail_url": null, "phone": "+14156236785", "user_name": "Jean Lafleur", "remote_phone_formatted": "+1 415-623-6785", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "", "local_phone": "+14156251293"}, "emitted_at": 1670413438506} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-09T11:20:32.524000+00:00", "sequence_subscription_id": null, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "disposition": "answered", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "completed", "cost": "2", "local_phone_formatted": "+1 415-625-1293", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "is_to_group_number": false, "transferred_to": null, "duration": 3, "source": "Close.io", "local_country_iso": "US", "is_forwarded": false, "remote_phone": "+14156236785", "remote_country_iso": "US", "forwarded_to": null, "date_updated": "2022-11-09T11:20:42.502000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-09T11:20:32.524000+00:00", "voicemail_url": null, "phone": "+14156236785", "user_name": "Jean Lafleur", "remote_phone_formatted": "+1 415-623-6785", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "", "local_phone": "+14156251293"}, "emitted_at": 1670413438511} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-08T15:55:39.770000+00:00", "sequence_subscription_id": null, "id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "disposition": "blocked", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "failed", "cost": null, "local_phone_formatted": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "is_to_group_number": false, "transferred_to": null, "duration": 0, "source": "Close.io", "local_country_iso": "", "is_forwarded": false, "remote_phone": "+380636306253", "remote_country_iso": "UA", "forwarded_to": null, "date_updated": "2022-11-09T12:56:13.631000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-08T15:55:39.770000+00:00", "voicemail_url": null, "phone": "+380636306253", "user_name": "Jean Lafleur", "remote_phone_formatted": "+380 63 630 6253", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": null, "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "Test test", "local_phone": null}, "emitted_at": 1670413438515} +{"stream": "call_activities", "data": {"transferred_to_user_id": null, "date_created": "2022-11-08T15:53:39.388000+00:00", "sequence_subscription_id": null, "id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "disposition": "blocked", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "failed", "cost": null, "local_phone_formatted": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "is_to_group_number": false, "transferred_to": null, "duration": 0, "source": "Close.io", "local_country_iso": "", "is_forwarded": false, "remote_phone": "+380636306253", "remote_country_iso": "UA", "forwarded_to": null, "date_updated": "2022-11-08T15:54:58.677000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "call_method": "regular", "coach_legs": [], "activity_at": "2022-11-08T15:53:39.388000+00:00", "voicemail_url": null, "phone": "+380636306253", "user_name": "Jean Lafleur", "remote_phone_formatted": "+380 63 630 6253", "dialer_id": null, "direction": "outbound", "users": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "recording_expires_at": null, "transferred_from_user_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "Call", "dialer_saved_search_id": null, "transferred_from": null, "is_joinable": false, "sequence_id": null, "voicemail_duration": 0, "updated_by_name": "Jean Lafleur", "date_answered": null, "recording_url": null, "has_recording": false, "created_by_name": "Jean Lafleur", "note": "", "local_phone": null}, "emitted_at": 1670413438518} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Your bulk edit for Airbyte is done", "updated_by_name": null, "sequence_subscription_id": null, "thread_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-08-25T21:15:36+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "sequence_id": null, "message_ids": ["<162992613594.10130.17609834081606867635@closeio-tasktiger-other-7bd975b8f7-f5phd>"], "_type": "Email", "updated_by": null, "template_id": null, "body_html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Change lead status to "Interested".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
\n", "date_sent": "2021-08-25T21:15:36+00:00", "created_by_name": null, "activity_at": "2021-08-25T21:15:36+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": null, "sequence_name": null, "sender": "'Close CRM' via Integration tests ", "opens": [], "envelope": {"sender": [{"name": "", "email": "support@close.com"}], "date": "Wed, 25 Aug 2021 21:15:36 +0000", "bcc": [], "subject": "Your bulk edit for Airbyte is done", "cc": [], "in_reply_to": null, "message_id": "<162992613594.10130.17609834081606867635@closeio-tasktiger-other-7bd975b8f7-f5phd>", "from": [{"name": "'Close CRM' via Integration tests", "email": "integration-test@airbyte.io"}], "reply_to": [{"name": "Close CRM", "email": "support@close.com"}], "to": [{"name": "", "email": "integration-test@airbyte.io"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@cl", "id": "acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn", "direction": "outgoing", "date_scheduled": null, "cc": [], "attachments": [], "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "followup_sequence_delay": null, "users": [], "body_text_quoted": [{"expand": true, "text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n"}], "body_html_quoted": [{"expand": true, "html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Change lead status to \"Interested\".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
"}], "references": [], "contact_id": null, "body_text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n", "template_name": null, "has_reply": false, "date_updated": "2022-11-08T12:36:05.979000+00:00", "status": "sent", "send_attempts": [], "to": ["integration-test@airbyte.io"], "followup_sequence_id": null}, "emitted_at": 1670413439976} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Your bulk edit for Airbyte is done", "updated_by_name": null, "sequence_subscription_id": null, "thread_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-08-25T21:03:54+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "sequence_id": null, "message_ids": ["<162992543485.16564.1574709800437653559@closeio-tasktiger-other-7bd975b8f7-x9jpv>"], "_type": "Email", "updated_by": null, "template_id": null, "body_html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Set custom field "Lead Owner" to "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
\n", "date_sent": "2021-08-25T21:03:54+00:00", "created_by_name": null, "activity_at": "2021-08-25T21:03:54+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": null, "sequence_name": null, "sender": "'Close CRM' via Integration tests ", "opens": [], "envelope": {"sender": [{"name": "", "email": "support@close.com"}], "date": "Wed, 25 Aug 2021 21:03:54 +0000", "bcc": [], "subject": "Your bulk edit for Airbyte is done", "cc": [], "in_reply_to": null, "message_id": "<162992543485.16564.1574709800437653559@closeio-tasktiger-other-7bd975b8f7-x9jpv>", "from": [{"name": "'Close CRM' via Integration tests", "email": "integration-test@airbyte.io"}], "reply_to": [{"name": "Close CRM", "email": "support@close.com"}], "to": [{"name": "", "email": "integration-test@airbyte.io"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modifie", "id": "acti_6pzzBcXnRUrC7ClGxkbfyifOL0tKELXmDQsGffzFx8N", "direction": "outgoing", "date_scheduled": null, "cc": [], "attachments": [], "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "followup_sequence_delay": null, "users": [], "body_text_quoted": [{"expand": true, "text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n"}], "body_html_quoted": [{"expand": true, "html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
"}], "references": [], "contact_id": null, "body_text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n", "template_name": null, "has_reply": false, "date_updated": "2022-11-08T12:36:06.154000+00:00", "status": "sent", "send_attempts": [], "to": ["integration-test@airbyte.io"], "followup_sequence_id": null}, "emitted_at": 1670413439978} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Airbyte Follow-up", "updated_by_name": "Jean Lafleur", "sequence_subscription_id": null, "thread_id": "acti_XFp5upc2w8MawOLJ89I5LNlWOYcJLBrHp6UOFOTfN0T", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-08-18T10:35:50.165000+00:00", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "sequence_id": null, "message_ids": [], "_type": "Email", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_sent": null, "created_by_name": "Jean Lafleur", "activity_at": "2021-08-18T10:35:50.165000+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_name": null, "sender": null, "opens": [], "envelope": {"sender": [], "date": "Wed, 18 Aug 2021 10:35:50 -0000", "bcc": [], "subject": "Airbyte Follow-up", "cc": [], "in_reply_to": null, "message_id": null, "from": [], "reply_to": [], "to": [{"name": "", "email": "bluth@close.com"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "id": "acti_8MOghgAFLMW70Zj8pMTUA0NozWrEKeyckt4kFJcx65L", "direction": "outgoing", "date_scheduled": null, "cc": [], "attachments": [], "email_account_id": null, "followup_sequence_delay": null, "users": [], "body_text_quoted": [{"expand": true, "text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "body_html_quoted": [{"expand": true, "html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "references": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "body_text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "template_name": "Email 2 - Follow-up #1", "has_reply": false, "date_updated": "2021-08-18T10:36:10.974000+00:00", "status": "draft", "send_attempts": [], "to": ["bluth@close.com"], "followup_sequence_id": null}, "emitted_at": 1670413439982} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Pic", "updated_by_name": null, "sequence_subscription_id": null, "thread_id": "acti_v9S0gdPWzRUqjj2taSmmdfigKanA9tThaFe46FtcXGO", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-07-26T09:08:50+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "sequence_id": null, "message_ids": ["<56EC0E81-FE10-40C6-ACF8-8B448B510DFD@gmail.com>"], "_type": "Email", "updated_by": null, "template_id": null, "body_html": "", "date_sent": null, "created_by_name": null, "activity_at": "2021-07-26T09:08:50+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": null, "sequence_name": null, "sender": "Irina Grankova ", "opens": [], "envelope": {"sender": [{"name": "Irina Grankova", "email": "irina.grankova@gmail.com"}], "date": "Mon, 26 Jul 2021 12:08:50 +0300", "bcc": [], "subject": "Pic", "cc": [], "in_reply_to": null, "message_id": "<56EC0E81-FE10-40C6-ACF8-8B448B510DFD@gmail.com>", "from": [{"name": "Irina Grankova", "email": "irina.grankova@gmail.com"}], "reply_to": [], "to": [{"name": "", "email": "iryna.grankova@globallogic.com"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": null, "id": "acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z", "direction": "incoming", "date_scheduled": null, "cc": [], "attachments": [{"size": 144978, "content_type": "image/jpeg", "filename": "image0.jpeg", "content_id": null, "url": "https://app.close.com/go/email/acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z/attachment/0/"}], "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "followup_sequence_delay": null, "users": [], "body_text_quoted": null, "body_html_quoted": null, "references": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "body_text": "", "template_name": null, "has_reply": false, "date_updated": "2022-11-08T15:58:52.109000+00:00", "status": "inbox", "send_attempts": [], "to": ["iryna.grankova@globallogic.com"], "followup_sequence_id": null}, "emitted_at": 1670413439989} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Welcome to Close, Jean!", "updated_by_name": "Jean Lafleur", "sequence_subscription_id": null, "thread_id": "acti_dtGBVpRrqQszIPQgvEhqTGBz3fA5PYptEc4lmVWNUKm", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-07-13T11:39:04.130000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "sequence_id": null, "message_ids": [], "_type": "Email", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "template_id": null, "body_html": "Hi Jean!

You can send, receive, and track your email conversations all within Close.

Try sending an outgoing email - click on the reply arrow and use an Email Template. You can now check off the Task!

See the Notes on this Lead and follow the Getting Started Guide to get set up as quickly as possible.

Let's make it happen!", "date_sent": null, "created_by_name": "Jean Lafleur", "activity_at": "2021-07-13T11:39:04.130000+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_name": null, "sender": "Steli Efti ", "opens": [], "envelope": {"sender": [{"name": "Steli Efti", "email": "sales@close.com"}], "date": "Tue, 13 Jul 2021 11:39:04 +0000", "bcc": [], "subject": "Welcome to Close, Jean!", "cc": [], "in_reply_to": null, "message_id": "<162617634412.13.2638379749228562382@closeio-web-85678dcd7b-xdcf7>", "from": [{"name": "Steli Efti", "email": "sales@close.com"}], "reply_to": [{"name": "", "email": "sales@close.com"}], "to": [{"name": "", "email": "integration-test@airbyte.io"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": "Hi Jean!\n\nYou can send, receive, and track your email conversations all within Close.\n\nTry sending an outgoing email - click on the reply arrow and use an Email Templat", "id": "acti_Ags7x68KOMv3dKgtYWmrdFNCn16g0Wns0HSCY5L5nIm", "direction": "incoming", "date_scheduled": null, "cc": [], "attachments": [], "email_account_id": null, "followup_sequence_delay": null, "users": [], "body_text_quoted": [{"expand": true, "text": "Hi Jean!\n\nYou can send, receive, and track your email conversations all within Close.\n\nTry sending an outgoing email - click on the reply arrow and use an Email Template. You can now check off the Task!\n\nSee the Notes on this Lead and follow the Getting Started Guide to get set up as quickly as possible.\n\nLet's make it happen!"}], "body_html_quoted": [{"expand": true, "html": "Hi Jean!

You can send, receive, and track your email conversations all within Close.

Try sending an outgoing email - click on the reply arrow and use an Email Template. You can now check off the Task!

See the Notes on this Lead and follow the Getting Started Guide to get set up as quickly as possible.

Let's make it happen!"}], "references": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "body_text": "Hi Jean!\n\nYou can send, receive, and track your email conversations all within Close.\n\nTry sending an outgoing email - click on the reply arrow and use an Email Template. You can now check off the Task!\n\nSee the Notes on this Lead and follow the Getting Started Guide to get set up as quickly as possible.\n\nLet's make it happen!", "template_name": null, "has_reply": false, "date_updated": "2021-07-13T11:39:04.140000+00:00", "status": "inbox", "send_attempts": [], "to": ["integration-test@airbyte.io"], "followup_sequence_id": null}, "emitted_at": 1670413439992} +{"stream": "email_activities", "data": {"opens_summary": null, "send_as_id": null, "bcc": [], "subject": "Missed call", "updated_by_name": "Jean Lafleur", "sequence_subscription_id": null, "thread_id": "acti_FrMniUW4fyqPxIyOEuuZN2QzkJF5tY3Ny2Q1nhimPEK", "in_reply_to_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "bulk_email_action_id": null, "date_created": "2021-07-05T11:39:00.850000+00:00", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "sequence_id": null, "message_ids": [], "_type": "Email", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "template_id": null, "body_html": "Hi Jean!

I just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.

Just wanted to let you know, I'm still interested in your offer. Hope I'm not making a huge mistake...

Cheers,
Gob", "date_sent": null, "created_by_name": "Jean Lafleur", "activity_at": "2021-07-05T11:39:00.850000+00:00", "user_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_name": null, "sender": "bluth@close.com", "opens": [], "envelope": {"sender": [{"name": "", "email": "bluth@close.com"}], "date": "Tue, 13 Jul 2021 11:39:04 +0000", "bcc": [], "subject": "Missed call", "cc": [], "in_reply_to": null, "message_id": "<162617634457.13.866605428580538299@closeio-web-85678dcd7b-xdcf7>", "from": [{"name": "", "email": "bluth@close.com"}], "reply_to": [], "to": [{"name": "", "email": "integration-test@airbyte.io"}], "is_autoreply": false}, "need_smtp_credentials": false, "body_preview": "Hi Jean!\n\nI just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.\n\nJust wanted to let you know, I'm still interested in your offer. Hope I'm not m", "id": "acti_T0UrwXOaxgA0kzhGA5Zx0hDWgP7sy5ihKRivMlQWsLV", "direction": "incoming", "date_scheduled": null, "cc": [], "attachments": [], "email_account_id": null, "followup_sequence_delay": null, "users": [], "body_text_quoted": [{"expand": true, "text": "Hi Jean!\n\nI just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.\n\nJust wanted to let you know, I'm still interested in your offer. Hope I'm not making a huge mistake...\n\nCheers,\nGob"}], "body_html_quoted": [{"expand": true, "html": "Hi Jean!

I just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.

Just wanted to let you know, I'm still interested in your offer. Hope I'm not making a huge mistake...

Cheers,
Gob"}], "references": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "body_text": "Hi Jean!\n\nI just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.\n\nJust wanted to let you know, I'm still interested in your offer. Hope I'm not making a huge mistake...\n\nCheers,\nGob", "template_name": null, "has_reply": false, "date_updated": "2021-07-13T11:39:04.595000+00:00", "status": "inbox", "send_attempts": [], "to": ["integration-test@airbyte.io"], "followup_sequence_id": null}, "emitted_at": 1670413439996} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-09T12:54:23.167000+00:00", "subject": "Test Lead + Airbyte", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "irina.grankova@gmail.com", "name": ""}], "subject": "Test Lead + Airbyte", "message_id": "<166799846322.15922.4962027989641879748@smtpgw.close.com>", "bcc": [], "date": "Wed, 09 Nov 2022 12:54:23 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_updated": "2022-11-09T13:39:37.547000+00:00", "to": ["irina.grankova@gmail.com"], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "date_sent": "2022-11-09T12:54:23.167000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166799846322.15922.4962027989641879748@smtpgw.close.com>", "<166799846322.15922.14988047742178474967@smtpgw.close.com>"], "created_by_name": "Jean Lafleur", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-09T13:39:37.547000+00:00", "ip_address": "104.28.131.168", "user_agent": "Mozilla/5.0", "opened_by": "irina.grankova@gmail.com"}], "cc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440814} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "updated_by": null, "id": "acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb", "template_id": null, "activity_at": "2022-11-09T12:42:01+00:00", "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 631, "content_type": "text/calendar", "filename": "file.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb/attachment/0/"}, {"size": 631, "content_type": "application/ics", "filename": "invite.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb/attachment/1/"}], "references": [], "envelope": {"from": [{"email": "irina.grankova@gmail.com", "name": ""}], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "message_id": "<000000000000a8d33605ed08fb3c@google.com>", "bcc": [], "date": "Wed, 09 Nov 2022 12:42:01 +0000", "in_reply_to": null, "cc": [], "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}]}, "_type": "Email", "date_created": "2022-11-09T12:42:01+00:00", "date_updated": "2022-11-09T12:42:06.830000+00:00", "to": ["iryna.grankova@airbyte.io"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting 2
\u00a0
irina.grankova@gmail.com has accepted this invitation.
\u00a0

When

Saturday Nov 12, 2022 \u22c5 8pm \u2013 9pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<000000000000a8d33605ed08fb3c@google.com>"], "created_by_name": null, "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\nGuests\niryna.grankova@airbyte.io - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://calendar.google.com/calendar/event?action=VIEW&eid=MWRlcDU1cDZtamY0MGxnYnJ2OXI5ajlocG8gaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbw&tok=MjUjaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbzE2Y2ZiMDdkMGQzOTk4OGFmYzI1NGVmYTE3ODEzYzBlNGQ0M2NhMDE&ctz=Europe%2FKiev&hl=en&es=1\n\n~~//~~\nInvitation from Google Calendar: https://calendar.google.com/calendar/\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://support.google.com/calendar/answer/37135#forwarding\n", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting 2
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Saturday Nov 12, 2022 \u22c5 8pm \u2013 9pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\nGuests\niryna.grankova@airbyte.io - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://calendar.google.com/calendar/event?action=VIEW&eid=MWRlcDU1cDZtamY0MGxnYnJ2OXI5ajlocG8gaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbw&tok=MjUjaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbzE2Y2ZiMDdkMGQzOTk4OGFmYzI1NGVmYTE3ODEzYzBlNGQ0M2NhMDE&ctz=Europe%2FKiev&hl=en&es=1\n\n~~//~~\nInvitation from Google Calendar: https://calendar.google.com/calendar/\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://support.google.com/calendar/answer/37135#forwarding\n"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "need_smtp_credentials": false, "sender": "irina.grankova@gmail.com"}, "emitted_at": 1670413440816} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "updated_by": null, "id": "acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa", "template_id": null, "activity_at": "2022-11-09T12:32:37+00:00", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1206, "content_type": "text/calendar", "filename": "file.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa/attachment/0/"}, {"size": 1206, "content_type": "application/ics", "filename": "invite.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa/attachment/1/"}], "references": [], "envelope": {"from": [{"email": "irina.grankova@gmail.com", "name": ""}], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "message_id": "<0000000000000d111305ed08dada@google.com>", "bcc": [], "date": "Wed, 09 Nov 2022 12:32:37 +0000", "in_reply_to": null, "cc": [], "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}]}, "_type": "Email", "date_created": "2022-11-09T12:32:37+00:00", "date_updated": "2022-11-09T12:32:49.521000+00:00", "to": ["iryna.grankova@globallogic.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
\u00a0
irina.grankova@gmail.com has accepted this invitation.
\u00a0

When

Friday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<0000000000000d111305ed08dada@google.com>"], "created_by_name": null, "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6rEQC4MxPVFKSfql?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/bAkfCJ6xR7CwYG27tGX2ya?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/QMWsCKryR5iWngYjC3LjFf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/nKJWCL9zR5i91xgJfmFOtP?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/am2dCM8A65U3ZKLQfQyCij?domain=support.google.com\n", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Friday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

\n", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6rEQC4MxPVFKSfql?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/bAkfCJ6xR7CwYG27tGX2ya?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/QMWsCKryR5iWngYjC3LjFf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/nKJWCL9zR5i91xgJfmFOtP?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/am2dCM8A65U3ZKLQfQyCij?domain=support.google.com\n"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "need_smtp_credentials": false, "sender": "irina.grankova@gmail.com"}, "emitted_at": 1670413440818} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "updated_by": null, "id": "acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ", "template_id": null, "activity_at": "2022-11-09T11:30:58+00:00", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1206, "content_type": "text/calendar", "filename": "file.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ/attachment/0/"}, {"size": 1206, "content_type": "application/ics", "filename": "invite.ics", "content_id": null, "url": "https://app.close.com/go/email/acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ/attachment/1/"}], "references": [], "envelope": {"from": [{"email": "irina.grankova@gmail.com", "name": ""}], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "message_id": "<0000000000009b99c605ed07fdaf@google.com>", "bcc": [], "date": "Wed, 09 Nov 2022 11:30:58 +0000", "in_reply_to": null, "cc": [], "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}]}, "_type": "Email", "date_created": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T11:31:11.939000+00:00", "to": ["iryna.grankova@globallogic.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
\u00a0
irina.grankova@gmail.com has accepted this invitation.
\u00a0

When

Wednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<0000000000009b99c605ed07fdaf@google.com>"], "created_by_name": null, "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLiqB6yJSowlDc?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/mRXXC0R7BXCB39OnhDVap6?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/bSDoCgJEPQHy2jXvC2d9qf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/HBvSCjRKPOCmqwLzC7efZi?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/yispCkRLPOCBQRVDhJsq8W?domain=support.google.com\n", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Wednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

\n", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLiqB6yJSowlDc?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/mRXXC0R7BXCB39OnhDVap6?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/bSDoCgJEPQHy2jXvC2d9qf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/HBvSCjRKPOCmqwLzC7efZi?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/yispCkRLPOCBQRVDhJsq8W?domain=support.google.com\n"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "need_smtp_credentials": false, "sender": "irina.grankova@gmail.com"}, "emitted_at": 1670413440821} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "Test\n\n\n", "updated_by": null, "id": "acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq", "template_id": null, "activity_at": "2022-11-09T11:28:52+00:00", "subject": "Test", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "to": [{"email": "integration-test@airbyte.io", "name": ""}], "subject": "Test", "message_id": "", "bcc": [], "date": "Wed, 9 Nov 2022 13:28:52 +0200", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "globallogic@airbyte.io", "name": ""}]}, "_type": "Email", "date_created": "2022-11-09T11:28:52+00:00", "date_updated": "2022-11-09T11:29:03.355000+00:00", "to": ["integration-test@airbyte.io"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Test
\n
\n
"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": [""], "created_by_name": null, "body_text": "Test\n\n\n", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "Test
\n
\n
\n", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Test\n\n\n"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "need_smtp_credentials": false, "sender": "Irina Grankova "}, "emitted_at": 1670413440823} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-09T11:25:32.264000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "irina.grankova@gmail.com", "name": ""}], "subject": "Airbyte Follow-up", "message_id": "<166799313228.17776.4777225093537029355@smtpgw.close.com>", "bcc": [], "date": "Wed, 09 Nov 2022 11:25:32 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_updated": "2022-11-09T11:29:01.481000+00:00", "to": ["irina.grankova@gmail.com"], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "date_sent": "2022-11-09T11:25:32.264000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166799313228.17776.4777225093537029355@smtpgw.close.com>", "<166799313228.17776.3152755854733402602@smtpgw.close.com>"], "created_by_name": "Jean Lafleur", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-09T11:29:01.480000+00:00", "ip_address": "104.28.131.166", "user_agent": "Mozilla/5.0", "opened_by": "irina.grankova@gmail.com"}], "cc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440825} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T17:53:35.311000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "sales@close.com", "name": "Steli Efti"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T17:53:35.598000+00:00", "date_updated": "2022-11-09T02:40:26.387000+00:00", "to": ["Steli Efti "], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "date_sent": "2022-11-08T17:53:35.311000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T17:53:39.970000+00:00", "ip_address": "66.249.92.22", "user_agent": "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", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T17:53:43.225000+00:00", "ip_address": "66.249.83.109", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T19:21:22.529000+00:00", "ip_address": "66.249.84.173", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T22:08:24.873000+00:00", "ip_address": "66.249.84.173", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-09T02:40:26.387000+00:00", "ip_address": "104.28.57.228", "user_agent": "Mozilla/5.0", "opened_by": "Steli Efti "}], "cc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 1", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440827} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T17:41:58.196000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "support@close.com", "name": "Support"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 17:41:59 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T17:41:58.589000+00:00", "date_updated": "2022-11-08T17:42:03.103000+00:00", "to": ["Support "], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by Support (2 times, latest 2022-11-08)", "date_sent": "2022-11-08T17:41:58.196000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792931876.62373.17646468751668935681@smtpgw.close.com>", "<166792931876.62373.6144271479235161876@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T17:42:01.966000+00:00", "ip_address": "66.249.92.22", "user_agent": "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", "opened_by": "Support "}, {"opened_at": "2022-11-08T17:42:03.103000+00:00", "ip_address": "66.249.92.24", "user_agent": "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", "opened_by": "Support "}], "cc": [], "body_html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 1", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440829} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T17:15:11.279000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "nick@close.com", "name": "Nick Persico"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 17:15:12 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T17:15:11.656000+00:00", "date_updated": "2022-11-08T17:15:14.724000+00:00", "to": ["Nick Persico "], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by Nick Persico (2022-11-08)", "date_sent": "2022-11-08T17:15:11.279000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792771182.46793.15708798519258202100@smtpgw.close.com>", "<166792771182.46793.6902395509032896353@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T17:15:14.724000+00:00", "ip_address": "66.249.92.10", "user_agent": "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", "opened_by": "Nick Persico "}], "cc": [], "body_html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 1", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440831} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T17:12:07.625000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "success@close.com", "name": "Customer Success Team"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 17:12:08 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T17:12:07.975000+00:00", "date_updated": "2022-11-08T17:12:12.687000+00:00", "to": ["Customer Success Team "], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by Customer Success Team (2 times, latest 2022-11-08)", "date_sent": "2022-11-08T17:12:07.625000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792752819.46698.4592611849180210253@smtpgw.close.com>", "<166792752819.46698.4097549043104142028@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T17:12:11.815000+00:00", "ip_address": "66.249.92.10", "user_agent": "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", "opened_by": "Customer Success Team "}, {"opened_at": "2022-11-08T17:12:12.687000+00:00", "ip_address": "66.249.92.10", "user_agent": "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", "opened_by": "Customer Success Team "}], "cc": [], "body_html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 1", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440833} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T16:48:47.166000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "support@close.com", "name": "Support"}], "subject": "Airbyte Follow-up", "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 16:48:48 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T16:48:47.552000+00:00", "date_updated": "2022-11-08T16:50:41.545000+00:00", "to": ["Support "], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by Support (2022-11-08)", "date_sent": "2022-11-08T16:48:47.166000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792612773.32060.15386565426548563880@smtpgw.close.com>", "<166792612773.32060.13475180684302654892@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T16:50:41.545000+00:00", "ip_address": "66.249.92.23", "user_agent": "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", "opened_by": "Support "}], "cc": [], "body_html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 2", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440836} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T16:36:07.226000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "sales@close.com", "name": "Steli Efti"}], "subject": "Airbyte Follow-up", "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T16:36:07.646000+00:00", "date_updated": "2022-11-09T02:40:26.385000+00:00", "to": ["Steli Efti "], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "date_sent": "2022-11-08T16:36:07.226000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T16:36:14.654000+00:00", "ip_address": "66.249.92.23", "user_agent": "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", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T16:36:16.238000+00:00", "ip_address": "66.102.8.136", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T19:23:49.925000+00:00", "ip_address": "66.249.84.169", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-08T21:43:30.790000+00:00", "ip_address": "66.249.84.180", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "opened_by": "Steli Efti "}, {"opened_at": "2022-11-09T02:40:26.385000+00:00", "ip_address": "104.28.57.228", "user_agent": "Mozilla/5.0", "opened_by": "Steli Efti "}], "cc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 2", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440838} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T16:24:31.194000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "success@close.com", "name": "Customer Success Team"}], "subject": "Airbyte Follow-up", "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 16:24:32 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T16:24:31.650000+00:00", "date_updated": "2022-11-08T16:24:37.393000+00:00", "to": ["Customer Success Team "], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by Customer Success Team (2022-11-08)", "date_sent": "2022-11-08T16:24:31.194000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792467183.28936.13663569799747553498@smtpgw.close.com>", "<166792467183.28936.4497117513938895080@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T16:24:37.393000+00:00", "ip_address": "66.249.92.22", "user_agent": "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", "opened_by": "Customer Success Team "}], "cc": [], "body_html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 2", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440840} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T16:23:04.323000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "nick@close.com", "name": "Nick Persico"}], "subject": "Airbyte Follow-up", "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 16:23:05 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T16:23:04.668000+00:00", "date_updated": "2022-11-08T20:44:30.910000+00:00", "to": ["Nick Persico "], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by Nick Persico (2022-11-08)", "date_sent": "2022-11-08T16:23:04.323000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792458488.29477.5187137325155036854@smtpgw.close.com>", "<166792458488.29477.3151986449249141034@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T20:44:30.910000+00:00", "ip_address": "35.231.92.0", "user_agent": "Superhuman", "opened_by": "Nick Persico "}], "cc": [], "body_html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 2", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440842} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/", "updated_by": null, "id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "template_id": null, "activity_at": "2022-11-08T16:09:09+00:00", "subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1450, "content_type": "image/png", "filename": "icon.png", "content_id": "", "url": "https://s3.amazonaws.com/closeio-email/attachment/e1c1c167b89e4f82a005b0372525677059b652f7292ffbfda0f069bfce89f4e8/icon.png"}], "references": ["<166792374433.22448.17907165931371313011@smtpgw.close.com>", "<166792374433.22448.16558415745556798661@smtpgw.close.com>"], "envelope": {"from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "subject": "Delivery Status Notification (Failure)", "message_id": "<636a7f25.c80a0220.659b6.8bba.GMR@mx.google.com>", "bcc": [], "date": "Tue, 08 Nov 2022 08:09:09 -0800 (PST)", "in_reply_to": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "cc": [], "reply_to": [], "is_autoreply": true, "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "_type": "Email", "date_created": "2022-11-08T16:09:09+00:00", "date_updated": "2022-11-08T16:28:54.140000+00:00", "to": ["iryna.grankova@globallogic.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 16:09:04 +0000
\nTo: Tobias F\u00fcnke <tobiasfunke@close.com>
\n
\nHi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<636a7f25.c80a0220.659b6.8bba.GMR@mx.google.com>"], "created_by_name": null, "body_text": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 16:09:04 +0000\nTo: Tobias F\u00fcnke \n\nHi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 16:09:04 +0000
\nTo: Tobias F\u00fcnke <tobiasfunke@close.com>
\n
\nHi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 16:09:04 +0000\nTo: Tobias F\u00fcnke \n\nHi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": null, "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Mail Delivery Subsystem "}, "emitted_at": 1670413440844} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Th", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T16:09:03.809000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}], "subject": "Airbyte Follow-up", "message_id": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 16:09:04 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T16:09:04.170000+00:00", "date_updated": "2022-11-08T16:09:05.758000+00:00", "to": ["Tobias F\u00fcnke "], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": null, "date_sent": "2022-11-08T16:09:03.809000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_1rgSspOohLocAaucazbFbB", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792374433.22448.16558415745556798661@smtpgw.close.com>", "<166792374433.22448.17907165931371313011@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "Hi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 2", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440846} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.co", "updated_by": null, "id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "template_id": null, "activity_at": "2022-11-08T15:44:23+00:00", "subject": "Delivery Status Notification (Failure)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1450, "content_type": "image/png", "filename": "icon.png", "content_id": "", "url": "https://s3.amazonaws.com/closeio-email/attachment/f670d9e08ca53e6d8967e36b17ff67b93ba6648a92b7cc0d4b9019aa9d745408/icon.png"}], "references": ["<166792225784.2629.12825104744076060180@smtpgw.close.com>", "<166792225784.2629.13990873364570888607@smtpgw.close.com>"], "envelope": {"from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "subject": "Delivery Status Notification (Failure)", "message_id": "<636a7957.050a0220.76c16.8d69.GMR@mx.google.com>", "bcc": [], "date": "Tue, 08 Nov 2022 07:44:23 -0800 (PST)", "in_reply_to": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "cc": [], "reply_to": [], "is_autoreply": true, "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "_type": "Email", "date_created": "2022-11-08T15:44:23+00:00", "date_updated": "2022-11-08T16:28:55.347000+00:00", "to": ["iryna.grankova@globallogic.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: (no subject)
\nDate: Tue, 08 Nov 2022 15:44:18 +0000
\nTo: thedarkknight@close.com
\n
\nTest\"\"

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<636a7957.050a0220.76c16.8d69.GMR@mx.google.com>"], "created_by_name": null, "body_text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: (no subject)\nDate: Tue, 08 Nov 2022 15:44:18 +0000\nTo: thedarkknight@close.com\n\nTest", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: (no subject)
\nDate: Tue, 08 Nov 2022 15:44:18 +0000
\nTo: thedarkknight@close.com
\n
\nTest\"\"

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: (no subject)\nDate: Tue, 08 Nov 2022 15:44:18 +0000\nTo: thedarkknight@close.com\n\nTest"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": null, "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "need_smtp_credentials": false, "sender": "Mail Delivery Subsystem "}, "emitted_at": 1670413440848} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "template_id": null, "activity_at": "2022-11-08T15:44:17.803000+00:00", "subject": "(no subject)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "thedarkknight@close.com", "name": ""}], "subject": "(no subject)", "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_updated": "2022-11-09T11:12:59.685000+00:00", "to": ["thedarkknight@close.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": "Opened by thedarkknight@close.com (2022-11-09)", "date_sent": "2022-11-08T15:44:17.803000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Test"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792225784.2629.13990873364570888607@smtpgw.close.com>", "<166792225784.2629.12825104744076060180@smtpgw.close.com>"], "created_by_name": "Jean Lafleur", "body_text": "Test", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-09T11:12:59.685000+00:00", "ip_address": "85.209.47.207", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}], "cc": [], "body_html": "Test", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Test"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440850} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "updated_by": null, "id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "template_id": null, "activity_at": "2022-11-08T15:21:52+00:00", "subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1450, "content_type": "image/png", "filename": "icon.png", "content_id": "", "url": "https://s3.amazonaws.com/closeio-email/attachment/87491bb4cf503fcf54914e498f339ac980fc90291081a7befaf5b0036f9b30f2/icon.png"}], "references": ["<166792090941.10645.8722656406065573871@smtpgw.close.com>", "<166792090941.10645.3407832652098417673@smtpgw.close.com>"], "envelope": {"from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "subject": "Delivery Status Notification (Failure)", "message_id": "<636a7410.630a0220.27b8e.b6e2.GMR@mx.google.com>", "bcc": [], "date": "Tue, 08 Nov 2022 07:21:52 -0800 (PST)", "in_reply_to": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "cc": [], "reply_to": [], "is_autoreply": true, "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "_type": "Email", "date_created": "2022-11-08T15:21:52+00:00", "date_updated": "2022-11-08T15:22:03.515000+00:00", "to": ["iryna.grankova@airbyte.io"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Bluth Company (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 15:21:50 +0000
\nTo: Gob Bluth <bluth@close.com>
\n
\nHi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
\"\"

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<636a7410.630a0220.27b8e.b6e2.GMR@mx.google.com>"], "created_by_name": null, "body_text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Bluth Company (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 15:21:50 +0000\nTo: Gob Bluth \n\nHi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Bluth Company (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 15:21:50 +0000
\nTo: Gob Bluth <bluth@close.com>
\n
\nHi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
\"\"

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Bluth Company (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 15:21:50 +0000\nTo: Gob Bluth \n\nHi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": null, "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Mail Delivery Subsystem "}, "emitted_at": 1670413440852} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T15:21:48.934000+00:00", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T15:21:49.243000+00:00", "date_updated": "2022-11-08T15:22:03.271000+00:00", "to": ["Gob Bluth "], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by Gob Bluth (2022-11-08)", "date_sent": "2022-11-08T15:21:48.934000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
"}], "bulk_email_action_id": null, "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166792090941.10645.3407832652098417673@smtpgw.close.com>", "<166792090941.10645.8722656406065573871@smtpgw.close.com>"], "created_by_name": null, "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T15:21:52.108000+00:00", "ip_address": "66.249.92.23", "user_agent": "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", "opened_by": "Gob Bluth "}], "cc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "outgoing", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "updated_by_name": "Jean Lafleur", "sequence_name": "Sequence 1", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440854} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "updated_by": null, "id": "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "template_id": null, "activity_at": "2022-11-08T12:58:48+00:00", "subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1450, "content_type": "image/png", "filename": "icon.png", "content_id": "", "url": "https://s3.amazonaws.com/closeio-email/attachment/1f7e236c6d1c046b794138a33f88a568156b3843c5c27d3f8486c27e9fec346a/icon.png"}], "references": ["<166791232468.5302.12366928756676498962@smtpgw.close.com>", "<166791232468.5302.9789676641910298968@smtpgw.close.com>"], "envelope": {"from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "subject": "Delivery Status Notification (Failure)", "message_id": "<636a5288.170a0220.f87e2.10cf.GMR@mx.google.com>", "bcc": [], "date": "Tue, 08 Nov 2022 04:58:48 -0800 (PST)", "in_reply_to": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "cc": [], "reply_to": [], "is_autoreply": true, "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "_type": "Email", "date_created": "2022-11-08T12:58:48+00:00", "date_updated": "2022-11-08T13:00:58.801000+00:00", "to": ["iryna.grankova@airbyte.io"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 12:58:44 +0000
\nTo: bluth@close.com
\n
\nHi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<636a5288.170a0220.f87e2.10cf.GMR@mx.google.com>"], "created_by_name": null, "body_text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 12:58:44 +0000\nTo: bluth@close.com\n\nHi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 12:58:44 +0000
\nTo: bluth@close.com
\n
\nHi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 12:58:44 +0000\nTo: bluth@close.com\n\nHi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": null, "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Mail Delivery Subsystem "}, "emitted_at": 1670413440857} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "activity_at": "2022-11-08T12:58:44.679000+00:00", "subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "bluth@close.com", "name": ""}], "subject": "Airbyte Follow-up", "message_id": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 12:58:44 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T12:58:44.579000+00:00", "date_updated": "2022-11-08T12:58:47.565000+00:00", "to": ["bluth@close.com"], "has_reply": false, "send_as_id": null, "template_name": "Email 2 - Follow-up #1", "opens_summary": "Opened by bluth@close.com (2022-11-08)", "date_sent": "2022-11-08T12:58:44.679000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
"}], "bulk_email_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166791232468.5302.9789676641910298968@smtpgw.close.com>", "<166791232468.5302.12366928756676498962@smtpgw.close.com>"], "created_by_name": "Jean Lafleur", "body_text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T12:58:47.565000+00:00", "ip_address": "66.249.92.10", "user_agent": "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", "opened_by": "bluth@close.com"}], "cc": [], "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440859} +{"stream": "email_activities", "data": {"status": "inbox", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "updated_by": null, "id": "acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "template_id": null, "activity_at": "2022-11-08T12:56:55+00:00", "subject": "Delivery Status Notification (Failure)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [{"size": 1450, "content_type": "image/png", "filename": "icon.png", "content_id": "", "url": "https://s3.amazonaws.com/closeio-email/attachment/126941d2d18cb3a91e602dbe59eab599ee2f677694c80b32a48e93f805a500bb/icon.png"}], "references": ["<166791221256.1235.14063741572606059919@smtpgw.close.com>", "<166791221256.1235.11589873218010129427@smtpgw.close.com>"], "envelope": {"from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "subject": "Delivery Status Notification (Failure)", "message_id": "<636a5217.170a0220.675e1.11c0.GMR@mx.google.com>", "bcc": [], "date": "Tue, 08 Nov 2022 04:56:55 -0800 (PST)", "in_reply_to": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "cc": [], "reply_to": [], "is_autoreply": true, "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "_type": "Email", "date_created": "2022-11-08T12:56:55+00:00", "date_updated": "2022-11-08T13:00:57.698000+00:00", "to": ["iryna.grankova@airbyte.io"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 12:56:52 +0000
\nTo: thedarkknight@close.com
\n
\nHi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?\"\"

"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<636a5217.170a0220.675e1.11c0.GMR@mx.google.com>"], "created_by_name": null, "body_text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 12:56:52 +0000\nTo: thedarkknight@close.com\n\nHi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 12:56:52 +0000
\nTo: thedarkknight@close.com
\n
\nHi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?\"\"

", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 12:56:52 +0000\nTo: thedarkknight@close.com\n\nHi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": null, "direction": "incoming", "contact_id": null, "updated_by_name": null, "sequence_name": null, "sequence_id": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "need_smtp_credentials": false, "sender": "Mail Delivery Subsystem "}, "emitted_at": 1670413440861} +{"stream": "email_activities", "data": {"status": "draft", "body_preview": "Test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "template_id": null, "activity_at": "2022-11-08T12:55:49.388000+00:00", "subject": "Test", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "thedarkknight@close.com", "name": ""}], "subject": "Test", "message_id": null, "bcc": [], "date": "Tue, 08 Nov 2022 12:55:49 -0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T12:55:49.388000+00:00", "date_updated": "2022-11-08T12:55:54.125000+00:00", "to": ["thedarkknight@close.com"], "has_reply": false, "send_as_id": null, "template_name": null, "opens_summary": null, "date_sent": null, "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Test"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": [], "created_by_name": "Jean Lafleur", "body_text": "Test", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [], "cc": [], "body_html": "Test", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Test"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440863} +{"stream": "email_activities", "data": {"status": "sent", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "activity_at": "2022-11-08T12:56:52.538000+00:00", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "attachments": [], "references": [], "envelope": {"from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "to": [{"email": "thedarkknight@close.com", "name": ""}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "bcc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "in_reply_to": null, "cc": [], "reply_to": [], "is_autoreply": false, "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "_type": "Email", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_updated": "2022-11-08T15:43:38.471000+00:00", "to": ["thedarkknight@close.com"], "has_reply": false, "send_as_id": null, "template_name": "Email 1 - Intro", "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "date_sent": "2022-11-08T12:56:52.538000+00:00", "in_reply_to_id": null, "body_html_quoted": [{"expand": true, "html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?"}], "bulk_email_action_id": null, "sequence_subscription_id": null, "followup_sequence_id": null, "user_name": "Jean Lafleur", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "created_by_name": "Jean Lafleur", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "bcc": [], "send_attempts": [], "users": [], "opens": [{"opened_at": "2022-11-08T14:25:56.139000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T14:48:01.421000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T14:59:00.139000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T14:59:10.078000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T14:59:28.676000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:00:24.078000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:00:34.029000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:07:41.553000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:10:30.843000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:13:05.125000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:15:47.492000+00:00", "ip_address": "185.143.147.236", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}, {"opened_at": "2022-11-08T15:43:38.471000+00:00", "ip_address": "85.209.47.207", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42", "opened_by": "thedarkknight@close.com"}], "cc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "date_scheduled": null, "body_text_quoted": [{"expand": true, "text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?"}], "followup_sequence_delay": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "direction": "outgoing", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "updated_by_name": "Jean Lafleur", "sequence_name": null, "sequence_id": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "need_smtp_credentials": false, "sender": "Jean Lafleur "}, "emitted_at": 1670413440865} +{"stream": "email_thread_activities", "data": {"latest_emails": [{"sender": "'Close CRM' via Integration tests ", "id": "acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn", "cc": [], "status": "sent", "send_as_id": null, "envelope": {"message_id": "<162992613594.10130.17609834081606867635@closeio-tasktiger-other-7bd975b8f7-f5phd>", "sender": [{"name": "", "email": "support@close.com"}], "cc": [], "subject": "Your bulk edit for Airbyte is done", "bcc": [], "date": "Wed, 25 Aug 2021 21:15:36 +0000", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "integration-test@airbyte.io"}], "from": [{"name": "'Close CRM' via Integration tests", "email": "integration-test@airbyte.io"}], "reply_to": [{"name": "Close CRM", "email": "support@close.com"}]}, "date_updated": "2022-11-08T12:36:05.979000+00:00", "subject": "Your bulk edit for Airbyte is done", "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@cl", "date_created": "2021-08-25T21:15:36+00:00", "has_attachments": false, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": "2021-08-25T21:15:36+00:00", "opens_summary": null, "bcc": [], "direction": "outgoing", "to": ["integration-test@airbyte.io"]}, {"sender": "'Close CRM' via Integration tests ", "id": "acti_6pzzBcXnRUrC7ClGxkbfyifOL0tKELXmDQsGffzFx8N", "cc": [], "status": "sent", "send_as_id": null, "envelope": {"message_id": "<162992543485.16564.1574709800437653559@closeio-tasktiger-other-7bd975b8f7-x9jpv>", "sender": [{"name": "", "email": "support@close.com"}], "cc": [], "subject": "Your bulk edit for Airbyte is done", "bcc": [], "date": "Wed, 25 Aug 2021 21:03:54 +0000", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "integration-test@airbyte.io"}], "from": [{"name": "'Close CRM' via Integration tests", "email": "integration-test@airbyte.io"}], "reply_to": [{"name": "Close CRM", "email": "support@close.com"}]}, "date_updated": "2022-11-08T12:36:06.154000+00:00", "subject": "Your bulk edit for Airbyte is done", "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modifie", "date_created": "2021-08-25T21:03:54+00:00", "has_attachments": false, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": "2021-08-25T21:03:54+00:00", "opens_summary": null, "bcc": [], "direction": "outgoing", "to": ["integration-test@airbyte.io"]}], "participants": [{"name": "'Close CRM' via Integration tests", "email": "integration-test@airbyte.io"}], "_type": "EmailThread", "activity_at": "2021-08-25T21:15:36.001000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "latest_normalized_subject": "Your bulk edit for Airbyte is done", "updated_by": null, "created_by": null, "updated_by_name": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "contact_id": null, "date_updated": "2022-11-08T12:36:06.162000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "date_created": "2021-08-25T21:15:36.001000+00:00", "created_by_name": null, "n_emails": 2}, "emitted_at": 1670413442085} +{"stream": "email_thread_activities", "data": {"latest_emails": [{"sender": null, "id": "acti_8MOghgAFLMW70Zj8pMTUA0NozWrEKeyckt4kFJcx65L", "cc": [], "status": "draft", "send_as_id": null, "envelope": {"message_id": null, "sender": [], "cc": [], "subject": "Airbyte Follow-up", "bcc": [], "date": "Wed, 18 Aug 2021 10:35:50 -0000", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "bluth@close.com"}], "from": [], "reply_to": []}, "date_updated": "2021-08-18T10:36:10.974000+00:00", "subject": "Airbyte Follow-up", "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "date_created": "2021-08-18T10:35:50.165000+00:00", "has_attachments": false, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": null, "opens_summary": null, "bcc": [], "direction": "outgoing", "to": ["bluth@close.com"]}], "participants": [], "_type": "EmailThread", "activity_at": "2021-08-18T10:35:50.166000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "latest_normalized_subject": "Airbyte Follow-up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "acti_XFp5upc2w8MawOLJ89I5LNlWOYcJLBrHp6UOFOTfN0T", "contact_id": null, "date_updated": "2021-08-18T10:36:10.989000+00:00", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "date_created": "2021-08-18T10:35:50.166000+00:00", "created_by_name": "Jean Lafleur", "n_emails": 1}, "emitted_at": 1670413442090} +{"stream": "email_thread_activities", "data": {"latest_emails": [{"sender": "Irina Grankova ", "id": "acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z", "cc": [], "status": "inbox", "send_as_id": null, "envelope": {"message_id": "<56EC0E81-FE10-40C6-ACF8-8B448B510DFD@gmail.com>", "sender": [{"name": "Irina Grankova", "email": "irina.grankova@gmail.com"}], "cc": [], "subject": "Pic", "bcc": [], "date": "Mon, 26 Jul 2021 12:08:50 +0300", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "iryna.grankova@globallogic.com"}], "from": [{"name": "Irina Grankova", "email": "irina.grankova@gmail.com"}], "reply_to": []}, "date_updated": "2022-11-08T15:58:52.093000+00:00", "subject": "Pic", "body_preview": null, "date_created": "2021-07-26T09:08:50+00:00", "has_attachments": true, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": null, "opens_summary": null, "bcc": [], "direction": "incoming", "to": ["iryna.grankova@globallogic.com"]}], "participants": [{"name": "Irina Grankova", "email": "irina.grankova@gmail.com"}], "_type": "EmailThread", "activity_at": "2021-07-26T09:08:50.001000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "latest_normalized_subject": "Pic", "updated_by": null, "created_by": null, "updated_by_name": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "acti_v9S0gdPWzRUqjj2taSmmdfigKanA9tThaFe46FtcXGO", "contact_id": null, "date_updated": "2022-11-08T15:58:52.098000+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "date_created": "2021-07-26T09:08:50.001000+00:00", "created_by_name": null, "n_emails": 1}, "emitted_at": 1670413442093} +{"stream": "email_thread_activities", "data": {"latest_emails": [{"sender": "Steli Efti ", "id": "acti_Ags7x68KOMv3dKgtYWmrdFNCn16g0Wns0HSCY5L5nIm", "cc": [], "status": "inbox", "send_as_id": null, "envelope": {"message_id": "<162617634412.13.2638379749228562382@closeio-web-85678dcd7b-xdcf7>", "sender": [{"name": "Steli Efti", "email": "sales@close.com"}], "cc": [], "subject": "Welcome to Close, Jean!", "bcc": [], "date": "Tue, 13 Jul 2021 11:39:04 +0000", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "integration-test@airbyte.io"}], "from": [{"name": "Steli Efti", "email": "sales@close.com"}], "reply_to": [{"name": "", "email": "sales@close.com"}]}, "date_updated": "2021-07-13T11:39:04.130000+00:00", "subject": "Welcome to Close, Jean!", "body_preview": "Hi Jean!\n\nYou can send, receive, and track your email conversations all within Close.\n\nTry sending an outgoing email - click on the reply arrow and use an Email Templat", "date_created": "2021-07-13T11:39:04.130000+00:00", "has_attachments": false, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": null, "opens_summary": null, "bcc": [], "direction": "incoming", "to": ["integration-test@airbyte.io"]}], "participants": [{"name": "Steli Efti", "email": "sales@close.com"}], "_type": "EmailThread", "activity_at": "2021-07-13T11:39:04.131000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "latest_normalized_subject": "Welcome to Close, Jean!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "acti_dtGBVpRrqQszIPQgvEhqTGBz3fA5PYptEc4lmVWNUKm", "contact_id": null, "date_updated": "2021-07-13T11:39:04.134000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "date_created": "2021-07-13T11:39:04.131000+00:00", "created_by_name": "Jean Lafleur", "n_emails": 1}, "emitted_at": 1670413442097} +{"stream": "email_thread_activities", "data": {"latest_emails": [{"sender": "bluth@close.com", "id": "acti_T0UrwXOaxgA0kzhGA5Zx0hDWgP7sy5ihKRivMlQWsLV", "cc": [], "status": "inbox", "send_as_id": null, "envelope": {"message_id": "<162617634457.13.866605428580538299@closeio-web-85678dcd7b-xdcf7>", "sender": [{"name": "", "email": "bluth@close.com"}], "cc": [], "subject": "Missed call", "bcc": [], "date": "Tue, 13 Jul 2021 11:39:04 +0000", "in_reply_to": null, "is_autoreply": false, "to": [{"name": "", "email": "integration-test@airbyte.io"}], "from": [{"name": "", "email": "bluth@close.com"}], "reply_to": []}, "date_updated": "2021-07-13T11:39:04.586000+00:00", "subject": "Missed call", "body_preview": "Hi Jean!\n\nI just saw your missed call. Sorry, I've been working hard on my illusions. Will call you back when I'm free.\n\nJust wanted to let you know, I'm still interested in your offer. Hope I'm not m", "date_created": "2021-07-05T11:39:00.850000+00:00", "has_attachments": false, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_sent": null, "opens_summary": null, "bcc": [], "direction": "incoming", "to": ["integration-test@airbyte.io"]}], "participants": [{"name": "", "email": "bluth@close.com"}], "_type": "EmailThread", "activity_at": "2021-07-05T11:39:00.851000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "latest_normalized_subject": "Missed call", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "acti_FrMniUW4fyqPxIyOEuuZN2QzkJF5tY3Ny2Q1nhimPEK", "contact_id": null, "date_updated": "2021-07-13T11:39:04.591000+00:00", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "date_created": "2021-07-05T11:39:00.851000+00:00", "created_by_name": "Jean Lafleur", "n_emails": 1}, "emitted_at": 1670413442100} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T12:54:23.168000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "activity_at": "2022-11-09T12:54:23.168000+00:00", "date_updated": "2022-11-09T13:39:37.579000+00:00", "latest_emails": [{"date_created": "2022-11-09T12:54:03.668000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "bcc": [], "to": ["irina.grankova@gmail.com"], "date_sent": "2022-11-09T12:54:23.167000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-09T13:39:37.547000+00:00", "subject": "Test Lead + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Test Lead + Airbyte", "in_reply_to": null, "cc": [], "date": "Wed, 09 Nov 2022 12:54:23 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "irina.grankova@gmail.com", "name": ""}], "message_id": "<166799846322.15922.4962027989641879748@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "send_as_id": null}], "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Test Lead + Airbyte", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "_type": "EmailThread"}, "emitted_at": 1670413442737} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T12:42:01.001000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-09T12:42:01.001000+00:00", "date_updated": "2022-11-09T12:42:06.826000+00:00", "latest_emails": [{"date_created": "2022-11-09T12:42:01+00:00", "direction": "incoming", "cc": [], "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "bcc": [], "to": ["iryna.grankova@airbyte.io"], "date_sent": null, "has_attachments": true, "sender": "irina.grankova@gmail.com", "date_updated": "2022-11-09T12:42:06.821000+00:00", "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "envelope": {"reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "in_reply_to": null, "cc": [], "date": "Wed, 09 Nov 2022 12:42:01 +0000", "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "bcc": [], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "message_id": "<000000000000a8d33605ed08fb3c@google.com>", "from": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb", "send_as_id": null}], "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": null, "latest_normalized_subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "_type": "EmailThread"}, "emitted_at": 1670413442739} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T12:32:37.001000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:32:49.517000+00:00", "latest_emails": [{"date_created": "2022-11-09T12:32:37+00:00", "direction": "incoming", "cc": [], "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "bcc": [], "to": ["iryna.grankova@globallogic.com"], "date_sent": null, "has_attachments": true, "sender": "irina.grankova@gmail.com", "date_updated": "2022-11-09T12:32:49.511000+00:00", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "envelope": {"reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "in_reply_to": null, "cc": [], "date": "Wed, 09 Nov 2022 12:32:37 +0000", "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "bcc": [], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "message_id": "<0000000000000d111305ed08dada@google.com>", "from": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa", "send_as_id": null}], "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": null, "latest_normalized_subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "_type": "EmailThread"}, "emitted_at": 1670413442742} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T11:30:58.001000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-09T11:30:58.001000+00:00", "date_updated": "2022-11-09T11:31:11.934000+00:00", "latest_emails": [{"date_created": "2022-11-09T11:30:58+00:00", "direction": "incoming", "cc": [], "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "bcc": [], "to": ["iryna.grankova@globallogic.com"], "date_sent": null, "has_attachments": true, "sender": "irina.grankova@gmail.com", "date_updated": "2022-11-09T11:31:11.927000+00:00", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "envelope": {"reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "is_autoreply": true, "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "in_reply_to": null, "cc": [], "date": "Wed, 09 Nov 2022 11:30:58 +0000", "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "bcc": [], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "message_id": "<0000000000009b99c605ed07fdaf@google.com>", "from": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ", "send_as_id": null}], "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": null, "latest_normalized_subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "_type": "EmailThread"}, "emitted_at": 1670413442744} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T11:28:52.001000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-09T11:28:52.001000+00:00", "date_updated": "2022-11-09T11:29:03.351000+00:00", "latest_emails": [{"date_created": "2022-11-09T11:28:52+00:00", "direction": "incoming", "cc": [], "body_preview": "Test\n\n\n", "bcc": [], "to": ["integration-test@airbyte.io"], "date_sent": null, "has_attachments": false, "sender": "Irina Grankova ", "date_updated": "2022-11-09T11:29:03.346000+00:00", "subject": "Test", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Test", "in_reply_to": null, "cc": [], "date": "Wed, 9 Nov 2022 13:28:52 +0200", "sender": [{"email": "globallogic@airbyte.io", "name": ""}], "bcc": [], "to": [{"email": "integration-test@airbyte.io", "name": ""}], "message_id": "", "from": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq", "send_as_id": null}], "participants": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": null, "latest_normalized_subject": "Test", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "_type": "EmailThread"}, "emitted_at": 1670413442745} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-09T11:25:32.265000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "activity_at": "2022-11-09T11:25:32.265000+00:00", "date_updated": "2022-11-09T11:29:01.514000+00:00", "latest_emails": [{"date_created": "2022-11-09T11:25:17.425000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "bcc": [], "to": ["irina.grankova@gmail.com"], "date_sent": "2022-11-09T11:25:32.264000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-09T11:29:01.481000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Wed, 09 Nov 2022 11:25:32 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "irina.grankova@gmail.com", "name": ""}], "message_id": "<166799313228.17776.4777225093537029355@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "send_as_id": null}], "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "_type": "EmailThread"}, "emitted_at": 1670413442747} +{"stream": "email_thread_activities", "data": {"n_emails": 4, "date_created": "2022-11-08T17:53:35.312000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-08T17:53:35.312000+00:00", "date_updated": "2022-11-09T02:40:26.451000+00:00", "latest_emails": [{"date_created": "2022-11-08T17:53:35.598000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "bcc": [], "to": ["Steli Efti "], "date_sent": "2022-11-08T17:53:35.311000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-09T02:40:26.387000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Close (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "sales@close.com", "name": "Steli Efti"}], "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "send_as_id": null}, {"date_created": "2022-11-08T17:41:58.589000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "bcc": [], "to": ["Support "], "date_sent": "2022-11-08T17:41:58.196000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T17:42:03.103000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Close (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 17:41:59 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "support@close.com", "name": "Support"}], "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Support (2 times, latest 2022-11-08)", "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "send_as_id": null}, {"date_created": "2022-11-08T17:15:11.656000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "bcc": [], "to": ["Nick Persico "], "date_sent": "2022-11-08T17:15:11.279000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T17:15:14.724000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Close (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 17:15:12 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "nick@close.com", "name": "Nick Persico"}], "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Nick Persico (2022-11-08)", "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "send_as_id": null}, {"date_created": "2022-11-08T17:12:07.975000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "bcc": [], "to": ["Customer Success Team "], "date_sent": "2022-11-08T17:12:07.625000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T17:12:12.687000+00:00", "subject": "Close (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Close (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 17:12:08 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "success@close.com", "name": "Customer Success Team"}], "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Customer Success Team (2 times, latest 2022-11-08)", "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "send_as_id": null}], "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "_type": "EmailThread"}, "emitted_at": 1670413442749} +{"stream": "email_thread_activities", "data": {"n_emails": 4, "date_created": "2022-11-08T16:48:47.167000+00:00", "created_by": null, "created_by_name": null, "activity_at": "2022-11-08T16:48:47.167000+00:00", "date_updated": "2022-11-09T02:40:26.467000+00:00", "latest_emails": [{"date_created": "2022-11-08T16:48:47.552000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "bcc": [], "to": ["Support "], "date_sent": "2022-11-08T16:48:47.166000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T16:50:41.545000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 16:48:48 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "support@close.com", "name": "Support"}], "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Support (2022-11-08)", "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "send_as_id": null}, {"date_created": "2022-11-08T16:36:07.646000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "bcc": [], "to": ["Steli Efti "], "date_sent": "2022-11-08T16:36:07.226000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-09T02:40:26.385000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "sales@close.com", "name": "Steli Efti"}], "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "send_as_id": null}, {"date_created": "2022-11-08T16:24:31.650000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "bcc": [], "to": ["Customer Success Team "], "date_sent": "2022-11-08T16:24:31.194000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T16:24:37.393000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 16:24:32 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "success@close.com", "name": "Customer Success Team"}], "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Customer Success Team (2022-11-08)", "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "send_as_id": null}, {"date_created": "2022-11-08T16:23:04.668000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "bcc": [], "to": ["Nick Persico "], "date_sent": "2022-11-08T16:23:04.323000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T20:44:30.910000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 16:23:05 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "nick@close.com", "name": "Nick Persico"}], "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Nick Persico (2022-11-08)", "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "send_as_id": null}], "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "_type": "EmailThread"}, "emitted_at": 1670413442752} +{"stream": "email_thread_activities", "data": {"n_emails": 6, "date_created": "2022-11-08T16:09:09.001000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "activity_at": "2022-11-08T16:09:09.001000+00:00", "date_updated": "2022-11-08T16:28:54.150000+00:00", "latest_emails": [{"date_created": "2022-11-08T16:09:09+00:00", "direction": "incoming", "cc": [], "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/", "bcc": [], "to": ["iryna.grankova@globallogic.com"], "date_sent": null, "has_attachments": true, "sender": "Mail Delivery Subsystem ", "date_updated": "2022-11-08T16:28:54.140000+00:00", "subject": "Delivery Status Notification (Failure)", "envelope": {"reply_to": [], "is_autoreply": true, "subject": "Delivery Status Notification (Failure)", "in_reply_to": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "cc": [], "date": "Tue, 08 Nov 2022 08:09:09 -0800 (PST)", "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "bcc": [], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "message_id": "<636a7f25.c80a0220.659b6.8bba.GMR@mx.google.com>", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "send_as_id": null}, {"date_created": "2022-11-08T16:09:04.170000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Th", "bcc": [], "to": ["Tobias F\u00fcnke "], "date_sent": "2022-11-08T16:09:03.809000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T16:09:05.758000+00:00", "subject": "Airbyte Follow-up", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Airbyte Follow-up", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 16:09:04 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}], "message_id": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "send_as_id": null}, {"date_created": "2022-11-08T15:21:52+00:00", "direction": "incoming", "cc": [], "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "bcc": [], "to": ["iryna.grankova@airbyte.io"], "date_sent": null, "has_attachments": true, "sender": "Mail Delivery Subsystem ", "date_updated": "2022-11-08T15:22:03.515000+00:00", "subject": "Delivery Status Notification (Failure)", "envelope": {"reply_to": [], "is_autoreply": true, "subject": "Delivery Status Notification (Failure)", "in_reply_to": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "cc": [], "date": "Tue, 08 Nov 2022 07:21:52 -0800 (PST)", "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "bcc": [], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "message_id": "<636a7410.630a0220.27b8e.b6e2.GMR@mx.google.com>", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "send_as_id": null}, {"date_created": "2022-11-08T15:21:49.243000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "bcc": [], "to": ["Gob Bluth "], "date_sent": "2022-11-08T15:21:48.934000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T15:22:03.271000+00:00", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}], "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by Gob Bluth (2022-11-08)", "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "send_as_id": null}, {"date_created": "2022-11-08T12:58:48+00:00", "direction": "incoming", "cc": [], "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "bcc": [], "to": ["iryna.grankova@airbyte.io"], "date_sent": null, "has_attachments": true, "sender": "Mail Delivery Subsystem ", "date_updated": "2022-11-08T13:00:58.801000+00:00", "subject": "Delivery Status Notification (Failure)", "envelope": {"reply_to": [], "is_autoreply": true, "subject": "Delivery Status Notification (Failure)", "in_reply_to": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "cc": [], "date": "Tue, 08 Nov 2022 04:58:48 -0800 (PST)", "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "bcc": [], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "message_id": "<636a5288.170a0220.f87e2.10cf.GMR@mx.google.com>", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "send_as_id": null}], "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "_type": "EmailThread"}, "emitted_at": 1670413442754} +{"stream": "email_thread_activities", "data": {"n_emails": 4, "date_created": "2022-11-08T15:44:23.001000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "activity_at": "2022-11-08T15:44:23.001000+00:00", "date_updated": "2022-11-09T11:12:59.711000+00:00", "latest_emails": [{"date_created": "2022-11-08T15:44:23+00:00", "direction": "incoming", "cc": [], "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.co", "bcc": [], "to": ["iryna.grankova@globallogic.com"], "date_sent": null, "has_attachments": true, "sender": "Mail Delivery Subsystem ", "date_updated": "2022-11-08T16:28:55.347000+00:00", "subject": "Delivery Status Notification (Failure)", "envelope": {"reply_to": [], "is_autoreply": true, "subject": "Delivery Status Notification (Failure)", "in_reply_to": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "cc": [], "date": "Tue, 08 Nov 2022 07:44:23 -0800 (PST)", "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "bcc": [], "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}], "message_id": "<636a7957.050a0220.76c16.8d69.GMR@mx.google.com>", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "send_as_id": null}, {"date_created": "2022-11-08T15:43:48.819000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Test", "bcc": [], "to": ["thedarkknight@close.com"], "date_sent": "2022-11-08T15:44:17.803000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-09T11:12:59.685000+00:00", "subject": "(no subject)", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "(no subject)", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "thedarkknight@close.com", "name": ""}], "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by thedarkknight@close.com (2022-11-09)", "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "send_as_id": null}, {"date_created": "2022-11-08T12:56:55+00:00", "direction": "incoming", "cc": [], "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "bcc": [], "to": ["iryna.grankova@airbyte.io"], "date_sent": null, "has_attachments": true, "sender": "Mail Delivery Subsystem ", "date_updated": "2022-11-08T13:00:57.698000+00:00", "subject": "Delivery Status Notification (Failure)", "envelope": {"reply_to": [], "is_autoreply": true, "subject": "Delivery Status Notification (Failure)", "in_reply_to": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "cc": [], "date": "Tue, 08 Nov 2022 04:56:55 -0800 (PST)", "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "bcc": [], "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}], "message_id": "<636a5217.170a0220.675e1.11c0.GMR@mx.google.com>", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}]}, "status": "inbox", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "send_as_id": null}, {"date_created": "2022-11-08T12:54:51.103000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "bcc": [], "to": ["thedarkknight@close.com"], "date_sent": "2022-11-08T12:56:52.538000+00:00", "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T15:43:38.471000+00:00", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "thedarkknight@close.com", "name": ""}], "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "sent", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "send_as_id": null}], "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "_type": "EmailThread"}, "emitted_at": 1670413442756} +{"stream": "email_thread_activities", "data": {"n_emails": 1, "date_created": "2022-11-08T12:55:49.389000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "activity_at": "2022-11-08T12:55:49.389000+00:00", "date_updated": "2022-11-08T12:55:54.142000+00:00", "latest_emails": [{"date_created": "2022-11-08T12:55:49.388000+00:00", "direction": "outgoing", "cc": [], "body_preview": "Test", "bcc": [], "to": ["thedarkknight@close.com"], "date_sent": null, "has_attachments": false, "sender": "Jean Lafleur ", "date_updated": "2022-11-08T12:55:54.125000+00:00", "subject": "Test", "envelope": {"reply_to": [], "is_autoreply": false, "subject": "Test", "in_reply_to": null, "cc": [], "date": "Tue, 08 Nov 2022 12:55:49 -0000", "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "bcc": [], "to": [{"email": "thedarkknight@close.com", "name": ""}], "message_id": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "status": "draft", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opens_summary": null, "id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "send_as_id": null}], "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"], "updated_by_name": "Jean Lafleur", "latest_normalized_subject": "Test", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": null, "id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "_type": "EmailThread"}, "emitted_at": 1670413442758} +{"stream": "lead_status_change_activities", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-25T21:15:35.163000+00:00", "user_name": "Jean Lafleur", "created_by_name": "Jean Lafleur", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date_created": "2021-08-25T21:15:35.163000+00:00", "new_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "id": "acti_wSO4ltT4XHGI6wkN2oCZpRdCtw1ALhsRttt8osqVjll", "users": [], "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "contact_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "new_status_label": "Interested", "activity_at": "2021-08-25T21:15:35.163000+00:00", "_type": "LeadStatusChange", "old_status_label": "Potential"}, "emitted_at": 1670413444004} +{"stream": "lead_status_change_activities", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-25T21:15:34.607000+00:00", "user_name": "Jean Lafleur", "created_by_name": "Jean Lafleur", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2021-08-25T21:15:34.607000+00:00", "new_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "id": "acti_T4XA2LBQYvrqAimflFjU2KXY0I2g1BPbOUn2jHZ59Dj", "users": [], "old_status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "contact_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "new_status_label": "Interested", "activity_at": "2021-08-25T21:15:34.607000+00:00", "_type": "LeadStatusChange", "old_status_label": "Qualified"}, "emitted_at": 1670413444007} +{"stream": "lead_status_change_activities", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-25T21:15:34.044000+00:00", "user_name": "Jean Lafleur", "created_by_name": "Jean Lafleur", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-08-25T21:15:34.044000+00:00", "new_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "id": "acti_udWvk5RJ6SFuO9Ra6d1pAJg200Q0Zyq43kEq0FpceIx", "users": [], "old_status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "contact_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "new_status_label": "Interested", "activity_at": "2021-08-25T21:15:34.044000+00:00", "_type": "LeadStatusChange", "old_status_label": "Qualified"}, "emitted_at": 1670413444009} +{"stream": "lead_status_change_activities", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:04.731000+00:00", "user_name": "Jean Lafleur", "created_by_name": "Jean Lafleur", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_created": "2021-07-13T11:39:04.731000+00:00", "new_status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "id": "acti_tEDQ45T1El5ilMfcT0G579AHnvsfTDqAd7KXBKbxbNV", "users": [], "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "contact_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "new_status_label": "Qualified", "activity_at": "2021-07-13T11:39:04.731000+00:00", "_type": "LeadStatusChange", "old_status_label": "Potential"}, "emitted_at": 1670413444011} +{"stream": "lead_status_change_activities", "data": {"created_by_name": "Jean Lafleur", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "_type": "LeadStatusChange", "contact_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_updated": "2022-11-09T11:25:53.697000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "updated_by_name": "Jean Lafleur", "id": "acti_8ygqbcNLU7NG3a6koeZKmfOGmaigvifz4IaeQpMbAcc", "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "old_status_label": "Potential", "new_status_label": "Interested", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-09T11:25:53.697000+00:00", "users": [], "activity_at": "2022-11-09T11:25:53.697000+00:00", "new_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q"}, "emitted_at": 1670413444720} +{"stream": "sms_activities", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "local_phone_formatted": "+1 415-444-5555", "attachments": [], "local_country_iso": "US", "template_id": null, "id": "acti_GIVSys3F0wFeA519lDa5QKRfYOPgskyqKj2aXiCMSEO", "date_sent": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "local_phone": "+14154445555", "status": "draft", "_type": "SMS", "remote_phone_formatted": "+1 202-555-0186", "sequence_subscription_id": null, "remote_country_iso": "US", "error_message": null, "user_name": "Jean Lafleur", "date_created": "2021-08-11T18:14:32.750000+00:00", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date_updated": "2021-08-11T18:14:32.750000+00:00", "source": "Close.io", "created_by_name": "Jean Lafleur", "activity_at": "2021-08-11T18:14:32.750000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "updated_by_name": "Jean Lafleur", "direction": "outbound", "remote_phone": "+12025550186", "cost": null, "text": "Hi! This is a reminder that we have a call scheduled for 12pm PT today.", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_scheduled": null}, "emitted_at": 1670413445927} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "_type": "SMS", "date_created": "2022-11-09T14:02:18.756000+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-09T14:02:18.756000+00:00", "id": "acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4", "status": "draft", "text": "Hi!", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-09T14:02:24.943000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": null}, "emitted_at": 1670413446870} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "_type": "SMS", "date_created": "2022-11-09T12:54:15.456000+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "attachments": [{"media_id": "media_580CfGelcIvP5BzvIYTlhX", "url": "https://app.close.com/go/sms/acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP/media/media_580CfGelcIvP5BzvIYTlhX/", "thumbnail_url": "https://app.close.com/go/sms/acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP/media/media_580CfGelcIvP5BzvIYTlhX/thumbnail/", "content_type": "image/png", "size": 6132, "filename": "Airbyte_logo_75x75.png"}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-09T12:54:44.404000+00:00", "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "status": "sent", "text": "Hi!", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-09T12:54:44.405000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": "3", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-09T12:54:44.404000+00:00"}, "emitted_at": 1670413446878} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "", "_type": "SMS", "date_created": "2022-11-08T15:59:38.497000+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-08T15:59:59.614000+00:00", "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "status": "sent", "text": "Test text message", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-08T15:59:59.614000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": "1", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-08T15:59:59.614000+00:00"}, "emitted_at": 1670413446885} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "_type": "SMS", "date_created": "2022-11-08T15:44:42.011000+00:00", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-08T15:45:04.639000+00:00", "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "status": "sent", "text": "Hi!", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-08T15:45:04.640000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": "1", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-08T15:45:04.639000+00:00"}, "emitted_at": 1670413446889} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "", "_type": "SMS", "date_created": "2022-11-08T15:01:55.510000+00:00", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-09T07:00:01.850000+00:00", "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "status": "sent", "text": "Test message", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-09T07:00:01.850000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": "1", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": "2022-11-09T07:00:00+00:00", "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-09T07:00:01.850000+00:00"}, "emitted_at": 1670413446893} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "", "_type": "SMS", "date_created": "2022-11-08T15:01:20.794000+00:00", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "remote_phone_formatted": "+1 415-623-6785", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-08T15:01:40.416000+00:00", "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "status": "sent", "text": "Test sms", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-08T15:01:40.416000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+14156236785", "created_by_name": "Jean Lafleur", "cost": "1", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-08T15:01:40.416000+00:00"}, "emitted_at": 1670413446896} +{"stream": "sms_activities", "data": {"user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "template_id": "", "_type": "SMS", "date_created": "2022-11-08T12:57:17.961000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "remote_phone_formatted": "+1 650-517-6539", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "remote_country_iso": "US", "direction": "outbound", "activity_at": "2022-11-08T12:57:39.721000+00:00", "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "status": "sent", "text": "Test sms", "source": "Close.io", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "local_phone": "+14156251293", "date_updated": "2022-11-08T12:57:39.721000+00:00", "local_phone_formatted": "+1 415-625-1293", "updated_by_name": "Jean Lafleur", "remote_phone": "+16505176539", "created_by_name": "Jean Lafleur", "cost": "1", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "sequence_id": null, "sequence_subscription_id": null, "date_scheduled": null, "error_message": null, "local_country_iso": "US", "date_sent": "2022-11-08T12:57:39.721000+00:00"}, "emitted_at": 1670413446899} +{"stream": "task_completed_activities", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "users": [], "_type": "TaskCompleted", "activity_at": "2021-08-18T10:31:52.002000+00:00", "updated_by_name": "Jean Lafleur", "task_id": "task_7kpMfXIPms858l9GKZTo3BCtVflvcIsOYPXL8mZgzyp", "date_updated": "2021-08-18T10:31:52.002000+00:00", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "date_created": "2021-08-18T10:31:52.002000+00:00", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "id": "acti_gdh0Iw30XYfKhKctrqPuxAbNghsxlDBDFaN8k35ZAxf", "created_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "task_text": "Send Steli an email", "task_assigned_to_name": "Jean Lafleur"}, "emitted_at": 1670413448078} +{"stream": "task_completed_activities", "data": {"task_id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "task_assigned_to_name": "Jean Lafleur", "id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "activity_at": "2022-11-09T12:44:26.185000+00:00", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "users": [], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "_type": "TaskCompleted", "created_by_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-09T12:44:26.185000+00:00", "updated_by_name": "Jean Lafleur", "task_text": "Follow up", "date_updated": "2022-11-09T12:44:26.185000+00:00"}, "emitted_at": 1670413448695} +{"stream": "task_completed_activities", "data": {"task_id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "task_assigned_to_name": "Jean Lafleur", "id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "activity_at": "2022-11-09T11:06:11.134000+00:00", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "users": [], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "_type": "TaskCompleted", "created_by_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-09T11:06:11.134000+00:00", "updated_by_name": "Jean Lafleur", "task_text": "Follow up", "date_updated": "2022-11-09T11:06:11.134000+00:00"}, "emitted_at": 1670413448697} +{"stream": "task_completed_activities", "data": {"task_id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "task_assigned_to_name": "Jean Lafleur", "id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "activity_at": "2022-11-09T10:57:24.688000+00:00", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "users": [], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "_type": "TaskCompleted", "created_by_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-09T10:57:24.688000+00:00", "updated_by_name": "Jean Lafleur", "task_text": "Follow up", "date_updated": "2022-11-09T10:57:24.688000+00:00"}, "emitted_at": 1670413448699} +{"stream": "task_completed_activities", "data": {"task_id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "task_assigned_to_name": "Jean Lafleur", "id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "activity_at": "2022-11-08T12:21:15.641000+00:00", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "users": [], "user_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "_type": "TaskCompleted", "created_by_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:21:15.641000+00:00", "updated_by_name": "Jean Lafleur", "task_text": "Call Steli", "date_updated": "2022-11-08T12:21:15.641000+00:00"}, "emitted_at": 1670413448700} +{"stream": "leads", "data": {"custom": {}, "opportunities": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Alex"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": null, "description": "", "date_updated": "2022-07-05T21:01:25.658000+00:00", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "addresses": [], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-07-05T21:01:25.612000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Cooper"}], "display_name": "Cooper", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_Dsi7AGMRelIZ2I6DIKicaGJU7mwxPZElLIHy33xbjCM", "emails": [], "phones": [], "urls": [], "date_updated": "2022-07-05T21:01:25.612000+00:00", "title": "", "name": "Cooper", "lead_id": "lead_Eohw2Vf6WOKZHQ97nS1UTL3iV62pAJFX3ROgJ5WT4cY"}], "name": "Alex", "html_url": "https://app.close.com/lead/lead_Eohw2Vf6WOKZHQ97nS1UTL3iV62pAJFX3ROgJ5WT4cY/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-07-05T21:01:25.608000+00:00", "display_name": "Alex", "id": "lead_Eohw2Vf6WOKZHQ97nS1UTL3iV62pAJFX3ROgJ5WT4cY", "status_label": "Potential", "tasks": []}, "emitted_at": 1670413450884} +{"stream": "leads", "data": {"custom": {"Current Vendor/Software": "BiffCo", "Industry": "Real estate", "Lead Owner": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "Referral Source": "Google Search"}, "opportunities": [{"integration_links": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_display_name": "Demo Completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "value_formatted": "$3,000", "annualized_value": 300000, "value_currency": "USD", "contact_id": null, "confidence": 75, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:04.817000+00:00", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "updated_by_name": "Jean Lafleur", "value_period": "one_time", "note": "Gob's ready to buy a $3,000 suit.", "user_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.817000+00:00", "status_label": "Demo Completed", "contact_name": null, "status_type": "active", "annualized_expected_value": 225000, "id": "oppo_NkKuhUWfDoErNArh44hw7jkkx7sCl5bhlamtezmX7BE", "value": 300000, "lead_name": "Bluth Company (Example\u00a0Lead)", "date_won": "2021-07-16", "expected_value": 225000, "date_lost": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Bluth%20Company%20%28Example%C2%A0Lead%29"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": null, "description": null, "date_updated": "2022-11-08T16:28:54.174000+00:00", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "addresses": [{"address_1": "100 Bluth Drive", "zipcode": "90210", "city": "Los Angeles", "country": "US", "label": "business", "address_2": null, "state": "CA"}], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.430000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Gob%20Bluth"}], "display_name": "Gob Bluth", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "emails": [{"email": "bluth@close.com", "type": "office"}], "phones": [{"type": "office", "phone": "+12025550186", "country": "US", "phone_formatted": "+1 202-555-0186"}], "urls": [], "date_updated": "2021-07-13T11:39:04.430000+00:00", "title": "Magician", "name": "Gob Bluth", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Gatekeeper"]}, {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.441000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Tobias%20F%C3%BCnke"}], "display_name": "Tobias F\u00fcnke", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "emails": [{"email": "tobiasfunke@close.com", "type": "office"}], "phones": [], "urls": [], "date_updated": "2021-07-13T11:39:04.441000+00:00", "title": "Blue Man Group (Understudy)", "name": "Tobias F\u00fcnke", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Point of Contact"]}], "name": "Bluth Company (Example\u00a0Lead)", "html_url": "https://app.close.com/lead/lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-05T11:39:00.850000+00:00", "display_name": "Bluth Company (Example\u00a0Lead)", "id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "status_label": "Interested", "tasks": [], "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "BiffCo", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Real estate", "custom.cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Google Search"}, "emitted_at": 1670413450892} +{"stream": "leads", "data": {"custom": {"Current Vendor/Software": "Stark Industries", "Industry": "Software", "Lead Owner": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "Referral Source": "Website"}, "opportunities": [{"integration_links": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_display_name": "Proposal Sent", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "value_formatted": "$500", "annualized_value": 50000, "value_currency": "USD", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "confidence": 75, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-18T10:26:44.306000+00:00", "status_id": "stat_AWXzFJkvkHVyJQPFulY0wM7LrQRiMEtQChGumG035bH", "updated_by_name": "Jean Lafleur", "value_period": "one_time", "note": "Use opportunities to track which stage of the pipeline your deals are in and the revenue associated with them.", "user_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.284000+00:00", "status_label": "Proposal Sent", "contact_name": "Steli Efti", "status_type": "active", "annualized_expected_value": 37500, "id": "oppo_1TfmaSLuECcdSQIBnjUOBj1gAXdyrp4SFaogvcEmtbk", "value": 50000, "lead_name": "Close (Example\u00a0Lead)", "date_won": "2021-07-15", "expected_value": 37500, "date_lost": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Close%20%28Example%C2%A0Lead%29"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": "https://close.com", "description": "Visit our blog for high quality sales content, blog.close.com!", "date_updated": "2022-11-09T02:40:26.489000+00:00", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "addresses": [{"address_1": "PO Box 7775 #69574", "zipcode": "94120", "city": "San Francisco", "country": "US", "label": "mailing", "address_2": null, "state": "CA"}], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.354000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Steli%20Efti"}], "display_name": "Steli Efti", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "emails": [{"email": "sales@close.com", "type": "office"}], "phones": [{"type": "office", "phone": "+16505176539", "country": "US", "phone_formatted": "+1 650-517-6539"}], "urls": [], "date_updated": "2021-07-13T11:39:03.354000+00:00", "title": "CEO & Co-Founder", "name": "Steli Efti", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"]}, {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.366000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Nick%20Persico"}], "display_name": "Nick Persico", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "emails": [{"email": "nick@close.com", "type": "office"}], "phones": [{"type": "office", "phone": "+18334625673", "country": "US", "phone_formatted": "+1 833-462-5673"}], "urls": [], "date_updated": "2021-07-13T11:39:03.366000+00:00", "title": "Director of Revenue", "name": "Nick Persico", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Gatekeeper", "Point of Contact"]}, {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.374000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Customer%20Success%20Team"}], "display_name": "Customer Success Team", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "emails": [{"email": "success@close.com", "type": "office"}], "phones": [{"type": "office", "phone": "+18334625673", "country": "US", "phone_formatted": "+1 833-462-5673"}], "urls": [], "date_updated": "2021-07-13T11:39:03.374000+00:00", "title": null, "name": "Customer Success Team", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz"}, {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.380000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Support"}], "display_name": "Support", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "emails": [{"email": "support@close.com", "type": "office"}], "phones": [], "urls": [], "date_updated": "2021-07-13T11:39:03.380000+00:00", "title": null, "name": "Support", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz"}], "name": "Close (Example\u00a0Lead)", "html_url": "https://app.close.com/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.315000+00:00", "display_name": "Close (Example\u00a0Lead)", "id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "status_label": "Interested", "tasks": [{"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2021-07-18", "text": "Call Steli", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T12:21:15.730000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": null, "date_created": "2021-07-13T11:39:03.520000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "contact_name": null, "is_complete": true, "id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "object_type": "taskcompleted", "lead_name": "Close (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2021-07-18", "view": "archive", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2021-07-16", "text": "Send Steli an email", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-18T10:31:52.081000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": null, "date_created": "2021-07-13T11:39:03.463000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": "acti_gdh0Iw30XYfKhKctrqPuxAbNghsxlDBDFaN8k35ZAxf", "contact_name": null, "is_complete": true, "id": "task_7kpMfXIPms858l9GKZTo3BCtVflvcIsOYPXL8mZgzyp", "object_type": "taskcompleted", "lead_name": "Close (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2021-07-16", "view": "archive", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz"}], "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Stark Industries", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Software", "custom.cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Website"}, "emitted_at": 1670413450897} +{"stream": "leads", "data": {"custom": {"Current Vendor/Software": "Initech", "Industry": "Manufacturing", "Lead Owner": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "Referral Source": "Facebook"}, "opportunities": [{"integration_links": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_display_name": "Demo Completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "value_formatted": "$500", "annualized_value": 50000, "value_currency": "USD", "contact_id": null, "confidence": 75, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:05.061000+00:00", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "updated_by_name": "Jean Lafleur", "value_period": "one_time", "note": "Bruce needs new software for the Bat Cave.", "user_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:05.061000+00:00", "status_label": "Demo Completed", "contact_name": null, "status_type": "active", "annualized_expected_value": 37500, "id": "oppo_jXatpqaQ3HK50yBO9vMWg2wFyHoqbCJtgbRYAMuEGor", "value": 50000, "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "date_won": "2021-07-15", "expected_value": 37500, "date_lost": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Wayne%20Enterprises%20%28Example%C2%A0Lead%29"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": null, "description": null, "date_updated": "2022-11-09T11:20:42.555000+00:00", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "addresses": [], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.977000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Bruce%20Wayne"}], "display_name": "Bruce Wayne", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "emails": [{"email": "thedarkknight@close.com", "type": "office"}], "phones": [{"type": "office", "phone": "+14156236785", "country": "US", "phone_formatted": "+1 415-623-6785"}], "urls": [], "date_updated": "2022-11-08T15:01:17.915000+00:00", "title": "The Dark Knight", "name": "Bruce Wayne", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker", "Point of Contact"]}], "name": "Wayne Enterprises (Example\u00a0Lead)", "html_url": "https://app.close.com/lead/lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:04.960000+00:00", "display_name": "Wayne Enterprises (Example\u00a0Lead)", "id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "status_label": "Interested", "tasks": [{"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-12", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-09T11:06:06.145000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-08T15:10:57.220000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": null, "contact_name": null, "is_complete": false, "id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "object_type": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-12", "view": "inbox", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-12", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-09T11:06:06.147000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-09T11:05:42.844000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": null, "contact_name": null, "is_complete": false, "id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "object_type": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-12", "view": "inbox", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-19T09:00:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T15:13:22.159000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-08T15:13:22.159000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": null, "contact_name": null, "is_complete": false, "id": "task_pIYI4An2qA84qea5mCLggCL0dZ8QIk2c2YrzoqSV8fd", "object_type": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-19T09:00:00+00:00", "view": "inbox", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-30T08:00:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-09T10:57:24.756000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-08T15:13:13.470000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "contact_name": null, "is_complete": true, "id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "object_type": "taskcompleted", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-30T08:00:00+00:00", "view": "archive", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-09T07:30:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-09T11:06:11.243000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-09T11:05:46.682000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "contact_name": null, "is_complete": true, "id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "object_type": "taskcompleted", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-09T07:30:00+00:00", "view": "archive", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN"}], "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Initech", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Manufacturing", "custom.cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Facebook"}, "emitted_at": 1670413450902} +{"stream": "leads", "data": {"custom": {}, "opportunities": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Airbyte"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": null, "description": "", "date_updated": "2022-11-11T09:02:11.007000+00:00", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "addresses": [], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-11T09:00:52.289000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Yowan%20R"}], "display_name": "Yowan R", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "emails": [], "phones": [{"type": "office", "phone": "+16462558418", "country": "US", "phone_formatted": "+1 646-255-8418"}], "urls": [], "date_updated": "2022-11-11T09:02:10.996000+00:00", "title": "Product Manager", "name": "Yowan R", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y"}], "name": "Airbyte", "html_url": "https://app.close.com/lead/lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-11T09:00:52.285000+00:00", "display_name": "Airbyte", "id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "status_label": "Potential", "tasks": [{"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-30T09:00:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-11T09:01:24.622000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-11T09:01:05.650000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": null, "contact_name": null, "is_complete": false, "id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "object_type": null, "lead_name": "Airbyte", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-30T09:00:00+00:00", "view": "inbox", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y"}]}, "emitted_at": 1670413450906} +{"stream": "leads", "data": {"custom": {}, "opportunities": [{"integration_links": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_display_name": "Demo Completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "value_formatted": "$100", "annualized_value": 10000, "value_currency": "USD", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "confidence": 50, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T15:55:27.750000+00:00", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "updated_by_name": "Jean Lafleur", "value_period": "one_time", "note": "Test", "user_name": "Jean Lafleur", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:55:27.750000+00:00", "status_label": "Demo Completed", "contact_name": "Iryna", "status_type": "active", "annualized_expected_value": 5000, "id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "value": 10000, "lead_name": "Test Lead", "date_won": "2022-11-16", "expected_value": 5000, "date_lost": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [{"name": "Google Search", "url": "https://google.com/search?q=Test%20Lead"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "url": null, "description": "", "date_updated": "2022-11-12T19:00:04.131000+00:00", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "addresses": [], "updated_by_name": "Jean Lafleur", "contacts": [{"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.381000+00:00", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Iryna"}], "display_name": "Iryna", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "emails": [{"email": "irina.grankova@gmail.com", "type": "office"}], "phones": [{"type": "office", "phone": "+14156236785", "country": "US", "phone_formatted": "+1 415-623-6785"}], "urls": [], "date_updated": "2022-11-09T11:31:18.119000+00:00", "title": "Test Lead", "name": "Iryna", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j"}], "name": "Test Lead", "html_url": "https://app.close.com/lead/lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j/", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.377000+00:00", "display_name": "Test Lead", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "status_label": "Interested", "tasks": [{"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-17T08:30:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T15:55:06.275000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-08T15:55:06.275000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": null, "contact_name": null, "is_complete": false, "id": "task_Va4jRQkIhZrUwzejqF3lZ4VaJeqR0cAvzzuaN0IaE5r", "object_type": null, "lead_name": "Test Lead", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-17T08:30:00+00:00", "view": "inbox", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j"}, {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2022-11-23T09:00:00+00:00", "text": "Follow up", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "contact_id": null, "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-09T12:44:26.200000+00:00", "updated_by_name": "Jean Lafleur", "is_dateless": false, "date_created": "2022-11-09T12:37:29.827000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "object_id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "contact_name": null, "is_complete": true, "id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "object_type": "taskcompleted", "lead_name": "Test Lead", "assigned_to_name": "Jean Lafleur", "due_date": "2022-11-23T09:00:00+00:00", "view": "archive", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j"}]}, "emitted_at": 1670413450910} +{"stream": "lead_tasks", "data": {"contact_name": null, "assigned_to_name": "Jean Lafleur", "text": "Send Steli an email", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "is_dateless": null, "contact_id": null, "id": "task_7kpMfXIPms858l9GKZTo3BCtVflvcIsOYPXL8mZgzyp", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Close (Example\u00a0Lead)", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.463000+00:00", "object_id": "acti_gdh0Iw30XYfKhKctrqPuxAbNghsxlDBDFaN8k35ZAxf", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2021-07-16", "created_by_name": "Jean Lafleur", "_type": "lead", "updated_by_name": "Jean Lafleur", "object_type": "taskcompleted", "view": "archive", "date_updated": "2021-08-18T10:31:52.081000+00:00", "is_complete": true, "due_date": "2021-07-16"}, "emitted_at": 1670413452455} +{"stream": "lead_tasks", "data": {"contact_name": null, "assigned_to_name": "Jean Lafleur", "text": "Call Steli", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "is_dateless": null, "contact_id": null, "id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Close (Example\u00a0Lead)", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.520000+00:00", "object_id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date": "2021-07-18", "created_by_name": "Jean Lafleur", "_type": "lead", "updated_by_name": "Jean Lafleur", "object_type": "taskcompleted", "view": "archive", "date_updated": "2022-11-08T12:21:15.730000+00:00", "is_complete": true, "due_date": "2021-07-18"}, "emitted_at": 1670413452458} +{"stream": "lead_tasks", "data": {"lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2022-11-08T15:10:57.220000+00:00", "date_updated": "2022-11-09T11:06:06.145000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": false, "object_id": null, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-12", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-12", "view": "inbox", "object_type": null, "contact_name": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413453746} +{"stream": "lead_tasks", "data": {"lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2022-11-08T15:13:13.470000+00:00", "date_updated": "2022-11-09T10:57:24.756000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": true, "object_id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-30T08:00:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-30T08:00:00+00:00", "view": "archive", "object_type": "taskcompleted", "contact_name": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413453753} +{"stream": "lead_tasks", "data": {"lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2022-11-08T15:13:22.159000+00:00", "date_updated": "2022-11-08T15:13:22.159000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": false, "object_id": null, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_pIYI4An2qA84qea5mCLggCL0dZ8QIk2c2YrzoqSV8fd", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-19T09:00:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-19T09:00:00+00:00", "view": "inbox", "object_type": null, "contact_name": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413453758} +{"stream": "lead_tasks", "data": {"lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "date_created": "2022-11-08T15:55:06.275000+00:00", "date_updated": "2022-11-08T15:55:06.275000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": false, "object_id": null, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_Va4jRQkIhZrUwzejqF3lZ4VaJeqR0cAvzzuaN0IaE5r", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-17T08:30:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-17T08:30:00+00:00", "view": "inbox", "object_type": null, "contact_name": null, "lead_name": "Test Lead"}, "emitted_at": 1670413453762} +{"stream": "lead_tasks", "data": {"lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2022-11-09T11:05:42.844000+00:00", "date_updated": "2022-11-09T11:06:06.147000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": false, "object_id": null, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-12", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-12", "view": "inbox", "object_type": null, "contact_name": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413453766} +{"stream": "lead_tasks", "data": {"lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date_created": "2022-11-09T11:05:46.682000+00:00", "date_updated": "2022-11-09T11:06:11.243000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": true, "object_id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-09T07:30:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-09T07:30:00+00:00", "view": "archive", "object_type": "taskcompleted", "contact_name": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413453769} +{"stream": "lead_tasks", "data": {"lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "date_created": "2022-11-09T12:37:29.827000+00:00", "date_updated": "2022-11-09T12:44:26.200000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": true, "object_id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-23T09:00:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-23T09:00:00+00:00", "view": "archive", "object_type": "taskcompleted", "contact_name": null, "lead_name": "Test Lead"}, "emitted_at": 1670413453772} +{"stream": "lead_tasks", "data": {"lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "date_created": "2022-11-11T09:01:05.650000+00:00", "date_updated": "2022-11-11T09:01:24.622000+00:00", "updated_by_name": "Jean Lafleur", "text": "Follow up", "is_complete": false, "object_id": null, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "due_date": "2022-11-30T09:00:00+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "created_by_name": "Jean Lafleur", "is_dateless": false, "date": "2022-11-30T09:00:00+00:00", "view": "inbox", "object_type": null, "contact_name": null, "lead_name": "Airbyte"}, "emitted_at": 1670413453774} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_U722qGVxvXSd1AP7Cs2ygzun3Vm0tmfKOv1dSt2Itw0", "date": "2022-11-08T15:44:23.001000+00:00", "date_updated": "2022-11-08T16:28:55.890000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "assigned_to_name": "Jean Lafleur", "contact_name": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-08T15:44:23.001000+00:00", "created_by_name": null, "updated_by_name": null, "created_by": null, "subject": "Delivery Status Notification (Failure)", "view": "archive", "contact_id": null, "object_type": "emailthread", "updated_by": null, "lead_name": "Wayne Enterprises (Example\u00a0Lead)"}, "emitted_at": 1670413456107} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "date": "2022-11-08T16:09:09.001000+00:00", "date_updated": "2022-11-08T16:28:55.751000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "assigned_to_name": "Jean Lafleur", "contact_name": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-08T16:09:09.001000+00:00", "created_by_name": null, "updated_by_name": null, "created_by": null, "subject": "Delivery Status Notification (Failure)", "view": "archive", "contact_id": null, "object_type": "emailthread", "updated_by": null, "lead_name": "Bluth Company (Example\u00a0Lead)"}, "emitted_at": 1670413456116} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1", "date": "2022-11-09T11:28:52+00:00", "date_updated": "2022-11-09T11:31:12.492000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "assigned_to_name": "Jean Lafleur", "contact_name": "Iryna", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "body_preview": "Test\n\n\n", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-09T11:28:52+00:00", "created_by_name": null, "updated_by_name": "Jean Lafleur", "created_by": null, "subject": "Test", "view": "archive", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "emailthread", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Test Lead"}, "emitted_at": 1670413456121} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "date": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T12:36:43.842000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "assigned_to_name": "Jean Lafleur", "contact_name": "Iryna", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-09T11:30:58+00:00", "created_by_name": null, "updated_by_name": "Jean Lafleur", "created_by": null, "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "view": "archive", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "emailthread", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Test Lead"}, "emitted_at": 1670413456126} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "date": "2022-11-09", "date_updated": "2022-11-09T13:00:08.080000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "assigned_to_name": "Jean Lafleur", "contact_name": "Iryna", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-09T12:32:37.001000+00:00", "created_by_name": null, "updated_by_name": "Jean Lafleur", "created_by": null, "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "view": "archive", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "emailthread", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Test Lead"}, "emitted_at": 1670413456129} +{"stream": "incoming_email_tasks", "data": {"assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i", "date": "2022-11-09T12:42:01+00:00", "date_updated": "2022-11-11T07:55:12.073000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "assigned_to_name": "Jean Lafleur", "contact_name": "Iryna", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "cleared_followups": [], "_type": "incoming_email", "emails": [], "is_complete": true, "date_created": "2022-11-09T12:42:01+00:00", "created_by_name": null, "updated_by_name": "Jean Lafleur", "created_by": null, "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "view": "archive", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "emailthread", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Test Lead"}, "emitted_at": 1670413456133} +{"stream": "email_followup_tasks", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "date_created": "2022-11-08T15:44:05.221000+00:00", "_type": "email_followup", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "subject": "(no subject)", "id": "noti_3I4QaKqYel0nzGyKT8mpDKy4q2KKu4IuIZZ3Gb7gs4x", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "contact_name": "Bruce Wayne", "date_updated": "2022-11-08T16:28:54.794000+00:00", "object_type": "emailthread", "body_preview": "Test", "created_by_name": "Jean Lafleur", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "assigned_to_name": "Jean Lafleur", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "view": "inbox", "date": "2022-11-15", "email_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "is_complete": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413458338} +{"stream": "email_followup_tasks", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "object_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "date_created": "2022-11-09T12:54:10.330000+00:00", "_type": "email_followup", "lead_name": "Test Lead", "subject": "Test Lead + Airbyte", "id": "noti_JU7vkNkhpywznaGu5P0WuBWxsMXtzZmkOSXaCxbxTsN", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "contact_name": "Iryna", "date_updated": "2022-11-09T12:54:10.330000+00:00", "object_type": "emailthread", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "created_by_name": "Jean Lafleur", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "assigned_to_name": "Jean Lafleur", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "view": "inbox", "date": "2022-11-16", "email_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "is_complete": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413458340} +{"stream": "opportunity_due_tasks", "data": {"created_by_name": "Jean Lafleur", "opportunity_value_formatted": "$500", "assigned_to_name": "Jean Lafleur", "opportunity_value": 50000, "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_created": "2021-07-13T11:39:04.316000+00:00", "opportunity_note": "Use opportunities to track which stage of the pipeline your deals are in and the revenue associated with them.", "contact_name": "Steli Efti", "id": "noti_ELGehUlDZ1pmlIeibPlLbTyruBTKdACAQ1q1XLiWo6B", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Close (Example\u00a0Lead)", "object_type": "opportunity", "view": "inbox", "_type": "opportunity_due", "is_complete": false, "opportunity_value_period": "one_time", "date_updated": "2021-08-18T10:26:44.323000+00:00", "object_id": "oppo_1TfmaSLuECcdSQIBnjUOBj1gAXdyrp4SFaogvcEmtbk", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "date": "2021-07-15", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413466146} +{"stream": "opportunity_due_tasks", "data": {"created_by_name": "Jean Lafleur", "opportunity_value_formatted": "$3,000", "assigned_to_name": "Jean Lafleur", "opportunity_value": 300000, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_created": "2021-07-13T11:39:04.839000+00:00", "opportunity_note": "Gob's ready to buy a $3,000 suit.", "contact_name": null, "id": "noti_wcbYMl0dpbdcypRygf9jYd9axfIzvSsj06gXHmPmE4k", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Bluth Company (Example\u00a0Lead)", "object_type": "opportunity", "view": "inbox", "_type": "opportunity_due", "is_complete": false, "opportunity_value_period": "one_time", "date_updated": "2021-07-13T11:39:04.839000+00:00", "object_id": "oppo_NkKuhUWfDoErNArh44hw7jkkx7sCl5bhlamtezmX7BE", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "date": "2021-07-16", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413466148} +{"stream": "opportunity_due_tasks", "data": {"created_by_name": "Jean Lafleur", "opportunity_value_formatted": "$500", "assigned_to_name": "Jean Lafleur", "opportunity_value": 50000, "contact_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_created": "2021-07-13T11:39:05.083000+00:00", "opportunity_note": "Bruce needs new software for the Bat Cave.", "contact_name": null, "id": "noti_IPi8EZj1AtqSwbnSMg5OT2DpUqNHCl2RM7luvbx9zsp", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_type": "opportunity", "view": "inbox", "_type": "opportunity_due", "is_complete": false, "opportunity_value_period": "one_time", "date_updated": "2021-07-13T11:39:05.083000+00:00", "object_id": "oppo_jXatpqaQ3HK50yBO9vMWg2wFyHoqbCJtgbRYAMuEGor", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "date": "2021-07-15", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413466150} +{"stream": "opportunity_due_tasks", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T15:55:27.773000+00:00", "object_id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "view": "inbox", "is_complete": false, "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:55:27.773000+00:00", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "opportunity_value": 10000, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "contact_name": "Iryna", "object_type": "opportunity", "id": "noti_mLYZbUFr2FuDE4ZH78FsYktgbfKjEnTqR1GW5qLv7sI", "date": "2022-11-16", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "assigned_to_name": "Jean Lafleur", "opportunity_value_formatted": "$100", "opportunity_value_period": "one_time", "lead_name": "Test Lead", "updated_by_name": "Jean Lafleur", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "_type": "opportunity_due", "opportunity_note": "Test"}, "emitted_at": 1670413466937} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "next_billing_on"], "data": {"address_id": null, "bundle_id": null, "carrier": "twilio", "country": "US", "date_created": "2022-11-08T12:35:29.464000+00:00", "date_updated": "2022-12-07T10:02:19.612000+00:00", "forward_to": null, "forward_to_enabled": false, "forward_to_formatted": null, "id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "is_group_number": false, "is_verified": false, "label": null, "last_billed_price": "1.15", "mms_enabled": true, "next_billing_on": "2023-01-07", "number": "+14156251293", "number_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "press_1_to_accept": true, "sms_enabled": true, "supports_mms_to_countries": ["CA", "US"], "supports_sms_to_countries": ["CA", "PR", "US"], "type": "internal", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "voicemail_greeting_url": "https://closeio-voicemail-greetings.s3.amazonaws.com/14bzVblrIaekmXSGQEKM11/undefined.mp3"}, "date_created": "2022-12-07T10:02:19.618000", "date_updated": "2022-12-07T10:02:19.618000", "id": "ev_55oIlccuq33rygMwXfIpGs", "lead_id": null, "meta": {}, "object_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "object_type": "phone_number", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:32:41.736000+00:00", "next_billing_on": "2022-12-07"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471819} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:43.734431", "date_updated": "2022-11-14T18:00:23.018212", "id": "sub_5kEnI9yY80Y9mjetrZqrxn", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-14T18:00:22.946957", "updated_by_id": null}, "date_created": "2022-11-14T18:00:23.018000", "date_updated": "2022-11-14T18:00:23.018000", "id": "ev_48iztg3VRwJZ85LBTueKSr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T18:00:19.231120", "status": "active", "step_last_processed_at": "2022-11-11T18:00:19.033470"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471821} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:52.688271", "date_updated": "2022-11-14T18:00:19.755534", "id": "sub_06TCoNKHiRvgz5eajOG5iM", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-14T18:00:19.664436", "updated_by_id": null}, "date_created": "2022-11-14T18:00:19.755000", "date_updated": "2022-11-14T18:00:19.755000", "id": "ev_2qTcWa1q1eRPk0dnWdbNoV", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_06TCoNKHiRvgz5eajOG5iM", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T18:00:14.594586", "status": "active", "step_last_processed_at": "2022-11-11T18:00:14.199257"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471823} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:53.882456", "date_updated": "2022-11-14T18:00:19.172825", "id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-14T18:00:19.077247", "updated_by_id": null}, "date_created": "2022-11-14T18:00:19.172000", "date_updated": "2022-11-14T18:00:19.172000", "id": "ev_6utQFdgoaeM0z2o4xbp9SV", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T18:00:12.983767", "status": "active", "step_last_processed_at": "2022-11-11T18:00:12.798902"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471825} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:47.911844", "date_updated": "2022-11-14T18:00:15.171959", "id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-14T18:00:15.094189", "updated_by_id": null}, "date_created": "2022-11-14T18:00:15.171000", "date_updated": "2022-11-14T18:00:15.171000", "id": "ev_6g9vIDEfxm8E2QFCrbkDBt", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T18:00:10.011102", "status": "active", "step_last_processed_at": "2022-11-11T18:00:09.574043"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471827} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status"], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "yes", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-12T19:00:03.639000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "completed", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-12T19:00:03.651000", "date_updated": "2022-11-12T19:00:03.651000", "id": "ev_3sLL7z2qIVM2JZN7PzbO9x", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-12T18:00:01.148000+00:00", "status": "in-progress"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471829} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "yes", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-12T19:00:03.639000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "completed", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-12T19:00:03.651000", "date_updated": "2022-11-12T19:00:03.651000", "id": "ev_1KaAvpIRA3McUBuiACxSG5", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471830} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status"], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "yes", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-12T18:00:01.148000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "in-progress", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-12T18:00:01.158000", "date_updated": "2022-11-12T18:00:01.158000", "id": "ev_4rqeRxpiS8zV20QMQKDDmA", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:41:54.440000+00:00", "status": "upcoming"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471832} +{"stream": "events", "data": {"action": "started", "api_key_id": null, "changed_fields": [], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "yes", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-12T18:00:01.148000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "in-progress", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-12T18:00:01.158000", "date_updated": "2022-11-12T18:00:01.158000", "id": "ev_4mwy6ojzuVypXDBQX4Hdt4", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471834} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "status"], "data": {"created_by": null, "date_completed": "2022-11-11T18:00:19.033470+00:00", "date_created": "2022-11-11T17:00:12.301792", "date_sent": "2022-11-11T18:00:19.033470+00:00", "date_updated": "2022-11-11T18:00:19.268905", "email_id": null, "id": "subhis_2BlX9HChfOJf0C5LLuwDa6", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "completed", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T18:00:19.268000", "date_updated": "2022-11-11T18:00:19.268000", "id": "ev_05kGl9G5GMTNAGTlKbCyAr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2BlX9HChfOJf0C5LLuwDa6", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-11T17:00:12.553530", "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471836} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:43.734431", "date_updated": "2022-11-11T18:00:19.231120", "id": "sub_5kEnI9yY80Y9mjetrZqrxn", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T18:00:19.033470+00:00", "updated_by_id": null}, "date_created": "2022-11-11T18:00:19.231000", "date_updated": "2022-11-11T18:00:19.231000", "id": "ev_4QTG3mvmYDN6ZEU8G8eg5R", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T17:00:12.519664", "step_last_processed_at": "2022-11-11T17:00:12.301792"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471838} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "status"], "data": {"created_by": null, "date_completed": "2022-11-11T18:00:14.199257+00:00", "date_created": "2022-11-11T17:00:08.393601", "date_sent": "2022-11-11T18:00:14.199257+00:00", "date_updated": "2022-11-11T18:00:14.617297", "email_id": null, "id": "subhis_2KY7OJYrz0gV06N0wvuWeO", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "completed", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T18:00:14.617000", "date_updated": "2022-11-11T18:00:14.617000", "id": "ev_5Oiajq3U5g8OPYQJSCm6Ws", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2KY7OJYrz0gV06N0wvuWeO", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-11T17:00:08.672838", "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471840} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:52.688271", "date_updated": "2022-11-11T18:00:14.594586", "id": "sub_06TCoNKHiRvgz5eajOG5iM", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T18:00:14.199257+00:00", "updated_by_id": null}, "date_created": "2022-11-11T18:00:14.594000", "date_updated": "2022-11-11T18:00:14.594000", "id": "ev_15sXuKqyASBZXho8ZygPx3", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_06TCoNKHiRvgz5eajOG5iM", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T17:00:08.622604", "step_last_processed_at": "2022-11-11T17:00:08.393601"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471842} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "status"], "data": {"created_by": null, "date_completed": "2022-11-11T18:00:12.798902+00:00", "date_created": "2022-11-11T17:00:06.950042", "date_sent": "2022-11-11T18:00:12.798902+00:00", "date_updated": "2022-11-11T18:00:13.013239", "email_id": null, "id": "subhis_5vIrVHNM9dTMug0ToOBzSC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "completed", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T18:00:13.013000", "date_updated": "2022-11-11T18:00:13.013000", "id": "ev_6aG0YaIl9roZtWXJHgTxeU", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_5vIrVHNM9dTMug0ToOBzSC", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-11T17:00:07.297863", "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471844} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:53.882456", "date_updated": "2022-11-11T18:00:12.983767", "id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T18:00:12.798902+00:00", "updated_by_id": null}, "date_created": "2022-11-11T18:00:12.983000", "date_updated": "2022-11-11T18:00:12.983000", "id": "ev_4vpJCkGRLN9QOa5PWI81Pr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T17:00:07.253063", "step_last_processed_at": "2022-11-11T17:00:06.950042"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471846} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "status"], "data": {"created_by": null, "date_completed": "2022-11-11T18:00:09.574043+00:00", "date_created": "2022-11-11T17:00:03.248771", "date_sent": "2022-11-11T18:00:09.574043+00:00", "date_updated": "2022-11-11T18:00:10.043346", "email_id": null, "id": "subhis_4Fg8HiJFmCovnP5yjXNpRg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "completed", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T18:00:10.043000", "date_updated": "2022-11-11T18:00:10.043000", "id": "ev_2hQoCNKoSnzOvBjQjEq2oP", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_4Fg8HiJFmCovnP5yjXNpRg", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-11T17:00:04.474797", "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471847} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:47.911844", "date_updated": "2022-11-11T18:00:10.011102", "id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T18:00:09.574043+00:00", "updated_by_id": null}, "date_created": "2022-11-11T18:00:10.011000", "date_updated": "2022-11-11T18:00:10.011000", "id": "ev_6TaLjS9KvOlOdzJXft9v6t", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T17:00:04.384725", "step_last_processed_at": "2022-11-11T17:00:03.248771"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471849} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-11T17:00:12.301792", "date_sent": null, "date_updated": "2022-11-11T17:00:12.553530", "email_id": null, "id": "subhis_2BlX9HChfOJf0C5LLuwDa6", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "pending", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T17:00:12.553000", "date_updated": "2022-11-11T17:00:12.553000", "id": "ev_3KqM5Rb4MFgRV0ToVnVkXt", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2BlX9HChfOJf0C5LLuwDa6", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471851} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:43.734431", "date_updated": "2022-11-11T17:00:12.519664", "id": "sub_5kEnI9yY80Y9mjetrZqrxn", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T17:00:12.301792", "updated_by_id": null}, "date_created": "2022-11-11T17:00:12.519000", "date_updated": "2022-11-11T17:00:12.519000", "id": "ev_71GO2mracXz4IO2BzrYPar", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:53:35.714692", "step_last_processed_at": "2022-11-08T17:53:35.311139"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471853} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-11T17:00:08.393601", "date_sent": null, "date_updated": "2022-11-11T17:00:08.672838", "email_id": null, "id": "subhis_2KY7OJYrz0gV06N0wvuWeO", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "pending", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T17:00:08.672000", "date_updated": "2022-11-11T17:00:08.672000", "id": "ev_5mfT6ppTyNBdHurYiXQfkK", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2KY7OJYrz0gV06N0wvuWeO", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471855} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:52.688271", "date_updated": "2022-11-11T17:00:08.622604", "id": "sub_06TCoNKHiRvgz5eajOG5iM", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T17:00:08.393601", "updated_by_id": null}, "date_created": "2022-11-11T17:00:08.622000", "date_updated": "2022-11-11T17:00:08.622000", "id": "ev_3KlGVs2e9sJogcNgepyDrd", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_06TCoNKHiRvgz5eajOG5iM", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:12:08.155030", "step_last_processed_at": "2022-11-08T17:12:07.625391"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471857} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-11T17:00:06.950042", "date_sent": null, "date_updated": "2022-11-11T17:00:07.297863", "email_id": null, "id": "subhis_5vIrVHNM9dTMug0ToOBzSC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "pending", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T17:00:07.297000", "date_updated": "2022-11-11T17:00:07.297000", "id": "ev_6O0qR7eUMqnEwI0dilGVwi", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_5vIrVHNM9dTMug0ToOBzSC", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471859} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:53.882456", "date_updated": "2022-11-11T17:00:07.253063", "id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T17:00:06.950042", "updated_by_id": null}, "date_created": "2022-11-11T17:00:07.253000", "date_updated": "2022-11-11T17:00:07.253000", "id": "ev_3RDFCi25PdTd4dwZbjexl1", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:41:58.726863", "step_last_processed_at": "2022-11-08T17:41:58.196054"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471860} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-11T17:00:03.248771", "date_sent": null, "date_updated": "2022-11-11T17:00:04.474797", "email_id": null, "id": "subhis_4Fg8HiJFmCovnP5yjXNpRg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "pending", "step_id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "subject": null, "template_id": null, "template_name": null, "updated_by": null}, "date_created": "2022-11-11T17:00:04.474000", "date_updated": "2022-11-11T17:00:04.474000", "id": "ev_1fJLbhl6uKq9MhmKponje9", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_4Fg8HiJFmCovnP5yjXNpRg", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413471862} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:47.911844", "date_updated": "2022-11-11T17:00:04.384725", "id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-11T17:00:03.248771", "updated_by_id": null}, "date_created": "2022-11-11T17:00:04.384000", "date_updated": "2022-11-11T17:00:04.384000", "id": "ev_0HF3Ufm9kYBisBQBQacv9g", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:15:11.794926", "step_last_processed_at": "2022-11-08T17:15:11.279217"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471864} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": [], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:12.582772", "date_updated": "2022-11-11T16:48:50.267818", "id": "sub_7Zv78mWCJuul1Ipd4EDE32", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-11T16:48:50.199291", "updated_by_id": null}, "date_created": "2022-11-11T16:48:50.267000", "date_updated": "2022-11-11T16:48:50.267000", "id": "ev_47EsiEcxvCzVqO5JLVrCSm", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:48:47.699257", "status": "active", "step_last_processed_at": "2022-11-08T16:48:47.166705"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471866} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": [], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:14.589854", "date_updated": "2022-11-11T16:36:11.196484", "id": "sub_3AChiei0PuAIJ1X0OWnWNR", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-11T16:36:11.118156", "updated_by_id": null}, "date_created": "2022-11-11T16:36:11.196000", "date_updated": "2022-11-11T16:36:11.196000", "id": "ev_4frYhmqpciWf3ZQqsmRCSq", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:36:07.768798", "status": "active", "step_last_processed_at": "2022-11-08T16:36:07.226556"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471868} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": [], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:06.399661", "date_updated": "2022-11-11T16:24:35.013205", "id": "sub_174GiA85Ui8g1OuQUrzdWe", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-11T16:24:34.948800", "updated_by_id": null}, "date_created": "2022-11-11T16:24:35.013000", "date_updated": "2022-11-11T16:24:35.013000", "id": "ev_6SnlbM14BIS1U3Twi6ffM0", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_174GiA85Ui8g1OuQUrzdWe", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:24:31.797778", "status": "active", "step_last_processed_at": "2022-11-08T16:24:31.194602"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471870} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "step_last_processed_at"], "data": {"calls_assigned_to": [], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:10.011072", "date_updated": "2022-11-11T16:23:07.273548", "id": "sub_3J812U6VNcZBmBDEJ1iIdX", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "finished", "status_reason": null, "step_last_processed_at": "2022-11-11T16:23:07.193294", "updated_by_id": null}, "date_created": "2022-11-11T16:23:07.273000", "date_updated": "2022-11-11T16:23:07.273000", "id": "ev_3HDHmiYBTpANFA7WVCN1go", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:23:04.849822", "status": "active", "step_last_processed_at": "2022-11-08T16:23:04.323897"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471872} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "phones", "title"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-11T09:00:52.289000+00:00", "date_updated": "2022-11-11T09:02:10.996000+00:00", "emails": [], "id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "name": "Yowan R", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+16462558418", "phone_formatted": "+1 646-255-8418", "type": "office"}], "title": "Product Manager", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-11T09:02:10.998000", "date_updated": "2022-11-11T09:02:10.998000", "id": "ev_5qFKTlWbIWVdd8Kntv1Oqr", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78/"}, "object_id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-11T09:00:52.289000+00:00", "phones": [], "title": ""}, "request_id": "req_5cG47kQgJc1yc4nLUgwpl5", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471874} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "due_date"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30T09:00:00+00:00", "date_created": "2022-11-11T09:01:05.650000+00:00", "date_updated": "2022-11-11T09:01:24.622000+00:00", "due_date": "2022-11-30T09:00:00+00:00", "id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "lead_name": "Airbyte", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-11T09:01:24.625000", "date_updated": "2022-11-11T09:01:24.625000", "id": "ev_21owlxEH5iBTPYX8TJPNMg", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6/"}, "object_id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-18", "date_updated": "2022-11-11T09:01:10.105000+00:00", "due_date": "2022-11-18"}, "request_id": "req_0cue9LhcPuj5iENtGRFcKy", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471875} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "due_date", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-18", "date_created": "2022-11-11T09:01:05.650000+00:00", "date_updated": "2022-11-11T09:01:10.105000+00:00", "due_date": "2022-11-18", "id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "lead_name": "Airbyte", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-11T09:01:10.107000", "date_updated": "2022-11-11T09:01:10.107000", "id": "ev_06VdLl0PhnXbpQTHJj4z5E", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6/"}, "object_id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-11", "date_updated": "2022-11-11T09:01:05.650000+00:00", "due_date": "2022-11-11", "view": "inbox"}, "request_id": "req_1M5y8JPboapMhLHtlymEma", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471877} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-11", "date_created": "2022-11-11T09:01:05.650000+00:00", "date_updated": "2022-11-11T09:01:05.650000+00:00", "due_date": "2022-11-11", "id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "lead_name": "Airbyte", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-11T09:01:05.652000", "date_updated": "2022-11-11T09:01:05.652000", "id": "ev_1PkO3WgOja5sGJYjNczlzt", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_1uqKlzwO0qLGYgBMT5DcLtklNmgtrUNVobSNEiPpoU6", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3I6t2zVuHgHguRr7AMHCc0", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471879} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Created", "activity_at": "2022-11-11T09:00:52.285000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-11T09:00:52.285000+00:00", "date_updated": "2022-11-11T09:00:52.304000+00:00", "id": "acti_LBTzFHimY46YWxvE0xpsR3tiZCHKgj3LCFil3pIfgmg", "import_id": null, "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-11T09:00:52.306000", "date_updated": "2022-11-11T09:00:52.306000", "id": "ev_3B6tZTB7iEKEcORW5oDGqH", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "acti_LBTzFHimY46YWxvE0xpsR3tiZCHKgj3LCFil3pIfgmg", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_74rGxjJU5IjwSY4w4wJl0T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471881} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"addresses": [], "contact_ids": ["cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-11T09:00:52.285000+00:00", "date_updated": "2022-11-11T09:00:52.293000+00:00", "description": "", "display_name": "Airbyte", "id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "name": "Airbyte", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-11T09:00:52.294000", "date_updated": "2022-11-11T09:00:52.294000", "id": "ev_2TSg6iKY7elcXnekLpZF4B", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_74rGxjJU5IjwSY4w4wJl0T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471883} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-11T09:00:52.289000+00:00", "date_updated": "2022-11-11T09:00:52.289000+00:00", "emails": [], "id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "name": "Yowan R", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-11T09:00:52.290000", "date_updated": "2022-11-11T09:00:52.290000", "id": "ev_1HSanX0WEhCITm2KAkdoJX", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_74rGxjJU5IjwSY4w4wJl0T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471885} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "emails", "is_complete", "is_new", "updated_by", "updated_by_name", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T12:42:01+00:00", "date_created": "2022-11-09T12:42:01+00:00", "date_updated": "2022-11-11T07:55:12.073000+00:00", "emails": [], "id": "noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-11T07:55:12.075000", "date_updated": "2022-11-11T07:55:12.075000", "id": "ev_5ol2GRSHeCEkdiRAWZoSuJ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i/"}, "object_id": "noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:42:06.949000+00:00", "emails": ["acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb"], "is_complete": false, "is_new": true, "updated_by": null, "updated_by_name": null, "view": "inbox"}, "request_id": "req_1GrMXgInNExfCs2bQKeu7E", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471887} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "template_id", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-09T14:02:18.756000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T14:02:18.756000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T14:02:24.943000+00:00", "direction": "outbound", "error_message": null, "id": "acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T14:02:24.945000", "date_updated": "2022-11-09T14:02:24.945000", "id": "ev_5S0CD6NzWOUJ7HgY0BFQyx", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4/"}, "object_id": "acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T14:02:18.756000+00:00", "template_id": "", "text": ""}, "request_id": "req_1VGVucHntYProTpX9NBI33", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471888} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T14:02:18.756000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T14:02:18.756000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T14:02:18.756000+00:00", "direction": "outbound", "error_message": null, "id": "acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T14:02:18.758000", "date_updated": "2022-11-09T14:02:18.758000", "id": "ev_4mgvv1aHfp4B3v1bsm07iu", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_CXrlrlHc8QpP5MBXqCfcJKpctDqBREuG3Whj0JQODu4", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_07md5Zd5TehlLAEfrRC9cb", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471890} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "2", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:40.167000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 17, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:40.179000", "date_updated": "2022-11-09T13:57:40.179000", "id": "ev_0W5q1JbyiJD2s4JcE071Fq", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-09T13:57:39.171000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413471892} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "duration", "is_joinable", "quality_info", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:39.171000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 17, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"0c2fb83a5a7f1c249e321b7bef9a883ddc1039b7e858e025d4251325e5a78ce4\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"4fd87581ccc1164765bc16e3ba97f63a1caa515db425d81894c68cc4a6387b77\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"4fd87581ccc1164765bc16e3ba97f63a1caa515db425d81894c68cc4a6387b77\"}],\"reports\":{\"googTrack_9bf324d8-d783-4fa4-8626-9dd49c3eec08\":{\"id\":\"googTrack_9bf324d8-d783-4fa4-8626-9dd49c3eec08\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googTrackId\":\"9bf324d8-d783-4fa4-8626-9dd49c3eec08\"},\"googLibjingleSession_7523768276989388533\":{\"id\":\"googLibjingleSession_7523768276989388533\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\":{\"id\":\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googFingerprint\":\"92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFTCBvaADAgECAgkAlx2Jo5hPmtYwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODEzNTcxNFoXDTIyMTIwOTEzNTcxNFowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6vCpdFYNt75b7z1HR8qVbkHn5g5hTPwfY/ml15QMMAsJnowkIfm8hyMW4QhSa1HFSnJ63rYpkJYjEGOAAmYzXDAKBggqhkjOPQQDAgNHADBEAiAO8++g4YtkWIpPIFrTwE6J9H30ja9yjHyfjI3zG6rX0gIgLhNgxI8KpzSsTqdougZSF2J+JGlTSJa1DzueQszppjQ=\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-5O29Ghu+\":{\"id\":\"Cand-5O29Ghu+\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"49362\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-339H09pv\":{\"id\":\"Cand-339H09pv\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2920358822_send\":{\"id\":\"ssrc_2920358822_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"audioInputLevel\":\"2015\",\"packetsLost\":\"0\",\"googRtt\":\"104\",\"totalSamplesDuration\":\"23.44\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"9bf324d8-d783-4fa4-8626-9dd49c3eec08\",\"totalAudioEnergy\":\"2.92717\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2920358822\",\"googJitterReceived\":\"3\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"1135\",\"bytesSent\":\"87791\"},\"googTrack_f858c430-2ec3-435e-8fbd-9a9c75bb1521\":{\"id\":\"googTrack_f858c430-2ec3-435e-8fbd-9a9c75bb1521\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googTrackId\":\"f858c430-2ec3-435e-8fbd-9a9c75bb1521\"},\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\":{\"id\":\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googFingerprint\":\"A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQa2tsWQJO4VqniKCfIGADJIY9GQTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTM1NzE1WhcNMjIxMjA5MTM1NzE1WjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASxgdwc5QaGD2jmwnfa9aUczyNIrXcrwcZ/EKJB1E/Z+tAkChjD5dNDhF9eJoocuqGFktg46mTavgdrGnOqxWjoMAoGCCqGSM49BAMCA0gAMEUCIQDUAWEnEVRCtgl9BFboKxWjLOW5qPX19q0ij/HdjLJgwwIgdoOtqcJJzaui6WMKE4/p7/O4mgZ63FwHElAs5tlwOlE=\"},\"Cand-acm+0HPw\":{\"id\":\"Cand-acm+0HPw\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"49362\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:49362\",\"consentRequestsSent\":\"2\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"13\",\"googRemoteAddress\":\"3.122.181.92:17338\",\"googRtt\":\"71\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"105188\",\"responsesReceived\":\"13\",\"remoteCandidateId\":\"Cand-lZPiOWup\",\"localCandidateId\":\"Cand-acm+0HPw\",\"bytesSent\":\"100932\",\"packetsSent\":\"1147\"},\"Cand-lZPiOWup\":{\"id\":\"Cand-lZPiOWup\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"portNumber\":\"17338\",\"ipAddress\":\"3.122.181.92\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_549970991_recv\":{\"id\":\"ssrc_549970991_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googDecodingCTN\":\"2286\",\"packetsLost\":\"4\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"43\",\"packetsReceived\":\"1083\",\"googExpandRate\":\"0.0452271\",\"googJitterReceived\":\"24\",\"googDecodingCNG\":\"0\",\"ssrc\":\"549970991\",\"googPreferredJitterBufferMs\":\"220\",\"googSpeechExpandRate\":\"0.0171509\",\"totalSamplesDuration\":\"22.86\",\"totalAudioEnergy\":\"3.2325\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"131\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"2112\",\"googTrackId\":\"f858c430-2ec3-435e-8fbd-9a9c75bb1521\",\"audioOutputLevel\":\"1\",\"googAccelerateRate\":\"0.0137329\",\"bytesReceived\":\"92785\",\"googCurrentDelayMs\":\"247\",\"googDecodingCTSG\":\"0\",\"googCaptureStartNtpTimeMs\":\"3876991036420\",\"googPreemptiveExpandRate\":\"0.00512695\",\"googJitterBufferMs\":\"300\",\"googDecodingMuted\":\"121\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:38.913000", "date_updated": "2022-11-09T13:57:39.173000", "id": "ev_6btZfY99H6kI13Z9RBQ5g6", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T13:57:22.063000+00:00", "duration": 0, "is_joinable": true, "quality_info": "", "status": "in-progress"}, "request_id": "req_6S35wKAPyMjBcaLb89Xs9q", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471894} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:39.171000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 17, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"0c2fb83a5a7f1c249e321b7bef9a883ddc1039b7e858e025d4251325e5a78ce4\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"4fd87581ccc1164765bc16e3ba97f63a1caa515db425d81894c68cc4a6387b77\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"6e5c57bb64256b7a627434cf37060681724d29d006bd0b0126fade520b7757b4\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"7f076eba01c52904316889297b8e938d41ee6e8a5f3113e6c6d30072a9eee7c1\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"4fd87581ccc1164765bc16e3ba97f63a1caa515db425d81894c68cc4a6387b77\"}],\"reports\":{\"googTrack_9bf324d8-d783-4fa4-8626-9dd49c3eec08\":{\"id\":\"googTrack_9bf324d8-d783-4fa4-8626-9dd49c3eec08\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googTrackId\":\"9bf324d8-d783-4fa4-8626-9dd49c3eec08\"},\"googLibjingleSession_7523768276989388533\":{\"id\":\"googLibjingleSession_7523768276989388533\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\":{\"id\":\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googFingerprint\":\"92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFTCBvaADAgECAgkAlx2Jo5hPmtYwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODEzNTcxNFoXDTIyMTIwOTEzNTcxNFowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6vCpdFYNt75b7z1HR8qVbkHn5g5hTPwfY/ml15QMMAsJnowkIfm8hyMW4QhSa1HFSnJ63rYpkJYjEGOAAmYzXDAKBggqhkjOPQQDAgNHADBEAiAO8++g4YtkWIpPIFrTwE6J9H30ja9yjHyfjI3zG6rX0gIgLhNgxI8KpzSsTqdougZSF2J+JGlTSJa1DzueQszppjQ=\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_92:17:D5:7D:27:7A:23:07:82:43:30:E1:92:53:DC:59:68:D5:B4:6D:BF:17:AD:07:10:8E:E1:02:97:D0:BD:65\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-5O29Ghu+\":{\"id\":\"Cand-5O29Ghu+\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"49362\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-339H09pv\":{\"id\":\"Cand-339H09pv\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2920358822_send\":{\"id\":\"ssrc_2920358822_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"audioInputLevel\":\"2015\",\"packetsLost\":\"0\",\"googRtt\":\"104\",\"totalSamplesDuration\":\"23.44\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"9bf324d8-d783-4fa4-8626-9dd49c3eec08\",\"totalAudioEnergy\":\"2.92717\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2920358822\",\"googJitterReceived\":\"3\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"1135\",\"bytesSent\":\"87791\"},\"googTrack_f858c430-2ec3-435e-8fbd-9a9c75bb1521\":{\"id\":\"googTrack_f858c430-2ec3-435e-8fbd-9a9c75bb1521\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googTrackId\":\"f858c430-2ec3-435e-8fbd-9a9c75bb1521\"},\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\":{\"id\":\"googCertificate_A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googFingerprint\":\"A1:C3:15:7D:EF:41:11:F7:77:B0:5A:46:5B:9B:F4:54:86:6F:CA:DC:BD:7E:DB:B8:3E:EF:2D:41:ED:5A:83:8A\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQa2tsWQJO4VqniKCfIGADJIY9GQTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTM1NzE1WhcNMjIxMjA5MTM1NzE1WjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASxgdwc5QaGD2jmwnfa9aUczyNIrXcrwcZ/EKJB1E/Z+tAkChjD5dNDhF9eJoocuqGFktg46mTavgdrGnOqxWjoMAoGCCqGSM49BAMCA0gAMEUCIQDUAWEnEVRCtgl9BFboKxWjLOW5qPX19q0ij/HdjLJgwwIgdoOtqcJJzaui6WMKE4/p7/O4mgZ63FwHElAs5tlwOlE=\"},\"Cand-acm+0HPw\":{\"id\":\"Cand-acm+0HPw\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"49362\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:49362\",\"consentRequestsSent\":\"2\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"13\",\"googRemoteAddress\":\"3.122.181.92:17338\",\"googRtt\":\"71\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"105188\",\"responsesReceived\":\"13\",\"remoteCandidateId\":\"Cand-lZPiOWup\",\"localCandidateId\":\"Cand-acm+0HPw\",\"bytesSent\":\"100932\",\"packetsSent\":\"1147\"},\"Cand-lZPiOWup\":{\"id\":\"Cand-lZPiOWup\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"portNumber\":\"17338\",\"ipAddress\":\"3.122.181.92\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_549970991_recv\":{\"id\":\"ssrc_549970991_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T13:57:38.286Z\",\"googDecodingCTN\":\"2286\",\"packetsLost\":\"4\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"43\",\"packetsReceived\":\"1083\",\"googExpandRate\":\"0.0452271\",\"googJitterReceived\":\"24\",\"googDecodingCNG\":\"0\",\"ssrc\":\"549970991\",\"googPreferredJitterBufferMs\":\"220\",\"googSpeechExpandRate\":\"0.0171509\",\"totalSamplesDuration\":\"22.86\",\"totalAudioEnergy\":\"3.2325\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"131\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"2112\",\"googTrackId\":\"f858c430-2ec3-435e-8fbd-9a9c75bb1521\",\"audioOutputLevel\":\"1\",\"googAccelerateRate\":\"0.0137329\",\"bytesReceived\":\"92785\",\"googCurrentDelayMs\":\"247\",\"googDecodingCTSG\":\"0\",\"googCaptureStartNtpTimeMs\":\"3876991036420\",\"googPreemptiveExpandRate\":\"0.00512695\",\"googJitterBufferMs\":\"300\",\"googDecodingMuted\":\"121\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:39.173000", "date_updated": "2022-11-09T13:57:39.173000", "id": "ev_5fQBTX2BbfttnmYjdpWtxt", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6S35wKAPyMjBcaLb89Xs9q", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471896} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_answered", "date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:22.063000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:22.065000", "date_updated": "2022-11-09T13:57:22.065000", "id": "ev_4NYibtfLjbUbsfUOhlzqZF", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_answered": null, "date_updated": "2022-11-09T13:57:16.999000+00:00", "disposition": null, "status": "created"}, "request_id": "req_7NoJk1yaq32lu6mMAtjlnM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471898} +{"stream": "events", "data": {"action": "answered", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T13:57:22.063000+00:00", "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:22.063000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:22.065000", "date_updated": "2022-11-09T13:57:22.065000", "id": "ev_3m4xBf49tDGN55esUK5E2a", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_7NoJk1yaq32lu6mMAtjlnM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471900} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_joinable", "local_country_iso", "local_phone", "local_phone_formatted"], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:16.999000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:15.653000", "date_updated": "2022-11-09T13:57:17.002000", "id": "ev_2EMdV2XV0YjaX0moAasStV", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/conference/acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T13:57:14.751000+00:00", "is_joinable": false, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null}, "request_id": "req_7f6cS2cYziqjlI92PLCYIu", "user_id": null}, "emitted_at": 1670413471902} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T13:57:14.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T13:57:14.751000+00:00", "date_updated": "2022-11-09T13:57:14.751000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T13:57:14.754000", "date_updated": "2022-11-09T13:57:14.754000", "id": "ev_7OK5ZQaGXyvLmk2ROEZG9o", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_ZgqHg31m0XXDZPwaxUVUNOhnEoLSG3fY8rMn9iIS3cN", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_7g6ERLmo8hR1Wft7A6ayIu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471904} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-09T13:56:39.879000", "date_updated": "2022-11-09T13:56:39.879000", "id": "ev_2cVCCLY50DteQvfqptcJ51", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "DELETE", "request_path": "/api/v1/activity/email/acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA/"}, "object_id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "EmailThread", "activity_at": "2022-11-09T13:56:31.684000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T13:56:31.684000+00:00", "date_updated": "2022-11-09T13:56:31.686000+00:00", "email_ids": [], "id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "latest_normalized_subject": "", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "request_id": "req_1rWRzsxAkFI3EBPSQBsYVf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471906} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-09T13:56:39.843000", "date_updated": "2022-11-09T13:56:39.843000", "id": "ev_4Qx7GCsHWSYp3mbMjQexOp", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "DELETE", "request_path": "/api/v1/activity/email/acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA/"}, "object_id": "acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Email", "activity_at": "2022-11-09T13:56:31.683000+00:00", "attachments": [], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T13:56:31.683000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T13:56:31.690000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "", "template_id": null, "template_name": null, "thread_id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_1rWRzsxAkFI3EBPSQBsYVf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471908} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T13:56:31.683000+00:00", "attachments": [], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T13:56:31.683000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T13:56:31.690000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "", "template_id": null, "template_name": null, "thread_id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T13:56:31.691000", "date_updated": "2022-11-09T13:56:31.691000", "id": "ev_6zPivftRTshed4CPuhXrfW", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1VcwC9TRCRWkCTQn0djr39", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471910} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T13:56:31.684000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T13:56:31.684000+00:00", "date_updated": "2022-11-09T13:56:31.686000+00:00", "email_ids": ["acti_LFAYnzM70nWiwv3v6MHvRIaD2O71MgVgW4HPiog0TcA"], "id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "latest_normalized_subject": "", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T13:56:31.688000", "date_updated": "2022-11-09T13:56:31.688000", "id": "ev_5f2HlhzwON5pupKlzLgeu5", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_FjliW8Z0f3It8u9tQSbsoBa8pUqyBU5I4fkXuAAcARJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1VcwC9TRCRWkCTQn0djr39", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413471912} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-09T12:54:23.167000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T12:54:23.167000+00:00", "date_updated": "2022-11-09T13:39:37.547000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:54:23 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799846322.15922.4962027989641879748@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799846322.15922.4962027989641879748@smtpgw.close.com>", "<166799846322.15922.14988047742178474967@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "104.28.131.168", "opened_at": "2022-11-09T13:39:37.547000+00:00", "opened_by": "irina.grankova@gmail.com", "user_agent": "Mozilla/5.0"}], "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Test Lead + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T13:39:37.549000", "date_updated": "2022-11-09T13:39:37.549000", "id": "ev_4aWIHBPXnTwR829WulTlLT", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "GET", "request_path": "/t/a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j/7LkEiQUps7.png"}, "object_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:54:24.761000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_62uQZGNcUqvMhdcGnzsTMV", "user_id": null}, "emitted_at": 1670413472652} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_created", "date_updated", "emails", "is_complete", "is_new"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09", "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T13:00:08.080000+00:00", "emails": [], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": null}, "date_created": "2022-11-09T13:00:08.082000", "date_updated": "2022-11-09T13:00:08.082000", "id": "ev_1dR6NTbArVvg2zo9KqABlR", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_created": "2022-11-09T12:32:37+00:00", "date_updated": "2022-11-09T12:36:09.521000+00:00", "emails": ["acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa"], "is_complete": false, "is_new": true}, "request_id": null, "user_id": null}, "emitted_at": 1670413472654} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:26.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "date_updated": "2022-11-09T12:57:27.648000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:57:27.656000", "date_updated": "2022-11-09T12:57:27.656000", "id": "ev_6AoZ0LrCyEHzR4XIQZZTDN", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472656} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:26.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "date_updated": "2022-11-09T12:57:27.648000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:57:27.656000", "date_updated": "2022-11-09T12:57:27.656000", "id": "ev_0fcS3DpjAiPkRtw3eEGE21", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:55:28.209000+00:00", "disposition": null, "status": "created"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472658} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "note"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:55:39.770000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:55:39.770000+00:00", "date_updated": "2022-11-09T12:56:13.631000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "Test test", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"01dd010c038de56ab637b74ad0cb07f74d4ed1b558a5d201db5fc811f0b7214c\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"}],\"reports\":{\"googTrack_7d8641fc-37f3-4975-8236-3f6c9b4e2b88\":{\"id\":\"googTrack_7d8641fc-37f3-4975-8236-3f6c9b4e2b88\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googTrackId\":\"7d8641fc-37f3-4975-8236-3f6c9b4e2b88\"},\"googLibjingleSession_6502613843596828260\":{\"id\":\"googLibjingleSession_6502613843596828260\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"4\",\"googTransmitBitrate\":\"0\"},\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\":{\"id\":\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googFingerprint\":\"3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFTCBvKADAgECAgh4Rdz2DA7OEzAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZXZWJSVEMwHhcNMjIxMTA3MTU1NTQwWhcNMjIxMjA4MTU1NTQwWjARMQ8wDQYDVQQDDAZXZWJSVEMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATGLbGtLviNzMYC7UJFXyjT1YzsP0YJQ5NGpAj63rehJJ9kkyVmhwQXL2suNwfG/TXfsmLc2Hjoz3ToX7/mk4TZMAoGCCqGSM49BAMCA0gAMEUCIQDs6J88609CMoiF9r3GU7ywBLHKlawn8qaUB64F1KtzJwIgC06MwAJZK5J05DAtc1E7IY803bvVlx5AjJ/oYXRs3ZQ=\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-ptPI/8iJ\":{\"id\":\"Cand-ptPI/8iJ\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54281\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-09XybDei\":{\"id\":\"Cand-09XybDei\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54282\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122194687\"},\"Cand-JHFfRiby\":{\"id\":\"Cand-JHFfRiby\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"9\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"Cand-KNXs7pfP\":{\"id\":\"Cand-KNXs7pfP\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518214911\"},\"ssrc_1491824088_send\":{\"id\":\"ssrc_1491824088_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"audioInputLevel\":\"1305\",\"packetsLost\":\"0\",\"googRtt\":\"41\",\"totalSamplesDuration\":\"10.84\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"7d8641fc-37f3-4975-8236-3f6c9b4e2b88\",\"totalAudioEnergy\":\"0.17414\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"1491824088\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"453\",\"bytesSent\":\"36493\"},\"googTrack_9823eb2d-d356-48fa-be23-e524a5fbeb0f\":{\"id\":\"googTrack_9823eb2d-d356-48fa-be23-e524a5fbeb0f\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googTrackId\":\"9823eb2d-d356-48fa-be23-e524a5fbeb0f\"},\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\":{\"id\":\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googFingerprint\":\"33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQYn2EBUe7cOu6TojMnF084mg39ETAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA3MTU1NTQwWhcNMjIxMjA4MTU1NTQwWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASpGYWWHn+7WsEVbebOoh2t8tVjDXrgCrfMW5gRd1BZvxOZOjy26b3ujeg4Omu0j3FJXaUKAo/+cDV1tWUKXjMPMAoGCCqGSM49BAMCA0gAMEUCIQDQ6Ihc7VdXbgKr1FjFkwiH6l5BJDJ4P7Cgg0gj9kLEAwIgHBU9WDZ6iBtB9IsaVadXT7CD4A+mX2VGj6UPD4xhQsk=\"},\"Cand-N3dAA/zp\":{\"id\":\"Cand-N3dAA/zp\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54282\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853759231\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:54282\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.31:14268\",\"googRtt\":\"36\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"59076\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-xxV+nP6X\",\"localCandidateId\":\"Cand-N3dAA/zp\",\"bytesSent\":\"42535\",\"packetsSent\":\"460\"},\"Cand-xxV+nP6X\":{\"id\":\"Cand-xxV+nP6X\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"14268\",\"ipAddress\":\"3.122.181.31\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"Conn-0-1-1\":{\"id\":\"Conn-0-1-1\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"false\",\"googLocalAddress\":\"172.22.63.145:54281\",\"consentRequestsSent\":\"16\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"local\",\"googWritable\":\"false\",\"requestsSent\":\"16\",\"googRemoteAddress\":\"3.122.181.31:14268\",\"googRtt\":\"3000\",\"googActiveConnection\":\"false\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"0\",\"responsesReceived\":\"0\",\"remoteCandidateId\":\"Cand-xxV+nP6X\",\"localCandidateId\":\"Cand-ptPI/8iJ\",\"bytesSent\":\"0\",\"packetsSent\":\"0\"},\"ssrc_493233143_recv\":{\"id\":\"ssrc_493233143_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googDecodingCTN\":\"903\",\"packetsLost\":\"2\",\"googSecondaryDecodedRate\":\"0.00244141\",\"googDecodingPLC\":\"34\",\"packetsReceived\":\"407\",\"googJitterReceived\":\"2\",\"googDecodingCNG\":\"0\",\"ssrc\":\"493233143\",\"googPreferredJitterBufferMs\":\"80\",\"googSpeechExpandRate\":\"0.0394287\",\"totalSamplesDuration\":\"9.03\",\"totalAudioEnergy\":\"0.213002\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"81\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"0.996887\",\"googDecodingNormal\":\"788\",\"googTrackId\":\"9823eb2d-d356-48fa-be23-e524a5fbeb0f\",\"audioOutputLevel\":\"2302\",\"googAccelerateRate\":\"0.0200806\",\"bytesReceived\":\"53896\",\"googCurrentDelayMs\":\"266\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.0723267\",\"googPreemptiveExpandRate\":\"0.00976562\",\"googJitterBufferMs\":\"197\",\"googDecodingMuted\":\"80\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:56:11.137000", "date_updated": "2022-11-09T12:56:13.634000", "id": "ev_4n5Fv3njiVqz29LWEohcHW", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/call/acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG/"}, "object_id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:55:51.226000+00:00", "note": ""}, "request_id": "req_0xqhgkFBVrDTTtrecHiuOf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472660} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "quality_info"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:26.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "date_updated": "2022-11-09T12:55:28.209000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"82760bc0af34bfefd98ecfeec1879bfe38abf514ce89a8c96166511998b12818\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"}],\"reports\":{\"googTrack_6e261e9f-d565-4b88-bcf0-e575827ef07e\":{\"id\":\"googTrack_6e261e9f-d565-4b88-bcf0-e575827ef07e\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googTrackId\":\"6e261e9f-d565-4b88-bcf0-e575827ef07e\"},\"googLibjingleSession_2838677533892739123\":{\"id\":\"googLibjingleSession_2838677533892739123\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_9F:CF:98:FA:9A:5A:AD:0D:BD:73:20:06:AD:8E:7D:D8:BC:33:29:A1:01:EF:9C:05:62:83:9E:9B:05:8C:4A:B0\":{\"id\":\"googCertificate_9F:CF:98:FA:9A:5A:AD:0D:BD:73:20:06:AD:8E:7D:D8:BC:33:29:A1:01:EF:9C:05:62:83:9E:9B:05:8C:4A:B0\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googFingerprint\":\"9F:CF:98:FA:9A:5A:AD:0D:BD:73:20:06:AD:8E:7D:D8:BC:33:29:A1:01:EF:9C:05:62:83:9E:9B:05:8C:4A:B0\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFzCBvaADAgECAgkAq2xFbHyw6GYwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODEyNTUyNloXDTIyMTIwOTEyNTUyNlowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEd8wWHr3V95/pXJ408FMjZcwOeNEAWxnWuXmjoJWQxB50WUNOLP+xZAc1cN4BBJXT7Vx30UYhRfn6wuFYDtVKbTAKBggqhkjOPQQDAgNJADBGAiEAmJCDB0zTzorvEoxavahW8hh6lnfxqq1O/S8VF1vb9RcCIQCqp+V39/nfwdJpm+MBp9gLju5p7jUJ4gT6+5WX4JM6pg==\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_97:A6:08:A2:D4:B6:F1:13:D7:91:0F:94:18:5D:7B:52:CE:E5:95:A6:75:FE:AE:DE:5D:7D:0B:24:D6:57:5B:37\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_9F:CF:98:FA:9A:5A:AD:0D:BD:73:20:06:AD:8E:7D:D8:BC:33:29:A1:01:EF:9C:05:62:83:9E:9B:05:8C:4A:B0\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-z+LG9ev9\":{\"id\":\"Cand-z+LG9ev9\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"51201\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-N/yZUUni\":{\"id\":\"Cand-N/yZUUni\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_4191424957_send\":{\"id\":\"ssrc_4191424957_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"audioInputLevel\":\"37\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googTrackId\":\"6e261e9f-d565-4b88-bcf0-e575827ef07e\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"totalAudioEnergy\":\"4.82827e-08\",\"ssrc\":\"4191424957\",\"googTypingNoiseState\":\"false\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"packetsSent\":\"4\",\"bytesSent\":\"299\",\"totalSamplesDuration\":\"0.8\"},\"googTrack_230935e3-258b-4998-88f6-1892c7342109\":{\"id\":\"googTrack_230935e3-258b-4998-88f6-1892c7342109\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googTrackId\":\"230935e3-258b-4998-88f6-1892c7342109\"},\"googCertificate_97:A6:08:A2:D4:B6:F1:13:D7:91:0F:94:18:5D:7B:52:CE:E5:95:A6:75:FE:AE:DE:5D:7D:0B:24:D6:57:5B:37\":{\"id\":\"googCertificate_97:A6:08:A2:D4:B6:F1:13:D7:91:0F:94:18:5D:7B:52:CE:E5:95:A6:75:FE:AE:DE:5D:7D:0B:24:D6:57:5B:37\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googFingerprint\":\"97:A6:08:A2:D4:B6:F1:13:D7:91:0F:94:18:5D:7B:52:CE:E5:95:A6:75:FE:AE:DE:5D:7D:0B:24:D6:57:5B:37\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQFbrwwGF/ClgNMUwJZgmncKoxpUDAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTI1NTI3WhcNMjIxMjA5MTI1NTI3WjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASoI1NfBaPCav+9hZEY4mfI23dtR9MNJoNlNWIZ8y7Tbi+wzJbeKPHMHK/8l0yKgTwWx/8AjjdFouCp51BlkV9jMAoGCCqGSM49BAMCA0gAMEUCIQCrQ2fkUwzTyjvGaSrdUnBBenm0qVhpABOFR82lxfK8+gIgdjvuKgIXpRgctv87l3XPdpaHf6ZZsMW2d0v6hrBnMJY=\"},\"Cand-qNzkwybV\":{\"id\":\"Cand-qNzkwybV\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"51201\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:51201\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"3\",\"googRemoteAddress\":\"3.122.181.213:16172\",\"googRtt\":\"33\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"843\",\"responsesReceived\":\"3\",\"remoteCandidateId\":\"Cand-gyaiPDi/\",\"localCandidateId\":\"Cand-qNzkwybV\",\"bytesSent\":\"1552\",\"packetsSent\":\"6\"},\"Cand-gyaiPDi/\":{\"id\":\"Cand-gyaiPDi/\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"portNumber\":\"16172\",\"ipAddress\":\"3.122.181.213\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_1501784128_recv\":{\"id\":\"ssrc_1501784128_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:27.600Z\",\"googCaptureStartNtpTimeMs\":\"0\",\"packetsLost\":\"0\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"0\",\"packetsReceived\":\"0\",\"googJitterReceived\":\"0\",\"googDecodingCNG\":\"0\",\"ssrc\":\"1501784128\",\"googPreferredJitterBufferMs\":\"0\",\"googSpeechExpandRate\":\"0\",\"totalSamplesDuration\":\"0\",\"totalAudioEnergy\":\"0\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingCTN\":\"0\",\"googDecodingPLCCNG\":\"0\",\"googCodecName\":\"\",\"googDecodingNormal\":\"0\",\"googTrackId\":\"230935e3-258b-4998-88f6-1892c7342109\",\"googSecondaryDiscardedRate\":\"0\",\"googAccelerateRate\":\"0\",\"bytesReceived\":\"0\",\"googCurrentDelayMs\":\"0\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0\",\"googPreemptiveExpandRate\":\"0\",\"googJitterBufferMs\":\"0\",\"googDecodingMuted\":\"0\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:28.212000", "date_updated": "2022-11-09T12:55:28.212000", "id": "ev_338JTqnC3OU2wyZZaX1YmQ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/call/acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF/"}, "object_id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:55:27.654000+00:00", "quality_info": ""}, "request_id": "req_6kWGiNtC8Jy2st7fvcrCfo", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472662} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "local_country_iso", "local_phone", "local_phone_formatted"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:26.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "date_updated": "2022-11-09T12:55:27.654000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:27.655000", "date_updated": "2022-11-09T12:55:27.655000", "id": "ev_0yZfkcZnlYherfA6dd39ey", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/routing/"}, "object_id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:55:26.751000+00:00", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null}, "request_id": "req_4Cdjwr8xSI3N7TsM4HcJ3B", "user_id": null}, "emitted_at": 1670413472664} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:26.751000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:26.751000+00:00", "date_updated": "2022-11-09T12:55:26.751000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:26.753000", "date_updated": "2022-11-09T12:55:26.753000", "id": "ev_1Nhks2bwYGLo4vRMuf9aDf", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_694PvtEQICHUY5umTjEM8nl9bLU0MmWWV6HhMEcqAEF", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2UazVhtujP2Wh8avRgpiou", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472666} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "2", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:23.356000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 10, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:23.369000", "date_updated": "2022-11-09T12:55:23.369000", "id": "ev_7ZYR3t4wLvjqvcM1YoacDQ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-09T12:55:22.036000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413472668} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:22.036000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 10, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"82760bc0af34bfefd98ecfeec1879bfe38abf514ce89a8c96166511998b12818\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"}],\"reports\":{\"googTrack_09c44827-dd89-4806-9d06-7c9180c7dbcc\":{\"id\":\"googTrack_09c44827-dd89-4806-9d06-7c9180c7dbcc\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googTrackId\":\"09c44827-dd89-4806-9d06-7c9180c7dbcc\"},\"googLibjingleSession_5180273005143380330\":{\"id\":\"googLibjingleSession_5180273005143380330\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"3\",\"googTransmitBitrate\":\"0\"},\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\":{\"id\":\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googFingerprint\":\"AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFjCBvaADAgECAgkA/WQ8JkYqo8UwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODEyNTUwM1oXDTIyMTIwOTEyNTUwM1owETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtkLHr0xd28+4HB9Mjoih2l+IpyqOfEzNkdtdw9qr9PYhYjW5n21paLVdwXmfe5a0+0PgS8OkXb7WaTi5UCJqnjAKBggqhkjOPQQDAgNIADBFAiBMMy9P8uLzs/prJceHqSDA+94f+qltrcIU2zJnDGj/XgIhAPsNwE0FWWf0hEyIDM6qCmAhi9Tn0/K49ef2w5u71a6R\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-v1u5geMD\":{\"id\":\"Cand-v1u5geMD\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"50625\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-q+uECo/N\":{\"id\":\"Cand-q+uECo/N\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2188938578_send\":{\"id\":\"ssrc_2188938578_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"audioInputLevel\":\"4\",\"packetsLost\":\"0\",\"googRtt\":\"34\",\"totalSamplesDuration\":\"17.88\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"09c44827-dd89-4806-9d06-7c9180c7dbcc\",\"totalAudioEnergy\":\"0.81361\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2188938578\",\"googJitterReceived\":\"3\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"857\",\"bytesSent\":\"62409\"},\"googTrack_b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\":{\"id\":\"googTrack_b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googTrackId\":\"b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\"},\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\":{\"id\":\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googFingerprint\":\"E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBIDCByKADAgECAhRaviG+yLpUsmlEqppVfRNIw86kXTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTI1NTAzWhcNMjIxMjA5MTI1NTAzWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATVqi7X/IHYgf8ec5KOijI/jnw8bmglsm+A3wgXhPMC2hVCAG0aTuSnOz7CssscyF2xD+8iKl5S8cVfsIKSVnvdMAoGCCqGSM49BAMCA0cAMEQCIGqIQ+ZbF0OuIHnSjC47apET9pU4Xq/NAmaGFRh5HV52AiAhJ3G7avLQ4Au2WfSieayPDtBkjylIPz3zpAfeBf/CCw==\"},\"Cand-haaImfc/\":{\"id\":\"Cand-haaImfc/\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"50625\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:50625\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"11\",\"googRemoteAddress\":\"3.122.181.243:16800\",\"googRtt\":\"31\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"87899\",\"responsesReceived\":\"11\",\"remoteCandidateId\":\"Cand-XUaXIKJX\",\"localCandidateId\":\"Cand-haaImfc/\",\"bytesSent\":\"72539\",\"packetsSent\":\"865\"},\"Cand-XUaXIKJX\":{\"id\":\"Cand-XUaXIKJX\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"portNumber\":\"16800\",\"ipAddress\":\"3.122.181.243\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_2033449191_recv\":{\"id\":\"ssrc_2033449191_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googDecodingCTN\":\"1725\",\"packetsLost\":\"4\",\"googSecondaryDecodedRate\":\"0.0012207\",\"googDecodingPLC\":\"30\",\"packetsReceived\":\"802\",\"googExpandRate\":\"0.03479\",\"googJitterReceived\":\"0\",\"googDecodingCNG\":\"0\",\"ssrc\":\"2033449191\",\"googPreferredJitterBufferMs\":\"20\",\"googSpeechExpandRate\":\"0.0147095\",\"totalSamplesDuration\":\"17.25\",\"totalAudioEnergy\":\"2.97012\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"98\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"0.997437\",\"googDecodingNormal\":\"1597\",\"googTrackId\":\"b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\",\"audioOutputLevel\":\"3804\",\"googAccelerateRate\":\"0.00134277\",\"bytesReceived\":\"78476\",\"googCurrentDelayMs\":\"82\",\"googDecodingCTSG\":\"0\",\"googCaptureStartNtpTimeMs\":\"3876987304910\",\"googPreemptiveExpandRate\":\"0.0012207\",\"googJitterBufferMs\":\"47\",\"googDecodingMuted\":\"97\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:22.038000", "date_updated": "2022-11-09T12:55:22.038000", "id": "ev_500M7Q2P3VDNQCdEXqQHOn", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2hEnuIABKlW2UImqVGj3Lx", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472670} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "duration", "is_joinable", "quality_info", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:22.036000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 10, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"82760bc0af34bfefd98ecfeec1879bfe38abf514ce89a8c96166511998b12818\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"218c8e9b1c7018f1356f16b6b9bed22b48cb5862f07049e4be5576baa57adbbf\"}],\"reports\":{\"googTrack_09c44827-dd89-4806-9d06-7c9180c7dbcc\":{\"id\":\"googTrack_09c44827-dd89-4806-9d06-7c9180c7dbcc\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googTrackId\":\"09c44827-dd89-4806-9d06-7c9180c7dbcc\"},\"googLibjingleSession_5180273005143380330\":{\"id\":\"googLibjingleSession_5180273005143380330\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"3\",\"googTransmitBitrate\":\"0\"},\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\":{\"id\":\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googFingerprint\":\"AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFjCBvaADAgECAgkA/WQ8JkYqo8UwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODEyNTUwM1oXDTIyMTIwOTEyNTUwM1owETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtkLHr0xd28+4HB9Mjoih2l+IpyqOfEzNkdtdw9qr9PYhYjW5n21paLVdwXmfe5a0+0PgS8OkXb7WaTi5UCJqnjAKBggqhkjOPQQDAgNIADBFAiBMMy9P8uLzs/prJceHqSDA+94f+qltrcIU2zJnDGj/XgIhAPsNwE0FWWf0hEyIDM6qCmAhi9Tn0/K49ef2w5u71a6R\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_AB:52:41:CE:9D:21:49:3E:1D:19:E1:18:C5:BA:6E:F7:35:51:D7:D8:74:02:DF:2F:A0:2A:DA:C8:56:17:B1:F6\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-v1u5geMD\":{\"id\":\"Cand-v1u5geMD\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"50625\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-q+uECo/N\":{\"id\":\"Cand-q+uECo/N\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2188938578_send\":{\"id\":\"ssrc_2188938578_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"audioInputLevel\":\"4\",\"packetsLost\":\"0\",\"googRtt\":\"34\",\"totalSamplesDuration\":\"17.88\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"09c44827-dd89-4806-9d06-7c9180c7dbcc\",\"totalAudioEnergy\":\"0.81361\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2188938578\",\"googJitterReceived\":\"3\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"857\",\"bytesSent\":\"62409\"},\"googTrack_b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\":{\"id\":\"googTrack_b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googTrackId\":\"b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\"},\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\":{\"id\":\"googCertificate_E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googFingerprint\":\"E9:B5:CE:AE:66:5F:28:F3:6D:A0:53:07:38:AE:2D:BA:74:0E:54:19:22:B1:30:3B:F9:3B:7E:5E:EE:25:D4:78\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBIDCByKADAgECAhRaviG+yLpUsmlEqppVfRNIw86kXTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTI1NTAzWhcNMjIxMjA5MTI1NTAzWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATVqi7X/IHYgf8ec5KOijI/jnw8bmglsm+A3wgXhPMC2hVCAG0aTuSnOz7CssscyF2xD+8iKl5S8cVfsIKSVnvdMAoGCCqGSM49BAMCA0cAMEQCIGqIQ+ZbF0OuIHnSjC47apET9pU4Xq/NAmaGFRh5HV52AiAhJ3G7avLQ4Au2WfSieayPDtBkjylIPz3zpAfeBf/CCw==\"},\"Cand-haaImfc/\":{\"id\":\"Cand-haaImfc/\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"50625\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:50625\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"11\",\"googRemoteAddress\":\"3.122.181.243:16800\",\"googRtt\":\"31\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"87899\",\"responsesReceived\":\"11\",\"remoteCandidateId\":\"Cand-XUaXIKJX\",\"localCandidateId\":\"Cand-haaImfc/\",\"bytesSent\":\"72539\",\"packetsSent\":\"865\"},\"Cand-XUaXIKJX\":{\"id\":\"Cand-XUaXIKJX\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"portNumber\":\"16800\",\"ipAddress\":\"3.122.181.243\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_2033449191_recv\":{\"id\":\"ssrc_2033449191_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T12:55:21.168Z\",\"googDecodingCTN\":\"1725\",\"packetsLost\":\"4\",\"googSecondaryDecodedRate\":\"0.0012207\",\"googDecodingPLC\":\"30\",\"packetsReceived\":\"802\",\"googExpandRate\":\"0.03479\",\"googJitterReceived\":\"0\",\"googDecodingCNG\":\"0\",\"ssrc\":\"2033449191\",\"googPreferredJitterBufferMs\":\"20\",\"googSpeechExpandRate\":\"0.0147095\",\"totalSamplesDuration\":\"17.25\",\"totalAudioEnergy\":\"2.97012\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"98\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"0.997437\",\"googDecodingNormal\":\"1597\",\"googTrackId\":\"b893eb76-fcaf-488a-b2fe-b8dfb15ed99a\",\"audioOutputLevel\":\"3804\",\"googAccelerateRate\":\"0.00134277\",\"bytesReceived\":\"78476\",\"googCurrentDelayMs\":\"82\",\"googDecodingCTSG\":\"0\",\"googCaptureStartNtpTimeMs\":\"3876987304910\",\"googPreemptiveExpandRate\":\"0.0012207\",\"googJitterBufferMs\":\"47\",\"googDecodingMuted\":\"97\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:21.763000", "date_updated": "2022-11-09T12:55:22.038000", "id": "ev_4dCU6amW7DoQMXuOEFAn6O", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:55:11.703000+00:00", "duration": 0, "is_joinable": true, "quality_info": "", "status": "in-progress"}, "request_id": "req_2hEnuIABKlW2UImqVGj3Lx", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472672} +{"stream": "events", "data": {"action": "answered", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:11.703000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:11.706000", "date_updated": "2022-11-09T12:55:11.706000", "id": "ev_48iYqa0do3IG2fG0JxVQGc", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2KKEBW1jB2wSC82fplTMdt", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472674} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_answered", "date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T12:55:11.703000+00:00", "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:11.703000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:11.706000", "date_updated": "2022-11-09T12:55:11.706000", "id": "ev_3QuGphJcZgnpuFbIYgfWHJ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_answered": null, "date_updated": "2022-11-09T12:55:05.533000+00:00", "disposition": null, "status": "created"}, "request_id": "req_2KKEBW1jB2wSC82fplTMdt", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472676} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_joinable", "local_country_iso", "local_phone", "local_phone_formatted"], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:05.533000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:04.133000", "date_updated": "2022-11-09T12:55:05.536000", "id": "ev_6by0SB0UTnyFx9UX3J1VZG", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/callback/conference/acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:55:03.314000+00:00", "is_joinable": false, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null}, "request_id": "req_2mihBJsrSB5x5ZOiqdtEoE", "user_id": null}, "emitted_at": 1670413472678} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T12:55:03.314000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T12:55:03.314000+00:00", "date_updated": "2022-11-09T12:55:03.314000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T12:55:03.317000", "date_updated": "2022-11-09T12:55:03.317000", "id": "ev_51BRquzkyVr5Zrdkp42NBg", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_xzjEYrejim9F9IWz4mrs16ehPCcnUcit43wJTZkwuhv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6gnVYDb2Ib93OTXynTgtiF", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472680} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:44.404000+00:00", "attachments": [{"content_type": "image/png", "filename": "Airbyte_logo_75x75.png", "media_id": "media_580CfGelcIvP5BzvIYTlhX", "size": 6132}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "3", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T12:54:44.404000+00:00", "date_updated": "2022-11-09T12:54:44.405000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:44.413000", "date_updated": "2022-11-09T12:54:44.413000", "id": "ev_54dCY7IjySyK5k5Rlj2UEg", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-09T12:54:15.456000+00:00", "date_sent": null, "date_updated": "2022-11-09T12:54:43.607000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472681} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:44.404000+00:00", "attachments": [{"content_type": "image/png", "filename": "Airbyte_logo_75x75.png", "media_id": "media_580CfGelcIvP5BzvIYTlhX", "size": 6132}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "3", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T12:54:44.404000+00:00", "date_updated": "2022-11-09T12:54:44.405000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:44.413000", "date_updated": "2022-11-09T12:54:44.413000", "id": "ev_292Po84gIdT7Db3dJcaK1Y", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472683} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:15.456000+00:00", "attachments": [{"content_type": "image/png", "filename": "Airbyte_logo_75x75.png", "media_id": "media_580CfGelcIvP5BzvIYTlhX", "size": 6132}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "3", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:43.607000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:43.612000", "date_updated": "2022-11-09T12:54:43.612000", "id": "ev_2DadOynz88dMnyAwwdx26R", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-09T12:54:31.337000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413472685} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:15.456000+00:00", "attachments": [{"content_type": "image/png", "filename": "Airbyte_logo_75x75.png", "media_id": "media_580CfGelcIvP5BzvIYTlhX", "size": 6132}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:31.337000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:31.339000", "date_updated": "2022-11-09T12:54:31.339000", "id": "ev_1zHxUwvpw6b4cd7vbjUqeE", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP/"}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:54:26.801000+00:00", "status": "draft"}, "request_id": "req_59ahV2CsYVC0e5dxzxAyJi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472687} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["attachments", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:15.456000+00:00", "attachments": [{"content_type": "image/png", "filename": "Airbyte_logo_75x75.png", "media_id": "media_580CfGelcIvP5BzvIYTlhX", "size": 6132}], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:26.376000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:26.378000", "date_updated": "2022-11-09T12:54:26.378000", "id": "ev_79KDhgBttSrsYXCparqRrP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP/"}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"attachments": [], "date_updated": "2022-11-09T12:54:19.562000+00:00"}, "request_id": "req_1rGhGzx6eUywwW2WqNM7k7", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472689} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T12:54:23.168000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:23.168000+00:00", "date_updated": "2022-11-09T12:54:24.782000+00:00", "email_ids": ["acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j"], "id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "latest_normalized_subject": "Test Lead + Airbyte", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:54:24.784000", "date_updated": "2022-11-09T12:54:24.784000", "id": "ev_4XR9CACONBMIEGwrAOAOPX", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-09T12:54:03.669000+00:00", "date_created": "2022-11-09T12:54:03.669000+00:00", "date_updated": "2022-11-09T12:54:10.293000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472691} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T12:54:23.167000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T12:54:23.167000+00:00", "date_updated": "2022-11-09T12:54:24.761000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:54:23 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799846322.15922.4962027989641879748@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799846322.15922.4962027989641879748@smtpgw.close.com>", "<166799846322.15922.14988047742178474967@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Test Lead + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:54:24.764000", "date_updated": "2022-11-09T12:54:24.764000", "id": "ev_3RUzuwYmlcCHikP15D8UQy", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472693} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status"], "data": {"_type": "Email", "activity_at": "2022-11-09T12:54:23.167000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T12:54:23.167000+00:00", "date_updated": "2022-11-09T12:54:24.761000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:54:23 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799846322.15922.4962027989641879748@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799846322.15922.4962027989641879748@smtpgw.close.com>", "<166799846322.15922.14988047742178474967@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Test Lead + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:54:24.764000", "date_updated": "2022-11-09T12:54:24.764000", "id": "ev_1iXN8SetY5MR3AMZfE4H3I", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-09T12:54:03.668000+00:00", "date_sent": null, "date_updated": "2022-11-09T12:54:10.275000+00:00", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:54:03 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "message_ids": [], "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472695} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "template_id", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:15.456000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:19.562000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:19.565000", "date_updated": "2022-11-09T12:54:19.565000", "id": "ev_7E3mEPRPeYVU9yBcOGdgVE", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP/"}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:54:15.456000+00:00", "template_id": "", "text": ""}, "request_id": "req_3yoeSBsV3CoeFPcMg98VKe", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472697} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T12:54:15.456000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:15.456000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:15.456000+00:00", "direction": "outbound", "error_message": null, "id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T12:54:15.457000", "date_updated": "2022-11-09T12:54:15.457000", "id": "ev_6IF75EiyPp5Vvg1CWWqhon", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_eQ2xwn1RN5sdEXkGpln8Vag8rwPsYfU1qbyeN7dBPsP", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0ZPZJ6U8TxmDUoOofAdeap", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472699} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "email_followup", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-16", "date_created": "2022-11-09T12:54:10.330000+00:00", "date_updated": "2022-11-09T12:54:10.330000+00:00", "email_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "id": "noti_JU7vkNkhpywznaGu5P0WuBWxsMXtzZmkOSXaCxbxTsN", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Test Lead + Airbyte", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-09T12:54:10.332000", "date_updated": "2022-11-09T12:54:10.332000", "id": "ev_635tCJwHRTEwtWPkBomJ1J", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j/"}, "object_id": "noti_JU7vkNkhpywznaGu5P0WuBWxsMXtzZmkOSXaCxbxTsN", "object_type": "task.email_followup", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3APUlFieEfppQoGMY12jSH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472701} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "date_updated", "envelope", "status"], "data": {"_type": "Email", "activity_at": "2022-11-09T12:54:03.668000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:10.275000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:54:03 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Test Lead + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:54:05.962000", "date_updated": "2022-11-09T12:54:10.277000", "id": "ev_3Cn5Wn6kWLlYOQ2cBU3KRQ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j/"}, "object_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_updated": "2022-11-09T12:54:03.679000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "status": "draft"}, "request_id": "req_3APUlFieEfppQoGMY12jSH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472702} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T12:54:03.668000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

I'm Jean with Airbyte. We help companies in the space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n ", "body_text": "Hi Iryna, \n \nI'm Jean with Airbyte. We help companies in the space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Test Lead\nand show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.668000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:54:03.679000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test Lead + Airbyte", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Test Lead + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:54:03.680000", "date_updated": "2022-11-09T12:54:03.680000", "id": "ev_49qvLKfF0S61R72bLqwk5T", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3366fcXVF89b7FiS0HTKTS", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472704} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T12:54:03.669000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:54:03.669000+00:00", "date_updated": "2022-11-09T12:54:03.674000+00:00", "email_ids": ["acti_a3AsG3P38a8yDx0XgI8ZNZR4Ko8XRUBybauASuT8C2j"], "id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "latest_normalized_subject": "Test Lead + Airbyte", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:54:03.676000", "date_updated": "2022-11-09T12:54:03.676000", "id": "ev_02EQZyfqbC64q4160GddEz", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_fFBPZHGPKt60kZG2SzI5ws5OMbysXqCAGJuGlKucDy5", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3366fcXVF89b7FiS0HTKTS", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472708} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-23T09:00:00+00:00", "date_created": "2022-11-09T12:37:29.827000+00:00", "date_updated": "2022-11-09T12:44:26.200000+00:00", "due_date": "2022-11-23T09:00:00+00:00", "id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T12:44:26.201000", "date_updated": "2022-11-09T12:44:26.201000", "id": "ev_6D9KeuOqJ79WsoeNklmsQ6", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY/"}, "object_id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6xSETTx7jB2crvIPxa60IR", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472711} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "object_id", "object_type", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-23T09:00:00+00:00", "date_created": "2022-11-09T12:37:29.827000+00:00", "date_updated": "2022-11-09T12:44:26.200000+00:00", "due_date": "2022-11-23T09:00:00+00:00", "id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T12:44:26.201000", "date_updated": "2022-11-09T12:44:26.201000", "id": "ev_5iF06n4LAYPbziI5p1G3Hu", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY/"}, "object_id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:37:29.827000+00:00", "is_complete": false, "is_new": true, "object_id": null, "object_type": null, "view": "future"}, "request_id": "req_6xSETTx7jB2crvIPxa60IR", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472714} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "TaskCompleted", "activity_at": "2022-11-09T12:44:26.185000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T12:44:26.185000+00:00", "date_updated": "2022-11-09T12:44:26.185000+00:00", "id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to_name": "Jean Lafleur", "task_id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "task_text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:44:26.187000", "date_updated": "2022-11-09T12:44:26.187000", "id": "ev_22Vpdm00otJlcAmDNB2XUi", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY/"}, "object_id": "acti_tEFyhPH4AKZ3YHaqqFEdm9Lot1oEI4yEyKzEf0ncbGE", "object_type": "activity.task_completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6xSETTx7jB2crvIPxa60IR", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472717} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T12:42:01+00:00", "date_created": "2022-11-09T12:42:01+00:00", "date_updated": "2022-11-09T12:42:06.949000+00:00", "emails": ["acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb"], "id": "noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T12:42:06.954000", "date_updated": "2022-11-09T12:42:06.954000", "id": "ev_1v2Q6bfAMhwQFfovnxlpSq", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_usYjV72fgEzHlmX8ZIkBFrFcrnI6ilJ5iZUI1SmNR0i", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472720} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T12:42:01+00:00", "attachments": [{"content_id": null, "content_type": "text/calendar", "filename": "file.ics", "size": 631}, {"content_id": null, "content_type": "application/ics", "filename": "invite.ics", "size": 631}], "bcc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting 2
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Saturday Nov 12, 2022 \u22c5 8pm \u2013 9pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\n", "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting 2\nSaturday Nov 12, 2022 \u22c5 8pm \u2013 9pm\nEastern European Time - Kyiv\n\n\n\nOrganizer\niryna.grankova@airbyte.io\niryna.grankova@airbyte.io\n\nGuests\niryna.grankova@airbyte.io - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://calendar.google.com/calendar/event?action=VIEW&eid=MWRlcDU1cDZtamY0MGxnYnJ2OXI5ajlocG8gaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbw&tok=MjUjaXJ5bmEuZ3JhbmtvdmFAYWlyYnl0ZS5pbzE2Y2ZiMDdkMGQzOTk4OGFmYzI1NGVmYTE3ODEzYzBlNGQ0M2NhMDE&ctz=Europe%2FKiev&hl=en&es=1\n\n~~//~~\nInvitation from Google Calendar: https://calendar.google.com/calendar/\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://support.google.com/calendar/answer/37135#forwarding\n", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date_created": "2022-11-09T12:42:01+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:42:06.830000+00:00", "direction": "incoming", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:42:01 +0000", "from": [{"email": "irina.grankova@gmail.com", "name": ""}], "in_reply_to": null, "is_autoreply": true, "message_id": "<000000000000a8d33605ed08fb3c@google.com>", "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<000000000000a8d33605ed08fb3c@google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "irina.grankova@gmail.com", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "template_id": null, "template_name": null, "thread_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "to": ["iryna.grankova@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:42:06.832000", "date_updated": "2022-11-09T12:42:06.832000", "id": "ev_6cFGIix0lVKxq5IPibmIoT", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472723} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T12:42:01.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-09T12:42:01.001000+00:00", "date_updated": "2022-11-09T12:42:06.826000+00:00", "email_ids": ["acti_5Y0g1Ty898ORU1yMffesNiTs3I4RvFdWWrTErpmJmYb"], "id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "latest_normalized_subject": "Accepted: Test meeting 2 @ Sat Nov 12, 2022 8pm - 9pm (EET) (iryna.grankova@airbyte.io)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:42:06.828000", "date_updated": "2022-11-09T12:42:06.828000", "id": "ev_1qjIIKw20QD7fC91lhyAzq", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_ZtrsNQMEmg7RwStpMzckQc22tjvbESmIdfdBkChH7s5", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472726} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "noreply", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-09T12:41:54.440000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "upcoming", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:41:54.442000", "date_updated": "2022-11-09T12:41:54.442000", "id": "ev_2GTUNPTJi2pMJl136RxH2X", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472729} +{"stream": "events", "data": {"action": "scheduled", "api_key_id": null, "changed_fields": [], "data": {"_type": "Meeting", "activity_at": "2022-11-12T18:00:00+00:00", "attendees": [{"contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "email": "irina.grankova@gmail.com", "is_organizer": false, "name": null, "status": "noreply", "user_id": null}, {"contact_id": null, "email": "iryna.grankova@airbyte.io", "is_organizer": true, "name": null, "status": "yes", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "calendar_event_link": null, "calendar_event_uids": ["1dep55p6mjf40lgbrv9r9j9hpo"], "connected_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-12T18:00:00+00:00", "date_updated": "2022-11-09T12:41:54.440000+00:00", "duration": 3600, "ends_at": "2022-11-12T19:00:00+00:00", "id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "integrations": [], "is_recurring": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "location": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "calendar", "starts_at": "2022-11-12T18:00:00+00:00", "status": "upcoming", "title": "Test meeting 2", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:41:54.442000", "date_updated": "2022-11-09T12:41:54.442000", "id": "ev_0XOHgyef1puaWdftkVTtl3", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_AlRbqNk15jdt7Eq2phHXuV49qSpkLBB7af3mwvJkk1z", "object_type": "activity.meeting", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472733} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-23T09:00:00+00:00", "date_created": "2022-11-09T12:37:29.827000+00:00", "date_updated": "2022-11-09T12:37:29.827000+00:00", "due_date": "2022-11-23T09:00:00+00:00", "id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-09T12:37:29.829000", "date_updated": "2022-11-09T12:37:29.829000", "id": "ev_5WDUj9fZi9UZXv8gAuoQRI", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_KAzmd4tqcQ1dYypqOjeZqmpKVlFZf3LWJfxCSoX29GY", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6abk2H74NhGmk28AWUH8Et", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472736} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:30:58+00:00", "date_created": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T12:36:43.842000+00:00", "emails": [], "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T12:36:43.844000", "date_updated": "2022-11-09T12:36:43.844000", "id": "ev_4NUmEUjQoBLf6Ikp9qalmc", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:36:40.320000+00:00", "is_complete": false, "is_new": true, "view": "inbox"}, "request_id": "req_1o1Wuozl8wV0BibKWLjGsf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472738} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:30:58+00:00", "date_created": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T12:36:40.320000+00:00", "emails": [], "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": null}, "date_created": "2022-11-09T12:36:40.321000", "date_updated": "2022-11-09T12:36:40.321000", "id": "ev_0FJtik5MckIrIhUQWf5lPR", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-09T11:30:58.001000+00:00", "date_created": "2022-11-09T11:30:58.001000+00:00", "date_updated": "2022-11-09T12:36:31.797000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413472740} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "updated_by", "updated_by_name", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:30:58.001000+00:00", "date_created": "2022-11-09T11:30:58.001000+00:00", "date_updated": "2022-11-09T12:36:31.797000+00:00", "emails": [], "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-09T12:36:31.799000", "date_updated": "2022-11-09T12:36:31.799000", "id": "ev_54zlkTymLxqi1J0S9J4p7p", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:31:29.693000+00:00", "is_complete": true, "is_new": false, "updated_by": null, "updated_by_name": null, "view": "archive"}, "request_id": "req_5CWVB9oWISJuAP9KVByswT", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472741} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09", "date_created": "2022-11-09T12:32:37+00:00", "date_updated": "2022-11-09T12:36:09.521000+00:00", "emails": ["acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa"], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": null}, "date_created": "2022-11-09T12:36:09.526000", "date_updated": "2022-11-09T12:36:09.526000", "id": "ev_7dRtyI5VjcdtYwFy9Zy0SV", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-23", "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:36:08.563000+00:00", "emails": []}, "request_id": null, "user_id": null}, "emitted_at": 1670413472743} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-23", "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:36:08.563000+00:00", "emails": [], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-09T12:36:08.564000", "date_updated": "2022-11-09T12:36:08.564000", "id": "ev_1b0vIHmAqssQ86ATdHw3oM", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:35:50.841000+00:00", "view": "inbox"}, "request_id": "req_0uieDRW3t9soNskz7FXPl2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472745} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "updated_by", "updated_by_name", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T12:32:37.001000+00:00", "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:35:50.841000+00:00", "emails": [], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-09T12:35:50.843000", "date_updated": "2022-11-09T12:35:50.843000", "id": "ev_12fEtwAoVrhx1nwPXjgfLP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T12:33:05.618000+00:00", "is_complete": true, "is_new": false, "updated_by": null, "updated_by_name": null, "view": "archive"}, "request_id": "req_0h8vzXZQQvcmH4C84zYM3U", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472747} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails", "is_complete", "is_new"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T12:32:37.001000+00:00", "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:33:05.618000+00:00", "emails": [], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T12:33:05.620000", "date_updated": "2022-11-09T12:33:05.620000", "id": "ev_3Ox9cSgzELGVXBVw4vbbis", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-09T12:32:37+00:00", "date_created": "2022-11-09T12:32:37+00:00", "date_updated": "2022-11-09T12:32:49.637000+00:00", "emails": ["acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa"], "is_complete": false, "is_new": true}, "request_id": null, "user_id": null}, "emitted_at": 1670413472749} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T12:32:37+00:00", "date_created": "2022-11-09T12:32:37+00:00", "date_updated": "2022-11-09T12:32:49.637000+00:00", "emails": ["acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa"], "id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T12:32:49.644000", "date_updated": "2022-11-09T12:32:49.644000", "id": "ev_2nQD1iLhOZ0X6YBGNvKLNF", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_u4egpo7XbQjk9MNdMc9P1nYRlMTIXJhFeH6JdRxq7L4", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472751} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T12:32:37+00:00", "attachments": [{"content_id": null, "content_type": "text/calendar", "filename": "file.ics", "size": 1206}, {"content_id": null, "content_type": "application/ics", "filename": "invite.ics", "size": 1206}], "bcc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Friday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

\n", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6", "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nFriday Nov 11, 2022 \u22c5 5:15pm \u2013 6:15pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/TpmBCG6rEQC4MxPVFKSfql?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/bAkfCJ6xR7CwYG27tGX2ya?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/QMWsCKryR5iWngYjC3LjFf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/nKJWCL9zR5i91xgJfmFOtP?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/am2dCM8A65U3ZKLQfQyCij?domain=support.google.com\n", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date_created": "2022-11-09T12:32:37+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T12:32:49.521000+00:00", "direction": "incoming", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 12:32:37 +0000", "from": [{"email": "irina.grankova@gmail.com", "name": ""}], "in_reply_to": null, "is_autoreply": true, "message_id": "<0000000000000d111305ed08dada@google.com>", "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<0000000000000d111305ed08dada@google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "irina.grankova@gmail.com", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "template_id": null, "template_name": null, "thread_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "to": ["iryna.grankova@globallogic.com"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T12:32:49.522000", "date_updated": "2022-11-09T12:32:49.522000", "id": "ev_5ZgMbqGdM2rWDjl9tZpkhU", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472753} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T12:32:37.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-09T12:32:37.001000+00:00", "date_updated": "2022-11-09T12:32:49.517000+00:00", "email_ids": ["acti_frY4M6FyB8u7aHWUhSAKCaL92i02ID0YZQdnQlBrWLa"], "id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "latest_normalized_subject": "Accepted: Test meeting @ Fri Nov 11, 2022 5:15pm - 6:15pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T12:32:49.519000", "date_updated": "2022-11-09T12:32:49.519000", "id": "ev_0afL14ELZ5Gac898vEHOZs", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_L68aSWHKLy0BQmpbi7UHKVrrB2B4meTPGrpJgR8rMIv", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413472755} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails", "is_complete", "is_new"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:30:58.001000+00:00", "date_created": "2022-11-09T11:30:58.001000+00:00", "date_updated": "2022-11-09T11:31:29.693000+00:00", "emails": [], "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T11:31:29.695000", "date_updated": "2022-11-09T11:31:29.695000", "id": "ev_4KnYLKOJBfvPCCDRbhcEww", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-09T11:30:58+00:00", "date_created": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T11:31:12.064000+00:00", "emails": ["acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ"], "is_complete": false, "is_new": true}, "request_id": null, "user_id": null}, "emitted_at": 1670413472757} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "emails", "is_complete", "is_new", "updated_by", "updated_by_name", "view"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "Test\n\n\n", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:28:52+00:00", "date_created": "2022-11-09T11:28:52+00:00", "date_updated": "2022-11-09T11:31:12.492000+00:00", "emails": [], "id": "noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1", "is_complete": true, "is_new": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T11:31:12.494000", "date_updated": "2022-11-09T11:31:12.494000", "id": "ev_3tOtuSbMsX19dyCliD8POI", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1/"}, "object_id": "noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:29:03.477000+00:00", "emails": ["acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq"], "is_complete": false, "is_new": true, "updated_by": null, "updated_by_name": null, "view": "inbox"}, "request_id": "req_6yL5E9ucm2MkKTpGB2EVxh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413472759} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:30:58+00:00", "date_created": "2022-11-09T11:30:58+00:00", "date_updated": "2022-11-09T11:31:12.064000+00:00", "emails": ["acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ"], "id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T11:31:12.070000", "date_updated": "2022-11-09T11:31:12.070000", "id": "ev_0foCnqiNQpnkw2CxSW2UL4", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_XTCois7JGpR9LHGKnKi2dh6O5KmlMeyraJlEcPNnNOB", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473478} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T11:30:58+00:00", "attachments": [{"content_id": null, "content_type": "text/calendar", "filename": "file.ics", "size": 1206}, {"content_id": null, "content_type": "application/ics", "filename": "invite.ics", "size": 1206}], "bcc": [], "body_html": "\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n Test meeting
 
irina.grankova@gmail.com has accepted this invitation.
 

When

Wednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm (Eastern European Time - Kyiv)

Invitation from Google Calendar

You are receiving this email because you are subscribed to calendar notifications. To stop receiving these emails, go to Calendar settings, select this calendar, and change \"Other notifications\".

Forwarding this invitation could allow any recipient to send a response to the organizer, be added to the guest list, invite others regardless of their own invitation status, or modify your RSVP. Learn more

\n", "body_preview": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLi", "body_text": "irina.grankova@gmail.com has accepted this invitation.\n\nTest meeting\nWednesday Nov 9, 2022 \u22c5 2pm \u2013 3pm\nEastern European Time - Kyiv\n\nJoin with Google Meet\nhttps://protect-us.mimecast.com/s/8tXrC9rNmLiqB6yJSowlDc?domain=meet.google.com\n\n\n\t\nJoin by phone\n(GB) +44 20 3937 0463\nPIN: 318167082\n\nMore phone numbers\nhttps://protect-us.mimecast.com/s/mRXXC0R7BXCB39OnhDVap6?domain=tel.meet\n\n\nOrganizer\niryna.grankova@globallogic.com\niryna.grankova@globallogic.com\n\nGuests\niryna.grankova@globallogic.com - organizer\nirina.grankova@gmail.com\nView all guest info \nhttps://protect-us.mimecast.com/s/bSDoCgJEPQHy2jXvC2d9qf?domain=calendar.google.com\n\n~~//~~\nInvitation from Google Calendar: https://protect-us.mimecast.com/s/HBvSCjRKPOCmqwLzC7efZi?domain=calendar.google.com\n\nYou are receiving this email because you are an attendee on the event. To \nstop receiving future updates for this event, decline this event.\n\nForwarding this invitation could allow any recipient to send a response to \nthe organizer, be added to the guest list, invite others regardless of \ntheir own invitation status, or modify your RSVP.\n\nLearn more https://protect-us.mimecast.com/s/yispCkRLPOCBQRVDhJsq8W?domain=support.google.com\n", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date_created": "2022-11-09T11:30:58+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:31:11.939000+00:00", "direction": "incoming", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:30:58 +0000", "from": [{"email": "irina.grankova@gmail.com", "name": ""}], "in_reply_to": null, "is_autoreply": true, "message_id": "<0000000000009b99c605ed07fdaf@google.com>", "reply_to": [{"email": "irina.grankova@gmail.com", "name": ""}], "sender": [{"email": "calendar-notification@google.com", "name": "Google Calendar"}], "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<0000000000009b99c605ed07fdaf@google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "irina.grankova@gmail.com", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "template_id": null, "template_name": null, "thread_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "to": ["iryna.grankova@globallogic.com"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:31:11.941000", "date_updated": "2022-11-09T11:31:11.941000", "id": "ev_5CQ7gLoj7qOpLAuWEBoBEe", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473480} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T11:30:58.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-09T11:30:58.001000+00:00", "date_updated": "2022-11-09T11:31:11.934000+00:00", "email_ids": ["acti_90yRG8Hy4yCw7kRWEfJTRmf6QjmPseSWCxCLnwcSJfQ"], "id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "latest_normalized_subject": "Accepted: Test meeting @ Wed Nov 9, 2022 2pm - 3pm (EET) (iryna.grankova@globallogic.com)", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "irina.grankova@gmail.com", "name": ""}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T11:31:11.936000", "date_updated": "2022-11-09T11:31:11.936000", "id": "ev_3r7UaC3WcAL1KR47sejIKs", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_O0aBSkKyCb6DER1hfih6a2bbOzqTWdX0H8Q4uEdbLnb", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473483} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "Test\n\n\n", "cleared_followups": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date": "2022-11-09T11:28:52+00:00", "date_created": "2022-11-09T11:28:52+00:00", "date_updated": "2022-11-09T11:29:03.477000+00:00", "emails": ["acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq"], "id": "noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "Test Lead", "object_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Test", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-09T11:29:03.484000", "date_updated": "2022-11-09T11:29:03.484000", "id": "ev_4bdGFCFaDRsA7QQ5yyNKuN", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "noti_riWe7WgmaFmLFb5coiG1xDTXA0gj1YIQ0NyMpBpwmj1", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473484} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T11:28:52+00:00", "attachments": [], "bcc": [], "body_html": "Test
\n
\n
\n", "body_preview": "Test\n\n\n", "body_text": "Test\n\n\n", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date_created": "2022-11-09T11:28:52+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:29:03.355000+00:00", "direction": "incoming", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Wed, 9 Nov 2022 13:28:52 +0200", "from": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "in_reply_to": null, "is_autoreply": false, "message_id": "", "reply_to": [], "sender": [{"email": "globallogic@airbyte.io", "name": ""}], "subject": "Test", "to": [{"email": "integration-test@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [""], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Irina Grankova ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Test", "template_id": null, "template_name": null, "thread_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "to": ["integration-test@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:29:03.357000", "date_updated": "2022-11-09T11:29:03.357000", "id": "ev_3NH7ym73W0LL84V0xe4vsM", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473486} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T11:28:52.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-09T11:28:52.001000+00:00", "date_updated": "2022-11-09T11:29:03.351000+00:00", "email_ids": ["acti_EI3xv4nNGN7MNydTjlXHp5UmxEPKJhbpUtKf5lxg6Uq"], "id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "latest_normalized_subject": "Test", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T11:29:03.353000", "date_updated": "2022-11-09T11:29:03.353000", "id": "ev_1M1SRkTLRFFIcFl80zgIkh", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_p8SyYmT6CzaYHH6UQksWRLewcU6AjwNl1JbgPbp9Uai", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413473488} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-09T11:25:32.264000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T11:25:32.264000+00:00", "date_updated": "2022-11-09T11:29:01.481000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:25:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799313228.17776.4777225093537029355@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799313228.17776.4777225093537029355@smtpgw.close.com>", "<166799313228.17776.3152755854733402602@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "104.28.131.166", "opened_at": "2022-11-09T11:29:01.480000+00:00", "opened_by": "irina.grankova@gmail.com", "user_agent": "Mozilla/5.0"}], "opens_summary": "Opened by irina.grankova@gmail.com (2022-11-09)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:29:01.483000", "date_updated": "2022-11-09T11:29:01.483000", "id": "ev_2CJvagD7mcrMXJV6aJoGly", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "GET", "request_path": "/t/F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs/7LkEiQUps7.png"}, "object_id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:25:33.601000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_4PYgKKXXDY5ZZ2AKU9FIci", "user_id": null}, "emitted_at": 1670413473490} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status_id", "status_label"], "data": {"addresses": [], "contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-09T11:25:53.720000+00:00", "description": "", "display_name": "Test Lead", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Test Lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "status_label": "Interested", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-09T11:25:53.721000", "date_updated": "2022-11-09T11:25:53.721000", "id": "ev_0E3m3TQqgKlH71u0pi4mrw", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j/"}, "object_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:25:33.637000+00:00", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential"}, "request_id": "req_2YfLYpNHE9IDPebt1OZuUQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473492} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "LeadStatusChange", "activity_at": "2022-11-09T11:25:53.697000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:53.697000+00:00", "date_updated": "2022-11-09T11:25:53.697000+00:00", "id": "acti_8ygqbcNLU7NG3a6koeZKmfOGmaigvifz4IaeQpMbAcc", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "new_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "new_status_label": "Interested", "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "old_status_label": "Potential", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:25:53.700000", "date_updated": "2022-11-09T11:25:53.700000", "id": "ev_5urKESwwSbTbzsY9VMTfQJ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j/"}, "object_id": "acti_8ygqbcNLU7NG3a6koeZKmfOGmaigvifz4IaeQpMbAcc", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2YfLYpNHE9IDPebt1OZuUQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473494} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T11:25:32.265000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:32.265000+00:00", "date_updated": "2022-11-09T11:25:33.620000+00:00", "email_ids": ["acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs"], "id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T11:25:33.622000", "date_updated": "2022-11-09T11:25:33.622000", "id": "ev_6Gr17WAL1oRw4yhcvtvJZ4", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-09T11:25:17.426000+00:00", "date_created": "2022-11-09T11:25:17.426000+00:00", "date_updated": "2022-11-09T11:25:19.551000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473496} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T11:25:32.264000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T11:25:32.264000+00:00", "date_updated": "2022-11-09T11:25:33.601000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:25:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799313228.17776.4777225093537029355@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799313228.17776.4777225093537029355@smtpgw.close.com>", "<166799313228.17776.3152755854733402602@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:25:33.603000", "date_updated": "2022-11-09T11:25:33.603000", "id": "ev_4nssQCeScQosUR5j8pCWNS", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473498} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status"], "data": {"_type": "Email", "activity_at": "2022-11-09T11:25:32.264000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_scheduled": null, "date_sent": "2022-11-09T11:25:32.264000+00:00", "date_updated": "2022-11-09T11:25:33.601000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:25:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166799313228.17776.4777225093537029355@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<166799313228.17776.4777225093537029355@smtpgw.close.com>", "<166799313228.17776.3152755854733402602@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:25:33.603000", "date_updated": "2022-11-09T11:25:33.603000", "id": "ev_1nXaf1agwwYgmlkfXSw3CN", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-09T11:25:17.425000+00:00", "date_sent": null, "date_updated": "2022-11-09T11:25:19.530000+00:00", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:25:17 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "message_ids": [], "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473500} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "date_updated", "envelope", "status"], "data": {"_type": "Email", "activity_at": "2022-11-09T11:25:17.425000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:25:19.530000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Wed, 09 Nov 2022 11:25:17 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:25:19.532000", "date_updated": "2022-11-09T11:25:19.532000", "id": "ev_1tVX4tSZHujXCgy5VzyNZW", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs/"}, "object_id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "date_updated": "2022-11-09T11:25:17.439000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "status": "draft"}, "request_id": "req_5K524FQ1x8WkBqYMOkvPXW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473502} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-09T11:25:17.425000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Iryna,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Iryna, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.425000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:25:17.439000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "irina.grankova@gmail.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "to": ["irina.grankova@gmail.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:25:17.440000", "date_updated": "2022-11-09T11:25:17.440000", "id": "ev_40tkrNW95QnKIg3VahfkjI", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1808BcVOY1sElBM0Rq99PI", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473504} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-09T11:25:17.426000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:25:17.426000+00:00", "date_updated": "2022-11-09T11:25:17.434000+00:00", "email_ids": ["acti_F6ayqbtGLtiJhO71X2jTAgO2IqmCaeqsLtU1KPdFBUs"], "id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-09T11:25:17.437000", "date_updated": "2022-11-09T11:25:17.437000", "id": "ev_4vcY85NzRPwU6OMmP75L7d", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_BTq3BHQBUWUwhoacAcOSjg1gBUfmbtQv8wn1QFzHtSE", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1808BcVOY1sElBM0Rq99PI", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473506} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "display_name", "name"], "data": {"addresses": [], "contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-09T11:24:11.537000+00:00", "description": "", "display_name": "Test Lead", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Test Lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-09T11:24:11.539000", "date_updated": "2022-11-09T11:24:11.539000", "id": "ev_55xEWF0m9Hq35kBGl8PvbV", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j/"}, "object_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:59:59.666000+00:00", "display_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "name": "has:phone_numbers opportunities:1 calls:0 tasks:0"}, "request_id": "req_5bnwTsEA1HPNBCw6jz75qo", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473508} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "2", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:42.502000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 3, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:42.516000", "date_updated": "2022-11-09T11:20:42.516000", "id": "ev_7iglHptpytSKVapvqOzkdp", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-09T11:20:41.318000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413473510} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:41.318000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 3, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"0177d978ede26833baa2fb03ee9aac78299a462efc2fbabc0e58864ef0286102\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"}],\"reports\":{\"googTrack_7c163ea6-87e1-4db8-b5d2-1d93ed359d82\":{\"id\":\"googTrack_7c163ea6-87e1-4db8-b5d2-1d93ed359d82\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googTrackId\":\"7c163ea6-87e1-4db8-b5d2-1d93ed359d82\"},\"googLibjingleSession_2197092195188918700\":{\"id\":\"googLibjingleSession_2197092195188918700\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\":{\"id\":\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googFingerprint\":\"D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFzCBvaADAgECAgkA9AjVBu/K1YowCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODExMjAzMloXDTIyMTIwOTExMjAzMlowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKxw6Y+YE+lSHCZMp+e5703DcSmIveeMc2Xe+tF8e+1tVA6TgyxJduyPUJVrt1m9KQ1L2wrFPEEkEBdLWRoZBizAKBggqhkjOPQQDAgNJADBGAiEAtUof2sGJWtpKQTPDBlQUyGNvvTN0HenYHx0VtvQ6Q+cCIQCjQDXu5GN46aG/6zrLSz4+ACutfHtTJMF9is8AKImOsg==\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-vnGFkk6j\":{\"id\":\"Cand-vnGFkk6j\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"60433\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-dRjKJ3Wq\":{\"id\":\"Cand-dRjKJ3Wq\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2574602948_send\":{\"id\":\"ssrc_2574602948_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"audioInputLevel\":\"41\",\"packetsLost\":\"0\",\"googRtt\":\"37\",\"totalSamplesDuration\":\"7.81\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"7c163ea6-87e1-4db8-b5d2-1d93ed359d82\",\"totalAudioEnergy\":\"0.131527\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2574602948\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"354\",\"bytesSent\":\"27959\"},\"googTrack_15d1c174-575b-485d-b18b-31c3e65e35c8\":{\"id\":\"googTrack_15d1c174-575b-485d-b18b-31c3e65e35c8\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googTrackId\":\"15d1c174-575b-485d-b18b-31c3e65e35c8\"},\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\":{\"id\":\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googFingerprint\":\"F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhRhmpV52OIEAIyrWKctOACEaQV6BzAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTEyMDMzWhcNMjIxMjA5MTEyMDMzWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARngo+PwX7y15a1n+OepiMCY1QlNy9sFzDFnKDWev3FUiR3kFn8/4pt6H6oRt2r9HnvEqOAi7G/gcZk2Ub+KDaZMAoGCCqGSM49BAMCA0gAMEUCIQD5K3ai5o6+DXaoEYWfNRG61yYBtOsW1BlYbh1JOQgLeAIgHT/nn65p0FMHvklKl0NmEeTiH7K5AzAS20DpVZneYg4=\"},\"Cand-k44zVjXx\":{\"id\":\"Cand-k44zVjXx\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"60433\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:60433\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.63:13076\",\"googRtt\":\"37\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"23319\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-1QdfFSK0\",\"localCandidateId\":\"Cand-k44zVjXx\",\"bytesSent\":\"32897\",\"packetsSent\":\"359\"},\"Cand-1QdfFSK0\":{\"id\":\"Cand-1QdfFSK0\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"portNumber\":\"13076\",\"ipAddress\":\"3.122.181.63\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_1257216503_recv\":{\"id\":\"ssrc_1257216503_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googDecodingCTN\":\"717\",\"packetsLost\":\"1\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"17\",\"packetsReceived\":\"302\",\"googJitterReceived\":\"3\",\"googDecodingCNG\":\"0\",\"ssrc\":\"1257216503\",\"googPreferredJitterBufferMs\":\"180\",\"googSpeechExpandRate\":\"0.0244751\",\"totalSamplesDuration\":\"7.17\",\"totalAudioEnergy\":\"0.0245782\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"121\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"579\",\"googTrackId\":\"15d1c174-575b-485d-b18b-31c3e65e35c8\",\"audioOutputLevel\":\"1\",\"googAccelerateRate\":\"0\",\"bytesReceived\":\"19187\",\"googCurrentDelayMs\":\"179\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.115234\",\"googPreemptiveExpandRate\":\"0.00726318\",\"googJitterBufferMs\":\"292\",\"googDecodingMuted\":\"119\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:41.320000", "date_updated": "2022-11-09T11:20:41.320000", "id": "ev_6ODKgVsQGyzjure7sFADht", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_49m31UziyF539CVzJe1oxU", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473512} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "duration", "is_joinable", "quality_info", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:41.318000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 3, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"0177d978ede26833baa2fb03ee9aac78299a462efc2fbabc0e58864ef0286102\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"bbfb30bab85425723c464facebc9b1b2a541b0df7afcd1ee86693e2b6ea9bffd\"}],\"reports\":{\"googTrack_7c163ea6-87e1-4db8-b5d2-1d93ed359d82\":{\"id\":\"googTrack_7c163ea6-87e1-4db8-b5d2-1d93ed359d82\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googTrackId\":\"7c163ea6-87e1-4db8-b5d2-1d93ed359d82\"},\"googLibjingleSession_2197092195188918700\":{\"id\":\"googLibjingleSession_2197092195188918700\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\":{\"id\":\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googFingerprint\":\"D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFzCBvaADAgECAgkA9AjVBu/K1YowCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwODExMjAzMloXDTIyMTIwOTExMjAzMlowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKxw6Y+YE+lSHCZMp+e5703DcSmIveeMc2Xe+tF8e+1tVA6TgyxJduyPUJVrt1m9KQ1L2wrFPEEkEBdLWRoZBizAKBggqhkjOPQQDAgNJADBGAiEAtUof2sGJWtpKQTPDBlQUyGNvvTN0HenYHx0VtvQ6Q+cCIQCjQDXu5GN46aG/6zrLSz4+ACutfHtTJMF9is8AKImOsg==\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_D8:DD:B7:99:A0:1A:7F:13:93:22:D7:6F:3D:E3:67:60:B6:F1:D6:97:00:9C:94:8F:91:D6:5A:C9:CB:EB:57:86\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-vnGFkk6j\":{\"id\":\"Cand-vnGFkk6j\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"60433\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-dRjKJ3Wq\":{\"id\":\"Cand-dRjKJ3Wq\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"ssrc_2574602948_send\":{\"id\":\"ssrc_2574602948_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"audioInputLevel\":\"41\",\"packetsLost\":\"0\",\"googRtt\":\"37\",\"totalSamplesDuration\":\"7.81\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"7c163ea6-87e1-4db8-b5d2-1d93ed359d82\",\"totalAudioEnergy\":\"0.131527\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"2574602948\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"354\",\"bytesSent\":\"27959\"},\"googTrack_15d1c174-575b-485d-b18b-31c3e65e35c8\":{\"id\":\"googTrack_15d1c174-575b-485d-b18b-31c3e65e35c8\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googTrackId\":\"15d1c174-575b-485d-b18b-31c3e65e35c8\"},\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\":{\"id\":\"googCertificate_F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googFingerprint\":\"F6:54:B9:EC:A1:7D:C0:8F:7C:5B:51:D9:01:D9:67:D1:E1:FF:90:D5:3A:C6:C1:4C:16:BE:43:73:FB:71:EE:82\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhRhmpV52OIEAIyrWKctOACEaQV6BzAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA4MTEyMDMzWhcNMjIxMjA5MTEyMDMzWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARngo+PwX7y15a1n+OepiMCY1QlNy9sFzDFnKDWev3FUiR3kFn8/4pt6H6oRt2r9HnvEqOAi7G/gcZk2Ub+KDaZMAoGCCqGSM49BAMCA0gAMEUCIQD5K3ai5o6+DXaoEYWfNRG61yYBtOsW1BlYbh1JOQgLeAIgHT/nn65p0FMHvklKl0NmEeTiH7K5AzAS20DpVZneYg4=\"},\"Cand-k44zVjXx\":{\"id\":\"Cand-k44zVjXx\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"60433\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853824767\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:60433\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.63:13076\",\"googRtt\":\"37\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"23319\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-1QdfFSK0\",\"localCandidateId\":\"Cand-k44zVjXx\",\"bytesSent\":\"32897\",\"packetsSent\":\"359\"},\"Cand-1QdfFSK0\":{\"id\":\"Cand-1QdfFSK0\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"portNumber\":\"13076\",\"ipAddress\":\"3.122.181.63\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"ssrc_1257216503_recv\":{\"id\":\"ssrc_1257216503_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-09T11:20:40.460Z\",\"googDecodingCTN\":\"717\",\"packetsLost\":\"1\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"17\",\"packetsReceived\":\"302\",\"googJitterReceived\":\"3\",\"googDecodingCNG\":\"0\",\"ssrc\":\"1257216503\",\"googPreferredJitterBufferMs\":\"180\",\"googSpeechExpandRate\":\"0.0244751\",\"totalSamplesDuration\":\"7.17\",\"totalAudioEnergy\":\"0.0245782\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"121\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"579\",\"googTrackId\":\"15d1c174-575b-485d-b18b-31c3e65e35c8\",\"audioOutputLevel\":\"1\",\"googAccelerateRate\":\"0\",\"bytesReceived\":\"19187\",\"googCurrentDelayMs\":\"179\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.115234\",\"googPreemptiveExpandRate\":\"0.00726318\",\"googJitterBufferMs\":\"292\",\"googDecodingMuted\":\"119\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:41.050000", "date_updated": "2022-11-09T11:20:41.320000", "id": "ev_5dBqp1hSwLNZPTg5emzUn1", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:20:38.986000+00:00", "duration": 0, "is_joinable": true, "quality_info": "", "status": "in-progress"}, "request_id": "req_49m31UziyF539CVzJe1oxU", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473514} +{"stream": "events", "data": {"action": "answered", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:38.986000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:38.989000", "date_updated": "2022-11-09T11:20:38.989000", "id": "ev_6hXAZSf9mrZiIdWL6Gyynl", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1Bs9g1EZfTyYT41RlQTJjJ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473516} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_answered", "date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": "2022-11-09T11:20:38.986000+00:00", "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:38.986000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "in-progress", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:38.989000", "date_updated": "2022-11-09T11:20:38.989000", "id": "ev_0XMEJsOA80ZKP9qqd5uX0t", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/twilio/callback/outbound/acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_answered": null, "date_updated": "2022-11-09T11:20:34.887000+00:00", "disposition": null, "status": "created"}, "request_id": "req_1Bs9g1EZfTyYT41RlQTJjJ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473518} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_joinable", "local_country_iso", "local_phone", "local_phone_formatted"], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:34.887000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": true, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:33.495000", "date_updated": "2022-11-09T11:20:34.889000", "id": "ev_3czdWZgRgK3cBOBvK5NQan", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/twilio/callback/conference/acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:20:32.524000+00:00", "is_joinable": false, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null}, "request_id": "req_2sdno5K3DlEjhTNpclkN6P", "user_id": null}, "emitted_at": 1670413473520} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-09T11:20:32.524000+00:00", "call_method": "regular", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-09T11:20:32.524000+00:00", "date_updated": "2022-11-09T11:20:32.524000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-09T11:20:32.526000", "date_updated": "2022-11-09T11:20:32.526000", "id": "ev_1bvD8ilfgd0UfgvXNSs2b7", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_2PDiIs2kT5NQaipTXd1lyavwVLS5a6wipeheGVWOO54", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6sUjmwO2p0W4ocoquG5Ybf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473522} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-09T11:20:03.553000", "date_updated": "2022-11-09T11:20:03.553000", "id": "ev_1ijHfZ8tXdNHuA9ZnFbQ4j", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "DELETE", "request_path": "/api/v1/activity/sms/acti_Gnyh6aO8vqel7IQF7vNLBnCbE9qtVX7Q1w7GLrDAJYv/"}, "object_id": "acti_Gnyh6aO8vqel7IQF7vNLBnCbE9qtVX7Q1w7GLrDAJYv", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "SMS", "activity_at": "2022-11-09T11:20:00.471000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:20:00.471000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:20:00.471000+00:00", "direction": "outbound", "error_message": null, "id": "acti_Gnyh6aO8vqel7IQF7vNLBnCbE9qtVX7Q1w7GLrDAJYv", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "request_id": "req_2sLDsq3iC8wUhce3rvEQ0a", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473524} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T11:20:00.471000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:20:00.471000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T11:20:00.471000+00:00", "direction": "outbound", "error_message": null, "id": "acti_Gnyh6aO8vqel7IQF7vNLBnCbE9qtVX7Q1w7GLrDAJYv", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T11:20:00.474000", "date_updated": "2022-11-09T11:20:00.474000", "id": "ev_5oJa1oB4sRVxKIFYOSJxWr", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_Gnyh6aO8vqel7IQF7vNLBnCbE9qtVX7Q1w7GLrDAJYv", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0g7VZx9CjY4jQYdQ6hUaam", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473525} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:44:17.803000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:44:17.803000+00:00", "date_updated": "2022-11-09T11:12:59.685000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166792225784.2629.13990873364570888607@smtpgw.close.com>", "<166792225784.2629.12825104744076060180@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "85.209.47.207", "opened_at": "2022-11-09T11:12:59.685000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (2022-11-09)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "(no subject)", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:12:59.686000", "date_updated": "2022-11-09T11:12:59.686000", "id": "ev_2mLHkFB2qcuU1tnrzng1yY", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/LKMjsg1Cwf.png"}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:28:55.242000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_1D8wam16hReXRmRF64BumW", "user_id": null}, "emitted_at": 1670413473527} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-09T07:30:00+00:00", "date_created": "2022-11-09T11:05:46.682000+00:00", "date_updated": "2022-11-09T11:06:11.243000+00:00", "due_date": "2022-11-09T07:30:00+00:00", "id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T11:06:11.244000", "date_updated": "2022-11-09T11:06:11.244000", "id": "ev_2FDXULaFhxJ6offJoDp7XD", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0T0TFq6826tse4jpXjuCcZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473529} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "object_id", "object_type", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-09T07:30:00+00:00", "date_created": "2022-11-09T11:05:46.682000+00:00", "date_updated": "2022-11-09T11:06:11.243000+00:00", "due_date": "2022-11-09T07:30:00+00:00", "id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T11:06:10.600000", "date_updated": "2022-11-09T11:06:11.244000", "id": "ev_0k5vRyvRMybU5LUgSUe8NE", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-09T11:05:46.682000+00:00", "is_complete": false, "is_new": true, "object_id": null, "object_type": null, "view": "inbox"}, "request_id": "req_0T0TFq6826tse4jpXjuCcZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473531} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "TaskCompleted", "activity_at": "2022-11-09T11:06:11.134000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T11:06:11.134000+00:00", "date_updated": "2022-11-09T11:06:11.134000+00:00", "id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to_name": "Jean Lafleur", "task_id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "task_text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T11:06:11.147000", "date_updated": "2022-11-09T11:06:11.147000", "id": "ev_6wHeSriiXOxk8fhwk0pWcS", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "acti_DJOFYNqKoXSmPB4yJHVRafxAqhnvk5olHmmihw4cqND", "object_type": "activity.task_completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0T0TFq6826tse4jpXjuCcZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473533} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "due_date", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-12", "date_created": "2022-11-09T11:05:42.844000+00:00", "date_updated": "2022-11-09T11:06:06.147000+00:00", "due_date": "2022-11-12", "id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-09T11:06:06.148000", "date_updated": "2022-11-09T11:06:06.148000", "id": "ev_1YxZniNj5cyrqu1K9ikX6H", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-09T07:00:00+00:00", "date_updated": "2022-11-09T11:05:42.844000+00:00", "due_date": "2022-11-09T07:00:00+00:00", "view": "inbox"}, "request_id": "req_7RisWp5bqTH3iaI2fwWcP6", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473535} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "due_date", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-12", "date_created": "2022-11-08T15:10:57.220000+00:00", "date_updated": "2022-11-09T11:06:06.145000+00:00", "due_date": "2022-11-12", "id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-09T11:06:06.146000", "date_updated": "2022-11-09T11:06:06.146000", "id": "ev_2gDSHqHH4NcpIggBbkYocM", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-08T08:00:00+00:00", "date_updated": "2022-11-08T15:10:57.220000+00:00", "due_date": "2022-11-08T08:00:00+00:00", "view": "inbox"}, "request_id": "req_7RisWp5bqTH3iaI2fwWcP6", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473537} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-09T07:30:00+00:00", "date_created": "2022-11-09T11:05:46.682000+00:00", "date_updated": "2022-11-09T11:05:46.682000+00:00", "due_date": "2022-11-09T07:30:00+00:00", "id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-09T11:05:46.684000", "date_updated": "2022-11-09T11:05:46.684000", "id": "ev_3LuMDB4nxQ2u3yMrDSlunw", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_iHHSk7GuvunATuloc0hM2k2btiuJpasL12GkwHnIVjP", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6VKjZMwRef0sMehjOulcUr", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473539} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-09T07:00:00+00:00", "date_created": "2022-11-09T11:05:42.844000+00:00", "date_updated": "2022-11-09T11:05:42.844000+00:00", "due_date": "2022-11-09T07:00:00+00:00", "id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-09T11:05:42.845000", "date_updated": "2022-11-09T11:05:42.845000", "id": "ev_3UMzH6Zm7pHdwUUaMowZl8", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_7NzjQt8zXoqAUMJsb58EGBP4rqTTbm5iR8jRuOY3MAJ", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4VlxuR1MClDnzOgxkz0QYr", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473541} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30T08:00:00+00:00", "date_created": "2022-11-08T15:13:13.470000+00:00", "date_updated": "2022-11-09T10:57:24.756000+00:00", "due_date": "2022-11-30T08:00:00+00:00", "id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T10:57:24.757000", "date_updated": "2022-11-09T10:57:24.757000", "id": "ev_7bSLsD1s7emtsOWO8vrEke", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD/"}, "object_id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2DdLcTamiMGUdy7ZHF7UrL", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473543} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "object_id", "object_type", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30T08:00:00+00:00", "date_created": "2022-11-08T15:13:13.470000+00:00", "date_updated": "2022-11-09T10:57:24.756000+00:00", "due_date": "2022-11-30T08:00:00+00:00", "id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "is_complete": true, "is_dateless": false, "is_new": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-09T10:57:24.757000", "date_updated": "2022-11-09T10:57:24.757000", "id": "ev_4sWQk4Tzf8iMR5Adztpjjk", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD/"}, "object_id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:13:13.470000+00:00", "is_complete": false, "is_new": true, "object_id": null, "object_type": null, "view": "future"}, "request_id": "req_2DdLcTamiMGUdy7ZHF7UrL", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473544} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "TaskCompleted", "activity_at": "2022-11-09T10:57:24.688000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T10:57:24.688000+00:00", "date_updated": "2022-11-09T10:57:24.688000+00:00", "id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to_name": "Jean Lafleur", "task_id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "task_text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T10:57:24.689000", "date_updated": "2022-11-09T10:57:24.689000", "id": "ev_55flgGWnQNthbCbyYpgtc2", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD/"}, "object_id": "acti_SFQmP02YDdCHlkwAWoEtIfZXEOvhoenTmKVdEw7BtJB", "object_type": "activity.task_completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2DdLcTamiMGUdy7ZHF7UrL", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473546} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-09T10:52:39.971000", "date_updated": "2022-11-09T10:52:39.971000", "id": "ev_0RY8MtnGmnhV3pYq3EdWga", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "DELETE", "request_path": "/api/v1/activity/sms/acti_EF5H704ku60L2PXVDeecQDqPVpc00w48tDLUWCMibo8/"}, "object_id": "acti_EF5H704ku60L2PXVDeecQDqPVpc00w48tDLUWCMibo8", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "SMS", "activity_at": "2022-11-09T10:51:35.403000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T10:51:35.403000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T10:51:35.403000+00:00", "direction": "outbound", "error_message": null, "id": "acti_EF5H704ku60L2PXVDeecQDqPVpc00w48tDLUWCMibo8", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "request_id": "req_10ilizvZFT929rcf5KNZi5", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473548} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T10:51:35.403000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-09T10:51:35.403000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-09T10:51:35.403000+00:00", "direction": "outbound", "error_message": null, "id": "acti_EF5H704ku60L2PXVDeecQDqPVpc00w48tDLUWCMibo8", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T10:51:35.405000", "date_updated": "2022-11-09T10:51:35.405000", "id": "ev_0y51hUsh6RyOOFGGJSjvqX", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_EF5H704ku60L2PXVDeecQDqPVpc00w48tDLUWCMibo8", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2PluSfB4Eew4XSOlMKYitI", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473550} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-09T07:00:01.850000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": "2022-11-09T07:00:00+00:00", "date_sent": "2022-11-09T07:00:01.850000+00:00", "date_updated": "2022-11-09T07:00:01.850000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T07:00:01.852000", "date_updated": "2022-11-09T07:00:01.852000", "id": "ev_2MeydKsm6JOHSYOZ8tvXG7", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473552} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-09T07:00:01.850000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": "2022-11-09T07:00:00+00:00", "date_sent": "2022-11-09T07:00:01.850000+00:00", "date_updated": "2022-11-09T07:00:01.850000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T07:00:01.852000", "date_updated": "2022-11-09T07:00:01.852000", "id": "ev_2EvhJfDdEnTsupCIFyLby2", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:01:55.510000+00:00", "date_sent": null, "date_updated": "2022-11-09T07:00:01.142000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413473554} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:55.510000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": "2022-11-09T07:00:00+00:00", "date_sent": null, "date_updated": "2022-11-09T07:00:01.142000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-09T07:00:00.928000", "date_updated": "2022-11-09T07:00:01.144000", "id": "ev_2mnFpgRnXfOdQqzpAmnYa2", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T15:44:34.783000+00:00", "status": "scheduled"}, "request_id": null, "user_id": null}, "emitted_at": 1670413473556} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-09T02:40:26.387000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T19:21:22.529000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T22:08:24.873000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "104.28.57.228", "opened_at": "2022-11-09T02:40:26.387000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0"}], "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T02:40:26.389000", "date_updated": "2022-11-09T02:40:26.389000", "id": "ev_31rYqots7eYBLLbEpydjYN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW/dZva3CP7tI.png"}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T22:08:24.873000+00:00", "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T19:21:22.529000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T22:08:24.873000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (4 times, latest 2022-11-08)"}, "request_id": "req_1RH0PlXUrnXXbxW8pMJnCe", "user_id": null}, "emitted_at": 1670413473558} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-09T02:40:26.385000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.169", "opened_at": "2022-11-08T19:23:49.925000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.180", "opened_at": "2022-11-08T21:43:30.790000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "104.28.57.228", "opened_at": "2022-11-09T02:40:26.385000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0"}], "opens_summary": "Opened by Steli Efti (5 times, latest 2022-11-09)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-09T02:40:26.389000", "date_updated": "2022-11-09T02:40:26.389000", "id": "ev_1okyn62vQZgkPpQRebMtFr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y/dZva3CP7tI.png"}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T21:43:30.790000+00:00", "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.169", "opened_at": "2022-11-08T19:23:49.925000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.180", "opened_at": "2022-11-08T21:43:30.790000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (4 times, latest 2022-11-08)"}, "request_id": "req_72rqyqKlE2NFhOtFqx10GQ", "user_id": null}, "emitted_at": 1670413473560} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-08T22:08:24.873000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T19:21:22.529000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T22:08:24.873000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (4 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T22:08:24.874000", "date_updated": "2022-11-08T22:08:24.874000", "id": "ev_70DxFYxAhvJYOgsTcOmmFl", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW/dZva3CP7tI.png"}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T19:21:22.530000+00:00", "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T19:21:22.529000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (3 times, latest 2022-11-08)"}, "request_id": "req_5KrsYdqmOV4PD5JUYlmSKw", "user_id": null}, "emitted_at": 1670413473562} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-08T21:43:30.790000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.169", "opened_at": "2022-11-08T19:23:49.925000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.180", "opened_at": "2022-11-08T21:43:30.790000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (4 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T21:43:30.791000", "date_updated": "2022-11-08T21:43:30.791000", "id": "ev_5S5eNcxWFgPQ9jWVmcJBJR", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y/dZva3CP7tI.png"}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T19:23:49.926000+00:00", "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.169", "opened_at": "2022-11-08T19:23:49.925000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (3 times, latest 2022-11-08)"}, "request_id": "req_11Zb4euHpa9d6cAzDBAytI", "user_id": null}, "emitted_at": 1670413473564} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:23:04.323000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "body_text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:23:04.323000+00:00", "date_updated": "2022-11-08T20:44:30.910000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:23:05 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792458488.29477.5187137325155036854@smtpgw.close.com>", "<166792458488.29477.3151986449249141034@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "35.231.92.0", "opened_at": "2022-11-08T20:44:30.910000+00:00", "opened_by": "Nick Persico ", "user_agent": "Superhuman"}], "opens_summary": "Opened by Nick Persico (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T20:44:30.912000", "date_updated": "2022-11-08T20:44:30.912000", "id": "ev_0VCtpzcZriZCX7hW1Y815B", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz/hLR39c4vKU.png"}, "object_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:23:06.464000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_1pmMosuVvixO6W6sDTLt46", "user_id": null}, "emitted_at": 1670413473566} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-08T19:23:49.926000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.169", "opened_at": "2022-11-08T19:23:49.925000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (3 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T19:23:49.927000", "date_updated": "2022-11-08T19:23:49.927000", "id": "ev_3sJuqOBTaTfoHbHwfUEUXZ", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y/dZva3CP7tI.png"}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:36:16.238000+00:00", "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (2 times, latest 2022-11-08)"}, "request_id": "req_1I431N6tUhki1Yxc0yn538", "user_id": null}, "emitted_at": 1670413473568} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-08T19:21:22.530000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}, {"ip_address": "66.249.84.173", "opened_at": "2022-11-08T19:21:22.529000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (3 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T19:21:22.531000", "date_updated": "2022-11-08T19:21:22.531000", "id": "ev_6AtWeZxoBCVNEssXiY54dP", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW/dZva3CP7tI.png"}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:53:43.225000+00:00", "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (2 times, latest 2022-11-08)"}, "request_id": "req_6DJP4JKJpNWB9AcWj2bazg", "user_id": null}, "emitted_at": 1670413473570} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-08T17:53:43.225000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:53:39.970000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.249.83.109", "opened_at": "2022-11-08T17:53:43.225000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (2 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:53:39.972000", "date_updated": "2022-11-08T17:53:43.227000", "id": "ev_1rRKbmtHjkw5zQZtTZjzN3", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW/dZva3CP7tI.png"}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:53:36.810000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_09kL38r2FfGXFAzLME0U8S", "user_id": null}, "emitted_at": 1670413473572} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T17:53:35.311139", "date_created": "2022-11-08T17:53:35.311139", "date_sent": "2022-11-08T17:53:35.311139", "date_updated": "2022-11-08T17:53:36.989554", "email_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "id": "subhis_3tp9z3dlpnZovLsCU4F8g8", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "completed", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:53:36.989000", "date_updated": "2022-11-08T17:53:36.989000", "id": "ev_763qjsVQ9s3PHtY3OJ6Z9i", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_3tp9z3dlpnZovLsCU4F8g8", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T17:53:35.727084", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413473574} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:53:35.312000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.312000+00:00", "date_updated": "2022-11-08T17:53:36.856000+00:00", "email_ids": ["acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:53:36.860000", "date_updated": "2022-11-08T17:53:36.860000", "id": "ev_5RgGUY3VrUffOdkofiZJSE", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:53:35.599000+00:00", "date_created": "2022-11-08T17:53:35.599000+00:00", "date_updated": "2022-11-08T17:53:35.607000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474220} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-08T17:53:36.810000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:53:36.813000", "date_updated": "2022-11-08T17:53:36.813000", "id": "ev_7KLLc8c6IfcH2FBjh3hkMz", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474222} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.311000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:53:35.311000+00:00", "date_updated": "2022-11-08T17:53:36.810000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:53:36 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166793001574.2977.16151555672380558322@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166793001574.2977.16151555672380558322@smtpgw.close.com>", "<166793001574.2977.11109080189748637010@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:53:36.813000", "date_updated": "2022-11-08T17:53:36.813000", "id": "ev_5M4ASxt14Ev8tQDsrirhYX", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:53:35.598000+00:00", "date_sent": null, "date_updated": "2022-11-08T17:53:35.598000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474224} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T17:53:35.311139", "date_sent": null, "date_updated": "2022-11-08T17:53:35.727084", "email_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "id": "subhis_3tp9z3dlpnZovLsCU4F8g8", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "status": "pending", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:53:35.727000", "date_updated": "2022-11-08T17:53:35.727000", "id": "ev_0CHReiDWhQ2ZFxyLdVUnWs", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_3tp9z3dlpnZovLsCU4F8g8", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474226} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:43.734431", "date_updated": "2022-11-08T17:53:35.714692", "id": "sub_5kEnI9yY80Y9mjetrZqrxn", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T17:53:35.311139", "updated_by_id": null}, "date_created": "2022-11-08T17:53:35.714000", "date_updated": "2022-11-08T17:53:35.714000", "id": "ev_3RR3TVLCE2ld8IQRnMfIhq", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:44.130130", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474228} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:53:35.599000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.599000+00:00", "date_updated": "2022-11-08T17:53:35.607000+00:00", "email_ids": ["acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:53:35.611000", "date_updated": "2022-11-08T17:53:35.611000", "id": "ev_44EMue0doxS3DWYc59j2MK", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:41:58.197000+00:00", "date_created": "2022-11-08T17:41:58.197000+00:00", "date_updated": "2022-11-08T17:42:03.175000+00:00", "n_emails": 3}, "request_id": null, "user_id": null}, "emitted_at": 1670413474230} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:53:35.598000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what w", "body_text": "Hi Steli, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:53:35.598000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T17:53:35.598000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Steli Efti "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:53:35.600000", "date_updated": "2022-11-08T17:53:35.600000", "id": "ev_1cxF5d8xUVFJY9nkJDVpUB", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_JtQ6sb96zkzIUutLPVgnTRjnJOnXERet0nXplZfkuaW", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474232} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:41:58.196000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "body_text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.589000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:41:58.196000+00:00", "date_updated": "2022-11-08T17:42:03.103000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:41:59 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792931876.62373.17646468751668935681@smtpgw.close.com>", "<166792931876.62373.6144271479235161876@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T17:42:01.966000+00:00", "opened_by": "Support ", "user_agent": "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"}, {"ip_address": "66.249.92.24", "opened_at": "2022-11-08T17:42:03.103000+00:00", "opened_by": "Support ", "user_agent": "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"}], "opens_summary": "Opened by Support (2 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:42:01.968000", "date_updated": "2022-11-08T17:42:03.105000", "id": "ev_0j3sRuZqfabhlFzkoI5U9q", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m/aK8bDZwXng.png"}, "object_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:41:59.951000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_3XiKPvW7BKDm7ILUEObUn0", "user_id": null}, "emitted_at": 1670413474234} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T17:41:58.196054", "date_created": "2022-11-08T17:41:58.196054", "date_sent": "2022-11-08T17:41:58.196054", "date_updated": "2022-11-08T17:42:00.115342", "email_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "id": "subhis_2qWOA5PrOM0Tv1BOd42GVN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "completed", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:42:00.115000", "date_updated": "2022-11-08T17:42:00.115000", "id": "ev_4uBXKFU01npSzxwmdUw8gq", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2qWOA5PrOM0Tv1BOd42GVN", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T17:41:58.741551", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474236} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:41:58.197000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.197000+00:00", "date_updated": "2022-11-08T17:41:59.992000+00:00", "email_ids": ["acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:41:59.995000", "date_updated": "2022-11-08T17:41:59.995000", "id": "ev_4qqU3lNfpK14Zp5aAxTuQp", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:41:58.590000+00:00", "date_created": "2022-11-08T17:41:58.590000+00:00", "date_updated": "2022-11-08T17:41:58.599000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474238} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:41:58.196000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "body_text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.589000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:41:58.196000+00:00", "date_updated": "2022-11-08T17:41:59.951000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:41:59 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792931876.62373.17646468751668935681@smtpgw.close.com>", "<166792931876.62373.6144271479235161876@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:41:59.954000", "date_updated": "2022-11-08T17:41:59.954000", "id": "ev_7X3JuXL5FKhUrCFAczIhtG", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474240} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:41:58.196000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "body_text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.589000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:41:58.196000+00:00", "date_updated": "2022-11-08T17:41:59.951000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:41:59 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792931876.62373.17646468751668935681@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792931876.62373.17646468751668935681@smtpgw.close.com>", "<166792931876.62373.6144271479235161876@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:41:59.954000", "date_updated": "2022-11-08T17:41:59.954000", "id": "ev_5Oby5uNZMChaEAZyTqELI5", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:41:58.589000+00:00", "date_sent": null, "date_updated": "2022-11-08T17:41:58.589000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "support@close.com", "name": "Support"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474242} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T17:41:58.196054", "date_sent": null, "date_updated": "2022-11-08T17:41:58.741551", "email_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "id": "subhis_2qWOA5PrOM0Tv1BOd42GVN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "status": "pending", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:41:58.741000", "date_updated": "2022-11-08T17:41:58.741000", "id": "ev_3257txu05EocWtpgS0teGe", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_2qWOA5PrOM0Tv1BOd42GVN", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474244} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:53.882456", "date_updated": "2022-11-08T17:41:58.726863", "id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T17:41:58.196054", "updated_by_id": null}, "date_created": "2022-11-08T17:41:58.726000", "date_updated": "2022-11-08T17:41:58.726000", "id": "ev_6KhBMwHXL36FL6HYldma1F", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:54.415374", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474245} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:41:58.590000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.590000+00:00", "date_updated": "2022-11-08T17:41:58.599000+00:00", "email_ids": ["acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:41:58.602000", "date_updated": "2022-11-08T17:41:58.602000", "id": "ev_4DunYiPnmG3Ye7sdgHvWom", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:15:11.280000+00:00", "date_created": "2022-11-08T17:15:11.280000+00:00", "date_updated": "2022-11-08T17:15:14.784000+00:00", "n_emails": 2}, "request_id": null, "user_id": null}, "emitted_at": 1670413474247} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:41:58.589000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what", "body_text": "Hi Support, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:41:58.589000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T17:41:58.589000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Support "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:41:58.592000", "date_updated": "2022-11-08T17:41:58.592000", "id": "ev_4aDnWmkF2Kdwv8fZZAthuO", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bY6szlDdTDFzI09pvrWJ9SPvZE9G7N96rXCKfZL8a4m", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474249} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:15:11.279000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "body_text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.656000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:15:11.279000+00:00", "date_updated": "2022-11-08T17:15:14.724000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:15:12 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792771182.46793.15708798519258202100@smtpgw.close.com>", "<166792771182.46793.6902395509032896353@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.10", "opened_at": "2022-11-08T17:15:14.724000+00:00", "opened_by": "Nick Persico ", "user_agent": "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"}], "opens_summary": "Opened by Nick Persico (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:15:14.726000", "date_updated": "2022-11-08T17:15:14.726000", "id": "ev_0OTu0FLjH6X8T0AWe6jxxO", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3/hLR39c4vKU.png"}, "object_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:15:12.868000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_2OFNIG4KL4iLWMg4W6qeg8", "user_id": null}, "emitted_at": 1670413474251} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T17:15:11.279217", "date_created": "2022-11-08T17:15:11.279217", "date_sent": "2022-11-08T17:15:11.279217", "date_updated": "2022-11-08T17:15:13.041461", "email_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "id": "subhis_1ra3WRU358DpsX8fgL6Aru", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "completed", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:15:13.041000", "date_updated": "2022-11-08T17:15:13.041000", "id": "ev_6Rg3zlT97SPlByFMZQt1WK", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_1ra3WRU358DpsX8fgL6Aru", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T17:15:11.805746", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474253} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:15:11.280000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.280000+00:00", "date_updated": "2022-11-08T17:15:12.912000+00:00", "email_ids": ["acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:15:12.914000", "date_updated": "2022-11-08T17:15:12.914000", "id": "ev_5XcjeqJhtCg9x5WRw0hfYi", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:15:11.657000+00:00", "date_created": "2022-11-08T17:15:11.657000+00:00", "date_updated": "2022-11-08T17:15:11.665000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474255} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:15:11.279000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "body_text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.656000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:15:11.279000+00:00", "date_updated": "2022-11-08T17:15:12.868000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:15:12 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792771182.46793.15708798519258202100@smtpgw.close.com>", "<166792771182.46793.6902395509032896353@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:15:12.871000", "date_updated": "2022-11-08T17:15:12.871000", "id": "ev_6N93p1iZkrD5VK0FR3GOkr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474258} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:15:11.279000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "body_text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.656000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:15:11.279000+00:00", "date_updated": "2022-11-08T17:15:12.868000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:15:12 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792771182.46793.15708798519258202100@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792771182.46793.15708798519258202100@smtpgw.close.com>", "<166792771182.46793.6902395509032896353@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:15:12.871000", "date_updated": "2022-11-08T17:15:12.871000", "id": "ev_5mg0MvlqIhfNOEOkymG7Rs", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:15:11.656000+00:00", "date_sent": null, "date_updated": "2022-11-08T17:15:11.656000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474261} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T17:15:11.279217", "date_sent": null, "date_updated": "2022-11-08T17:15:11.805746", "email_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "id": "subhis_1ra3WRU358DpsX8fgL6Aru", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "status": "pending", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:15:11.805000", "date_updated": "2022-11-08T17:15:11.805000", "id": "ev_1qLvS1YaxHA6qZNQWRIB4K", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_1ra3WRU358DpsX8fgL6Aru", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474263} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:47.911844", "date_updated": "2022-11-08T17:15:11.794926", "id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T17:15:11.279217", "updated_by_id": null}, "date_created": "2022-11-08T17:15:11.794000", "date_updated": "2022-11-08T17:15:11.794000", "id": "ev_21duaLMISHRfzDLCEJs8Jg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:48.567445", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474265} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:15:11.657000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.657000+00:00", "date_updated": "2022-11-08T17:15:11.665000+00:00", "email_ids": ["acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:15:11.668000", "date_updated": "2022-11-08T17:15:11.668000", "id": "ev_0DXX54vCFZGg7TSZWdyWWS", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:12:07.626000+00:00", "date_created": "2022-11-08T17:12:07.626000+00:00", "date_updated": "2022-11-08T17:12:12.757000+00:00", "n_emails": 1}, "request_id": null, "user_id": null}, "emitted_at": 1670413474267} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:15:11.656000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we", "body_text": "Hi Nick, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:15:11.656000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T17:15:11.656000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Nick Persico "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:15:11.659000", "date_updated": "2022-11-08T17:15:11.659000", "id": "ev_3LYulYARmPYmPDqKG8A5B9", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_Jo5nNA02HebzixdJdqbsqtb2v5JAe5l682DwN84Lsq3", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474269} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:12:07.625000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "body_text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.975000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:12:07.625000+00:00", "date_updated": "2022-11-08T17:12:12.687000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:12:08 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792752819.46698.4592611849180210253@smtpgw.close.com>", "<166792752819.46698.4097549043104142028@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.10", "opened_at": "2022-11-08T17:12:11.815000+00:00", "opened_by": "Customer Success Team ", "user_agent": "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"}, {"ip_address": "66.249.92.10", "opened_at": "2022-11-08T17:12:12.687000+00:00", "opened_by": "Customer Success Team ", "user_agent": "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"}], "opens_summary": "Opened by Customer Success Team (2 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:12:11.817000", "date_updated": "2022-11-08T17:12:12.689000", "id": "ev_7HYy5uRj3TXiKWmRKIaXzI", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg/J9TTCACNTB.png"}, "object_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T17:12:09.686000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_70baVrXmXQG4WW9pa9TIvV", "user_id": null}, "emitted_at": 1670413474271} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T17:12:07.625391", "date_created": "2022-11-08T17:12:07.625391", "date_sent": "2022-11-08T17:12:07.625391", "date_updated": "2022-11-08T17:12:09.875391", "email_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "id": "subhis_7mdDTENOokFN5SO1ETDlXg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "completed", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:12:09.875000", "date_updated": "2022-11-08T17:12:09.875000", "id": "ev_0d3cOwDjl3Vo0Y7tt6LWm3", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_7mdDTENOokFN5SO1ETDlXg", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T17:12:08.165396", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474273} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "updated_by", "updated_by_name"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:12:07.626000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.626000+00:00", "date_updated": "2022-11-08T17:12:09.741000+00:00", "email_ids": ["acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:12:09.743000", "date_updated": "2022-11-08T17:12:09.743000", "id": "ev_0y8Ir7d0tmBinSbHiwjHnW", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:12:07.976000+00:00", "date_created": "2022-11-08T17:12:07.976000+00:00", "date_updated": "2022-11-08T17:12:07.982000+00:00", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474275} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T17:12:07.625000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "body_text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.975000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:12:07.625000+00:00", "date_updated": "2022-11-08T17:12:09.686000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:12:08 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792752819.46698.4592611849180210253@smtpgw.close.com>", "<166792752819.46698.4097549043104142028@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:12:09.689000", "date_updated": "2022-11-08T17:12:09.689000", "id": "ev_2TrQ96VLmBwJXI3xHsV8Q5", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T17:12:07.975000+00:00", "date_sent": null, "date_updated": "2022-11-08T17:12:07.988000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474278} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:12:07.625000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "body_text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.975000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T17:12:07.625000+00:00", "date_updated": "2022-11-08T17:12:09.686000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 17:12:08 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792752819.46698.4592611849180210253@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792752819.46698.4592611849180210253@smtpgw.close.com>", "<166792752819.46698.4097549043104142028@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "sent", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:12:09.689000", "date_updated": "2022-11-08T17:12:09.689000", "id": "ev_1ILjrMMmwkTKAyQvlF57BT", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474280} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T17:12:07.625391", "date_sent": null, "date_updated": "2022-11-08T17:12:08.165396", "email_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "id": "subhis_7mdDTENOokFN5SO1ETDlXg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_06TCoNKHiRvgz5eajOG5iM", "status": "pending", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T17:12:08.165000", "date_updated": "2022-11-08T17:12:08.165000", "id": "ev_1hvS0FWPXU0n5OVJt5FDbI", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_7mdDTENOokFN5SO1ETDlXg", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474282} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:52.688271", "date_updated": "2022-11-08T17:12:08.155030", "id": "sub_06TCoNKHiRvgz5eajOG5iM", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T17:12:07.625391", "updated_by_id": null}, "date_created": "2022-11-08T17:12:08.155000", "date_updated": "2022-11-08T17:12:08.155000", "id": "ev_3UJET9KEbSKHpau2xrVYZo", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_06TCoNKHiRvgz5eajOG5iM", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:53.286096", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474284} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T17:12:07.975000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

I'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you wha", "body_text": "Hi Customer, \n \nI'm Jean with Airbyte. We help companies in the Software space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Close\n(Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.975000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T17:12:07.988000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Close (Example\u00a0Lead) + Airbyte", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Close (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "to": ["Customer Success Team "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T17:12:07.991000", "date_updated": "2022-11-08T17:12:07.991000", "id": "ev_5wDHbDdnVWH8Td0nAf2kOe", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474286} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T17:12:07.976000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T17:12:07.976000+00:00", "date_updated": "2022-11-08T17:12:07.982000+00:00", "email_ids": ["acti_FmGmN7lMl7P6eQiHZevdkYF9tOH1aTduDFkmEylHocg"], "id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "latest_normalized_subject": "Close (Example Lead) + Airbyte", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T17:12:07.986000", "date_updated": "2022-11-08T17:12:07.986000", "id": "ev_7n0qBkzOZIWHLtuTpiuGjL", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_J1LyrEyYijj0iVPLaf5NfGLbyoRvRxdSWWAuMmHtD29", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474289} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:48:47.166000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "body_text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.552000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:48:47.166000+00:00", "date_updated": "2022-11-08T16:50:41.545000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:48:48 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792612773.32060.15386565426548563880@smtpgw.close.com>", "<166792612773.32060.13475180684302654892@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:50:41.545000+00:00", "opened_by": "Support ", "user_agent": "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"}], "opens_summary": "Opened by Support (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:50:41.548000", "date_updated": "2022-11-08T16:50:41.548000", "id": "ev_6giGv4g4ciOT3eiK7Revrd", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc/aK8bDZwXng.png"}, "object_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:48:49.089000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_2N89O0COU6NHnJhJlqyuT3", "user_id": null}, "emitted_at": 1670413474291} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T16:48:47.166705", "date_created": "2022-11-08T16:48:47.166705", "date_sent": "2022-11-08T16:48:47.166705", "date_updated": "2022-11-08T16:48:49.272489", "email_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "id": "subhis_0VwXVAVC42pDcl8ibQ3vk2", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "status": "completed", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:48:49.272000", "date_updated": "2022-11-08T16:48:49.272000", "id": "ev_6ya54btVk3bxynsVad0Ip9", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0VwXVAVC42pDcl8ibQ3vk2", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T16:48:47.712055", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474293} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:48:47.167000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.167000+00:00", "date_updated": "2022-11-08T16:48:49.132000+00:00", "email_ids": ["acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:48:49.136000", "date_updated": "2022-11-08T16:48:49.136000", "id": "ev_18WcY5ZzDnAXToXFbX0I7M", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:48:47.553000+00:00", "date_created": "2022-11-08T16:48:47.553000+00:00", "date_updated": "2022-11-08T16:48:47.561000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474295} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:48:47.166000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "body_text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.552000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:48:47.166000+00:00", "date_updated": "2022-11-08T16:48:49.089000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:48:48 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792612773.32060.15386565426548563880@smtpgw.close.com>", "<166792612773.32060.13475180684302654892@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:48:49.092000", "date_updated": "2022-11-08T16:48:49.092000", "id": "ev_6zzz5yPzSKyTBPTGUx2Nuf", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:48:47.552000+00:00", "date_sent": null, "date_updated": "2022-11-08T16:48:47.552000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "support@close.com", "name": "Support"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474297} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:48:47.166000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "body_text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.552000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:48:47.166000+00:00", "date_updated": "2022-11-08T16:48:49.089000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:48:48 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792612773.32060.15386565426548563880@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792612773.32060.15386565426548563880@smtpgw.close.com>", "<166792612773.32060.13475180684302654892@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Support "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:48:49.092000", "date_updated": "2022-11-08T16:48:49.092000", "id": "ev_4VVLRFxZlq4vMJsEb6ezm6", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474299} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T16:48:47.166705", "date_sent": null, "date_updated": "2022-11-08T16:48:47.712055", "email_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "id": "subhis_0VwXVAVC42pDcl8ibQ3vk2", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "status": "pending", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:48:47.712000", "date_updated": "2022-11-08T16:48:47.712000", "id": "ev_3j0enF2bYiFmRaQwsG5Cxq", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0VwXVAVC42pDcl8ibQ3vk2", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474302} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:12.582772", "date_updated": "2022-11-08T16:48:47.699257", "id": "sub_7Zv78mWCJuul1Ipd4EDE32", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T16:48:47.166705", "updated_by_id": null}, "date_created": "2022-11-08T16:48:47.699000", "date_updated": "2022-11-08T16:48:47.699000", "id": "ev_1Dg85plRFrZdX0n0dZBTOJ", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:12.925063", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474304} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:48:47.553000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.553000+00:00", "date_updated": "2022-11-08T16:48:47.561000+00:00", "email_ids": ["acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:48:47.564000", "date_updated": "2022-11-08T16:48:47.564000", "id": "ev_16uPFmuzpYhe4LLEzIJ4K8", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:36:07.227000+00:00", "date_created": "2022-11-08T16:36:07.227000+00:00", "date_updated": "2022-11-08T16:36:16.315000+00:00", "n_emails": 3}, "request_id": null, "user_id": null}, "emitted_at": 1670413474306} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:48:47.552000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Support,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- T", "body_text": "Hi Support, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:48:47.552000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:48:47.552000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "support@close.com", "name": "Support"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Support "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:48:47.555000", "date_updated": "2022-11-08T16:48:47.555000", "id": "ev_5lUkf0VlGJPJI1oPeJMqar", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_u6v6F3otM95hwbDFmIwzakF24SbSkZsliERI3Y7e9Mc", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474308} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-08T16:36:16.238000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T16:36:14.654000+00:00", "opened_by": "Steli Efti ", "user_agent": "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"}, {"ip_address": "66.102.8.136", "opened_at": "2022-11-08T16:36:16.238000+00:00", "opened_by": "Steli Efti ", "user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}], "opens_summary": "Opened by Steli Efti (2 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:36:14.657000", "date_updated": "2022-11-08T16:36:16.240000", "id": "ev_6eeF51E9aMLPPADqtlgGYj", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y/dZva3CP7tI.png"}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:36:09.202000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_6gWYeCXmXkFsXy1ig1YdVZ", "user_id": null}, "emitted_at": 1670413474310} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T16:36:07.226556", "date_created": "2022-11-08T16:36:07.226556", "date_sent": "2022-11-08T16:36:07.226556", "date_updated": "2022-11-08T16:36:09.406694", "email_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "id": "subhis_0j1l5Rhq7YgbuHGj692BTm", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "completed", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:36:09.406000", "date_updated": "2022-11-08T16:36:09.406000", "id": "ev_5CEpH81ag91IuuC7hk3W5q", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0j1l5Rhq7YgbuHGj692BTm", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T16:36:07.781746", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474313} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:36:07.227000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.227000+00:00", "date_updated": "2022-11-08T16:36:09.264000+00:00", "email_ids": ["acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:36:09.267000", "date_updated": "2022-11-08T16:36:09.267000", "id": "ev_1zKZ8CnKAo7DaoPwMlzV9Y", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:36:07.647000+00:00", "date_created": "2022-11-08T16:36:07.647000+00:00", "date_updated": "2022-11-08T16:36:07.657000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474315} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-08T16:36:09.202000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:36:09.205000", "date_updated": "2022-11-08T16:36:09.205000", "id": "ev_6PAPeAKW1NQyloGKjU2LRW", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:36:07.646000+00:00", "date_sent": null, "date_updated": "2022-11-08T16:36:07.646000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474317} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.226000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:36:07.226000+00:00", "date_updated": "2022-11-08T16:36:09.202000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:36:08 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792536780.39994.6476676108875520271@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792536780.39994.6476676108875520271@smtpgw.close.com>", "<166792536780.39994.10624245342771321646@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:36:09.205000", "date_updated": "2022-11-08T16:36:09.205000", "id": "ev_69QJ3ImrWPEE06yYd7y945", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413474319} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T16:36:07.226556", "date_sent": null, "date_updated": "2022-11-08T16:36:07.781746", "email_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "id": "subhis_0j1l5Rhq7YgbuHGj692BTm", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "status": "pending", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:36:07.781000", "date_updated": "2022-11-08T16:36:07.781000", "id": "ev_6ltRFvfr7jBbpAVItt7BRC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0j1l5Rhq7YgbuHGj692BTm", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474321} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:14.589854", "date_updated": "2022-11-08T16:36:07.768798", "id": "sub_3AChiei0PuAIJ1X0OWnWNR", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T16:36:07.226556", "updated_by_id": null}, "date_created": "2022-11-08T16:36:07.768000", "date_updated": "2022-11-08T16:36:07.768000", "id": "ev_4fxYjvtIgvkhoGMQ2lVjXO", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:15.178861", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474323} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:36:07.647000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.647000+00:00", "date_updated": "2022-11-08T16:36:07.657000+00:00", "email_ids": ["acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:36:07.660000", "date_updated": "2022-11-08T16:36:07.660000", "id": "ev_2yFf74YX6xeprge5z8MOVk", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:24:31.195000+00:00", "date_created": "2022-11-08T16:24:31.195000+00:00", "date_updated": "2022-11-08T16:24:37.497000+00:00", "n_emails": 2}, "request_id": null, "user_id": null}, "emitted_at": 1670413474990} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:36:07.646000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Steli,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thu", "body_text": "Hi Steli, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:36:07.646000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:36:07.646000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "sales@close.com", "name": "Steli Efti"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Steli Efti "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:36:07.650000", "date_updated": "2022-11-08T16:36:07.650000", "id": "ev_16StE4izK0uwp6y8j4wj5g", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_513pRrBSucsLbbv9XPlWIa0II9deTHWHZmPlYNOni9y", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413474992} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails", "is_complete", "is_new"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "cleared_followups": [], "contact_id": null, "created_by": null, "created_by_name": null, "date": "2022-11-08T15:44:23.001000+00:00", "date_created": "2022-11-08T15:44:23.001000+00:00", "date_updated": "2022-11-08T16:28:55.890000+00:00", "emails": [], "id": "noti_U722qGVxvXSd1AP7Cs2ygzun3Vm0tmfKOv1dSt2Itw0", "is_complete": true, "is_new": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Delivery Status Notification (Failure)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-08T16:28:55.892000", "date_updated": "2022-11-08T16:28:55.892000", "id": "ev_0MXTGaHKtmUeC2ooB3UMDg", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "noti_U722qGVxvXSd1AP7Cs2ygzun3Vm0tmfKOv1dSt2Itw0", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-08T12:56:55+00:00", "date_created": "2022-11-08T12:56:55+00:00", "date_updated": "2022-11-08T13:00:57.869000+00:00", "emails": ["acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8"], "is_complete": false, "is_new": true}, "request_id": null, "user_id": null}, "emitted_at": 1670413474994} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails", "is_complete", "is_new"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "cleared_followups": [], "contact_id": null, "created_by": null, "created_by_name": null, "date": "2022-11-08T16:09:09.001000+00:00", "date_created": "2022-11-08T16:09:09.001000+00:00", "date_updated": "2022-11-08T16:28:55.751000+00:00", "emails": [], "id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "is_complete": true, "is_new": false, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "lead_name": "Bluth Company (Example\u00a0Lead)", "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Delivery Status Notification (Failure)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-08T16:28:55.753000", "date_updated": "2022-11-08T16:28:55.753000", "id": "ev_6cmezMZ1MaBDQ8HmOd81iu", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-08T15:21:52+00:00", "date_created": "2022-11-08T15:21:52+00:00", "date_updated": "2022-11-08T15:22:03.794000+00:00", "emails": ["acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs"], "is_complete": false, "is_new": true}, "request_id": null, "user_id": null}, "emitted_at": 1670413474996} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "thedarkknight@close.com", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:15.902085", "date_updated": "2022-11-08T16:28:55.684374", "id": "sub_7mCfXm4Y3eZajJp0rkjwFU", "initial_email_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": null, "updated_by_id": null}, "date_created": "2022-11-08T16:28:55.684000", "date_updated": "2022-11-08T16:28:55.684000", "id": "ev_3dqP8VfVQdHUS8PSyBO5xD", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "sub_7mCfXm4Y3eZajJp0rkjwFU", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:16.236687", "paused_by_activity_id": null, "status": "active", "status_reason": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474998} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "thedarkknight@close.com", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:46.583319", "date_updated": "2022-11-08T16:28:55.680946", "id": "sub_5MuKAZDXfR1pHQL0xGBUp3", "initial_email_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": null, "updated_by_id": null}, "date_created": "2022-11-08T16:28:55.680000", "date_updated": "2022-11-08T16:28:55.680000", "id": "ev_03TaXtLXsHumTdgl8WRF2C", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "sub_5MuKAZDXfR1pHQL0xGBUp3", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:47.195807", "paused_by_activity_id": null, "status": "active", "status_reason": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413474999} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "tobiasfunke@close.com", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:49.320380", "date_updated": "2022-11-08T16:28:55.576648", "id": "sub_55pcJcrKsTL3fUX3ZJ3rw1", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": null, "updated_by_id": null}, "date_created": "2022-11-08T16:28:55.576000", "date_updated": "2022-11-08T16:28:55.576000", "id": "ev_3n01bDsKWUDxh2duWFMkfz", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_55pcJcrKsTL3fUX3ZJ3rw1", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:49.637227", "paused_by_activity_id": null, "status": "active", "status_reason": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475001} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason"], "data": {"calls_assigned_to": [], "contact_email": "tobiasfunke@close.com", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:11.239696", "date_updated": "2022-11-08T16:28:55.571574", "id": "sub_1rgSspOohLocAaucazbFbB", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": "2022-11-08T16:09:03.809833", "updated_by_id": null}, "date_created": "2022-11-08T16:28:55.571000", "date_updated": "2022-11-08T16:28:55.571000", "id": "ev_7UI0dlEhpbMCTJyvwSscZG", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_1rgSspOohLocAaucazbFbB", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:09:04.295282", "paused_by_activity_id": null, "status": "active", "status_reason": null}, "request_id": null, "user_id": null}, "emitted_at": 1670413475003} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T16:28:55.426000", "date_updated": "2022-11-08T16:28:55.426000", "id": "ev_4gddQATuvMiYtDor9BPhFM", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:44:17.804000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:17.804000+00:00", "date_updated": "2022-11-08T15:44:19.328000+00:00", "email_ids": ["acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs"], "id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "latest_normalized_subject": "(no subject)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "request_id": null, "user_id": null}, "emitted_at": 1670413475005} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:44:23.001000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:23.001000+00:00", "date_updated": "2022-11-08T16:28:55.357000+00:00", "email_ids": ["acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe"], "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:28:55.360000", "date_updated": "2022-11-08T16:28:55.360000", "id": "ev_1VLUPK0wRU07MW6UboSsGU", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:56:55.001000+00:00", "date_created": "2022-11-08T12:56:55.001000+00:00", "date_updated": "2022-11-08T15:43:38.504000+00:00", "latest_normalized_subject": "Delivery Status Notification (Failure)", "n_emails": 2, "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413475007} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:44:23+00:00", "attachments": [{"content_id": "", "content_type": "image/png", "filename": "icon.png", "size": 1450}], "bcc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: (no subject)
\nDate: Tue, 08 Nov 2022 15:44:18 +0000
\nTo: thedarkknight@close.com
\n
\nTest\"\"

", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.co", "body_text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/x_0dCzpzoxUqDBA5f4CcrT?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: (no subject)\nDate: Tue, 08 Nov 2022 15:44:18 +0000\nTo: thedarkknight@close.com\n\nTest", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:44:23+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:28:55.347000+00:00", "direction": "incoming", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 07:44:23 -0800 (PST)", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "in_reply_to": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "is_autoreply": true, "message_id": "<636a7957.050a0220.76c16.8d69.GMR@mx.google.com>", "reply_to": [], "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "subject": "Delivery Status Notification (Failure)", "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<636a7957.050a0220.76c16.8d69.GMR@mx.google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": ["<166792225784.2629.12825104744076060180@smtpgw.close.com>", "<166792225784.2629.13990873364570888607@smtpgw.close.com>"], "send_as_id": null, "send_attempts": [], "sender": "Mail Delivery Subsystem ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Delivery Status Notification (Failure)", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["iryna.grankova@globallogic.com"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:28:55.349000", "date_updated": "2022-11-08T16:28:55.349000", "id": "ev_6UZU2EL6GMk8Bpxfld98ir", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_4FqtK5fUFc4M3CvT2mCEGHnXww1fWEJkRckW9WrIdKg", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475009} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "thread_id"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:44:17.803000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:44:17.803000+00:00", "date_updated": "2022-11-08T16:28:55.242000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166792225784.2629.13990873364570888607@smtpgw.close.com>", "<166792225784.2629.12825104744076060180@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "(no subject)", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:28:55.247000", "date_updated": "2022-11-08T16:28:55.247000", "id": "ev_3cDgUz9IAiTRmA4H5N6d94", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:44:19.299000+00:00", "thread_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475011} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "object_id"], "data": {"_type": "email_followup", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "Test", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-15", "date_created": "2022-11-08T15:44:05.221000+00:00", "date_updated": "2022-11-08T16:28:54.794000+00:00", "email_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "id": "noti_3I4QaKqYel0nzGyKT8mpDKy4q2KKu4IuIZZ3Gb7gs4x", "is_complete": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "(no subject)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": null}, "date_created": "2022-11-08T16:28:54.817000", "date_updated": "2022-11-08T16:28:54.817000", "id": "ev_4ouBbOZv2hNF7fH2eIos9e", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "noti_3I4QaKqYel0nzGyKT8mpDKy4q2KKu4IuIZZ3Gb7gs4x", "object_type": "task.email_followup", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:44:05.221000+00:00", "object_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475013} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:09:09.001000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T16:09:09.001000+00:00", "date_updated": "2022-11-08T16:28:54.150000+00:00", "email_ids": ["acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 6, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:28:54.153000", "date_updated": "2022-11-08T16:28:54.153000", "id": "ev_6J3LFtbmhd7sXRkKN3xzGK", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:09:03.810000+00:00", "date_created": "2022-11-08T16:09:03.810000+00:00", "date_updated": "2022-11-08T16:09:05.825000+00:00", "latest_normalized_subject": "Airbyte Follow-up", "n_emails": 5, "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413475015} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:09:09+00:00", "attachments": [{"content_id": "", "content_type": "image/png", "filename": "icon.png", "size": 1450}], "bcc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: \"Jean Lafleur\" <iryna.grankova@globallogic.com>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 16:09:04 +0000
\nTo: Tobias F\u00fcnke <tobiasfunke@close.com>
\n
\nHi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/", "body_text": "\n** Address not found **\n\nYour message wasn't delivered to tobiasfunke@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://protect-us.mimecast.com/s/vIO8C0R7BXCBvxZ9fwcWRl?domain=support.google.com\nFrom: \"Jean Lafleur\" \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 16:09:04 +0000\nTo: Tobias F\u00fcnke \n\nHi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:09:09+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:28:54.140000+00:00", "direction": "incoming", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 08:09:09 -0800 (PST)", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "in_reply_to": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "is_autoreply": true, "message_id": "<636a7f25.c80a0220.659b6.8bba.GMR@mx.google.com>", "reply_to": [], "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "subject": "Delivery Status Notification (Failure)", "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<636a7f25.c80a0220.659b6.8bba.GMR@mx.google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": ["<166792374433.22448.17907165931371313011@smtpgw.close.com>", "<166792374433.22448.16558415745556798661@smtpgw.close.com>"], "send_as_id": null, "send_attempts": [], "sender": "Mail Delivery Subsystem ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Delivery Status Notification (Failure)", "template_id": null, "template_name": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["iryna.grankova@globallogic.com"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:28:54.142000", "date_updated": "2022-11-08T16:28:54.142000", "id": "ev_73NAlUi625ajEQ41FPwDvq", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_kInKkIusbEQTcNwu982oG2ncXoGXOckJbYy1d6RgHGx", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475017} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:24:31.194000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "body_text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.650000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:24:31.194000+00:00", "date_updated": "2022-11-08T16:24:37.393000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:24:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792467183.28936.13663569799747553498@smtpgw.close.com>", "<166792467183.28936.4497117513938895080@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.22", "opened_at": "2022-11-08T16:24:37.393000+00:00", "opened_by": "Customer Success Team ", "user_agent": "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"}], "opens_summary": "Opened by Customer Success Team (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:24:37.395000", "date_updated": "2022-11-08T16:24:37.395000", "id": "ev_1QRoIMQRKNZ3VuK9thVezh", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "GET", "request_path": "/t/bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ/J9TTCACNTB.png"}, "object_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T16:24:33.205000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_2Ovkbtk55GowkLCbAtRzXi", "user_id": null}, "emitted_at": 1670413475019} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T16:24:31.194602", "date_created": "2022-11-08T16:24:31.194602", "date_sent": "2022-11-08T16:24:31.194602", "date_updated": "2022-11-08T16:24:33.401673", "email_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "id": "subhis_5sPb9CWgp0vNWMM2x8VDYt", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "status": "completed", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:24:33.401000", "date_updated": "2022-11-08T16:24:33.401000", "id": "ev_1WTfdJFTi0jMX9oFSxQ8js", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_5sPb9CWgp0vNWMM2x8VDYt", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T16:24:31.810164", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475021} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:24:31.195000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.195000+00:00", "date_updated": "2022-11-08T16:24:33.253000+00:00", "email_ids": ["acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:24:33.256000", "date_updated": "2022-11-08T16:24:33.256000", "id": "ev_6x2yRaZ2N3bz7O9VWg1OfD", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:24:31.651000+00:00", "date_created": "2022-11-08T16:24:31.651000+00:00", "date_updated": "2022-11-08T16:24:31.662000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475023} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:24:31.194000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "body_text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.650000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:24:31.194000+00:00", "date_updated": "2022-11-08T16:24:33.205000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:24:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792467183.28936.13663569799747553498@smtpgw.close.com>", "<166792467183.28936.4497117513938895080@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:24:33.209000", "date_updated": "2022-11-08T16:24:33.209000", "id": "ev_4hJDAIYxzqpJbceoiTugxF", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:24:31.650000+00:00", "date_sent": null, "date_updated": "2022-11-08T16:24:31.650000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475024} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:24:31.194000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "body_text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.650000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:24:31.194000+00:00", "date_updated": "2022-11-08T16:24:33.205000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:24:32 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792467183.28936.13663569799747553498@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792467183.28936.13663569799747553498@smtpgw.close.com>", "<166792467183.28936.4497117513938895080@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Customer Success Team "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:24:33.209000", "date_updated": "2022-11-08T16:24:33.209000", "id": "ev_2zonxxPsLSnXQWXbz1meBr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475027} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T16:24:31.194602", "date_sent": null, "date_updated": "2022-11-08T16:24:31.810164", "email_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "id": "subhis_5sPb9CWgp0vNWMM2x8VDYt", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_174GiA85Ui8g1OuQUrzdWe", "status": "pending", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:24:31.810000", "date_updated": "2022-11-08T16:24:31.810000", "id": "ev_71TqevQnGVOYmBe00zH4ah", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_5sPb9CWgp0vNWMM2x8VDYt", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475028} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:06.399661", "date_updated": "2022-11-08T16:24:31.797778", "id": "sub_174GiA85Ui8g1OuQUrzdWe", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T16:24:31.194602", "updated_by_id": null}, "date_created": "2022-11-08T16:24:31.797000", "date_updated": "2022-11-08T16:24:31.797000", "id": "ev_2Oh82N6SKFk11R0Wd78abz", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_174GiA85Ui8g1OuQUrzdWe", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:07.011108", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475030} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:24:31.651000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.651000+00:00", "date_updated": "2022-11-08T16:24:31.662000+00:00", "email_ids": ["acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:24:31.665000", "date_updated": "2022-11-08T16:24:31.665000", "id": "ev_0n9iXXTLQj8BB665NhN0Q9", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:23:04.324000+00:00", "date_created": "2022-11-08T16:23:04.324000+00:00", "date_updated": "2022-11-08T16:23:06.506000+00:00", "n_emails": 1}, "request_id": null, "user_id": null}, "emitted_at": 1670413475032} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:24:31.650000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Customer,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- ", "body_text": "Hi Customer, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:24:31.650000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:24:31.650000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "success@close.com", "name": "Customer Success Team"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Customer Success Team "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:24:31.653000", "date_updated": "2022-11-08T16:24:31.653000", "id": "ev_4gKA8prx4PDrzTJuJsA2sR", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_bC5SD6KS0DpDnpa8rCOu65fhlVw2lotWPLSKgHvdZgZ", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475034} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T16:23:04.323897", "date_created": "2022-11-08T16:23:04.323897", "date_sent": "2022-11-08T16:23:04.323897", "date_updated": "2022-11-08T16:23:06.630750", "email_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "id": "subhis_0iVz2Ot4TmD6Mjwkb5QrDN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "status": "completed", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:23:06.630000", "date_updated": "2022-11-08T16:23:06.630000", "id": "ev_0TTFMXot6D5ZYjIT99NQe2", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0iVz2Ot4TmD6Mjwkb5QrDN", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T16:23:04.861765", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475036} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "updated_by", "updated_by_name"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:23:04.324000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.324000+00:00", "date_updated": "2022-11-08T16:23:06.506000+00:00", "email_ids": ["acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:23:06.508000", "date_updated": "2022-11-08T16:23:06.508000", "id": "ev_5gjfM4BGuxHrRigS2PtOLN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:23:04.669000+00:00", "date_created": "2022-11-08T16:23:04.669000+00:00", "date_updated": "2022-11-08T16:23:04.675000+00:00", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475038} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:23:04.323000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "body_text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:23:04.323000+00:00", "date_updated": "2022-11-08T16:23:06.464000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:23:05 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792458488.29477.5187137325155036854@smtpgw.close.com>", "<166792458488.29477.3151986449249141034@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:23:06.467000", "date_updated": "2022-11-08T16:23:06.467000", "id": "ev_1fnDX4091kEJ3HKdFzFjHT", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475040} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:23:04.323000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "body_text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.668000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:23:04.323000+00:00", "date_updated": "2022-11-08T16:23:06.464000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:23:05 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792458488.29477.5187137325155036854@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<166792458488.29477.5187137325155036854@smtpgw.close.com>", "<166792458488.29477.3151986449249141034@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Nick Persico "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:23:06.467000", "date_updated": "2022-11-08T16:23:06.467000", "id": "ev_1NO5opn8Bu5AKuC6v32LKh", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:23:04.668000+00:00", "date_sent": null, "date_updated": "2022-11-08T16:23:04.681000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475042} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T16:23:04.323897", "date_sent": null, "date_updated": "2022-11-08T16:23:04.861765", "email_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "id": "subhis_0iVz2Ot4TmD6Mjwkb5QrDN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "status": "pending", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:23:04.861000", "date_updated": "2022-11-08T16:23:04.861000", "id": "ev_3BReWBNxOX7sOYuQ6UjDRp", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "subhis_0iVz2Ot4TmD6Mjwkb5QrDN", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475044} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:10.011072", "date_updated": "2022-11-08T16:23:04.849822", "id": "sub_3J812U6VNcZBmBDEJ1iIdX", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T16:23:04.323897", "updated_by_id": null}, "date_created": "2022-11-08T16:23:04.849000", "date_updated": "2022-11-08T16:23:04.849000", "id": "ev_2U0DlyQz8R1YY78GZwS4Nf", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:10.277337", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475046} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:23:04.668000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Nick,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur", "body_text": "Hi Nick, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.668000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:23:04.681000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "nick@close.com", "name": "Nick Persico"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "to": ["Nick Persico "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:23:04.683000", "date_updated": "2022-11-08T16:23:04.683000", "id": "ev_5Hm0HvVcPN9qoBljYFY3yP", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475048} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:23:04.669000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:23:04.669000+00:00", "date_updated": "2022-11-08T16:23:04.675000+00:00", "email_ids": ["acti_oovua6AW0D3cf6dRsosnqKvAw7g2JzkRTswWk3YheSz"], "id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:23:04.679000", "date_updated": "2022-11-08T16:23:04.679000", "id": "ev_2p7qzPznTDMpvfY7BdGwvb", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_YGNt9KsbM0PoIHdhXP2vVbIh6AULyiCvS7eSxeRx3w2", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475050} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T16:09:03.809833", "date_created": "2022-11-08T16:09:03.809833", "date_sent": "2022-11-08T16:09:03.809833", "date_updated": "2022-11-08T16:09:05.964260", "email_id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "id": "subhis_0ddJQIfOdMAUV2cutTRRix", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_id": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1rgSspOohLocAaucazbFbB", "status": "completed", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:09:05.964000", "date_updated": "2022-11-08T16:09:05.964000", "id": "ev_3ozRho1kmuMvuNhBXsr4J8", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "subhis_0ddJQIfOdMAUV2cutTRRix", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T16:09:04.309526", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475052} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:09:03.810000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T16:09:03.810000+00:00", "date_updated": "2022-11-08T16:09:05.825000+00:00", "email_ids": ["acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 5, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:09:05.828000", "date_updated": "2022-11-08T16:09:05.828000", "id": "ev_031aLeV9FSanN83ai4J1Yl", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:09:04.171000+00:00", "date_created": "2022-11-08T16:09:04.171000+00:00", "date_updated": "2022-11-08T16:09:04.179000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475053} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:09:03.809000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Th", "body_text": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:09:04.170000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:09:03.809000+00:00", "date_updated": "2022-11-08T16:09:05.758000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:09:04 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792374433.22448.16558415745556798661@smtpgw.close.com>", "<166792374433.22448.17907165931371313011@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_1rgSspOohLocAaucazbFbB", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["Tobias F\u00fcnke "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:09:05.761000", "date_updated": "2022-11-08T16:09:05.761000", "id": "ev_7PF4gpz9BNP93g5rLMSVot", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475055} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T16:09:03.809000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Th", "body_text": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:09:04.170000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T16:09:03.809000+00:00", "date_updated": "2022-11-08T16:09:05.758000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 16:09:04 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792374433.22448.16558415745556798661@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792374433.22448.16558415745556798661@smtpgw.close.com>", "<166792374433.22448.17907165931371313011@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sequence_name": "Sequence 2", "sequence_subscription_id": "sub_1rgSspOohLocAaucazbFbB", "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["Tobias F\u00fcnke "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:09:05.761000", "date_updated": "2022-11-08T16:09:05.761000", "id": "ev_1aLtMKZMTCeT3XcFodYGWa", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T16:09:04.170000+00:00", "date_sent": null, "date_updated": "2022-11-08T16:09:04.170000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475057} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T16:09:03.809833", "date_sent": null, "date_updated": "2022-11-08T16:09:04.309526", "email_id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "id": "subhis_0ddJQIfOdMAUV2cutTRRix", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_1rgSspOohLocAaucazbFbB", "status": "pending", "step_id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "updated_by": null}, "date_created": "2022-11-08T16:09:04.309000", "date_updated": "2022-11-08T16:09:04.309000", "id": "ev_0BT0X6xU0px9RkzDzv3Tz5", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "subhis_0ddJQIfOdMAUV2cutTRRix", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475059} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "tobiasfunke@close.com", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:11.239696", "date_updated": "2022-11-08T16:09:04.295282", "id": "sub_1rgSspOohLocAaucazbFbB", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T16:09:03.809833", "updated_by_id": null}, "date_created": "2022-11-08T16:09:04.295000", "date_updated": "2022-11-08T16:09:04.295000", "id": "ev_6XP7kuStxL6ZrmPV7tdQPu", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_1rgSspOohLocAaucazbFbB", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:11.536982", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475061} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T16:09:04.171000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T16:09:04.171000+00:00", "date_updated": "2022-11-08T16:09:04.179000+00:00", "email_ids": ["acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 5, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, {"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T16:09:04.182000", "date_updated": "2022-11-08T16:09:04.182000", "id": "ev_22ZB5LmGvNNmoFaex6uiHp", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:21:52.001000+00:00", "date_created": "2022-11-08T15:21:52.001000+00:00", "date_updated": "2022-11-08T15:22:03.526000+00:00", "latest_normalized_subject": "Delivery Status Notification (Failure)", "n_emails": 4, "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413475063} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T16:09:04.170000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Tobias,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Th", "body_text": "Hi Tobias, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T16:09:04.170000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T16:09:04.170000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "tobiasfunke@close.com", "name": "Tobias F\u00fcnke"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["Tobias F\u00fcnke "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T16:09:04.172000", "date_updated": "2022-11-08T16:09:04.172000", "id": "ev_7PMrH1uUyntFu03zEbfcGn", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_3XzsaHLl42CAYwO98zCzxA5h5SScscYmxqg856bFvdp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475065} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:59:59.614000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:59:38.497000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:59:59.614000+00:00", "date_updated": "2022-11-08T15:59:59.614000+00:00", "direction": "outbound", "error_message": null, "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test text message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:59:59.619000", "date_updated": "2022-11-08T15:59:59.619000", "id": "ev_6XFmpMtGpLv2CPnKaLWVAX", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475067} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:59:59.614000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:59:38.497000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:59:59.614000+00:00", "date_updated": "2022-11-08T15:59:59.614000+00:00", "direction": "outbound", "error_message": null, "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test text message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:59:59.619000", "date_updated": "2022-11-08T15:59:59.619000", "id": "ev_2SOFS0QNi8eApjXpjigm2Y", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:59:38.497000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:59:58.892000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475069} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:59:38.497000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:59:38.497000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:59:58.892000+00:00", "direction": "outbound", "error_message": null, "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test text message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:59:58.899000", "date_updated": "2022-11-08T15:59:58.899000", "id": "ev_2Cs8nuiDAAyyQ7a5TmZL8E", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T15:59:46.427000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475071} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:59:38.497000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:59:38.497000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:59:46.427000+00:00", "direction": "outbound", "error_message": null, "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test text message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:59:41.632000", "date_updated": "2022-11-08T15:59:46.428000", "id": "ev_2hN50QkPzxXKZ1uGOD8WFW", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj/"}, "object_id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:59:38.497000+00:00", "status": "draft", "text": ""}, "request_id": "req_3AycSNZykhQdyJovmSTg7Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475073} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:59:38.497000+00:00", "attachments": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:59:38.497000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:59:38.497000+00:00", "direction": "outbound", "error_message": null, "id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:59:38.499000", "date_updated": "2022-11-08T15:59:38.499000", "id": "ev_2FsqZQCrg4UlYOajlg3xAu", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_bYBEzC3oBNFwfPZwh5PfKCvbT3FrVLTuxxLZguRoFSj", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6LSZmJDQN0DdBji4w9VWFu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475075} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "phones"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.381000+00:00", "date_updated": "2022-11-08T15:59:35.241000+00:00", "emails": [{"email": "irina.grankova@gmail.com", "type": "office"}], "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Iryna", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "Test Lead", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:59:35.243000", "date_updated": "2022-11-08T15:59:35.243000", "id": "ev_2aW6f1B3Boxd45kcxhKZEJ", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP/"}, "object_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:58:50.257000+00:00", "phones": [{"phone": "+380636306253", "phone_formatted": "+380 63 630 6253", "type": "office"}]}, "request_id": "req_0NR3kFmM8easP7BdNjfGka", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475077} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:59:24.130000", "date_updated": "2022-11-08T15:59:24.130000", "id": "ev_4yBiA3l9yNU1hZFQCFmHG0", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "DELETE", "request_path": "/api/v1/contact/cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC/"}, "object_id": "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:59:12.211000+00:00", "date_updated": "2022-11-08T15:59:12.211000+00:00", "emails": [], "id": "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "request_id": "req_0GlUUpnIrC8WXpTKZNn99V", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475078} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["contact_ids", "date_updated"], "data": {"addresses": [], "contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-08T15:59:24.111000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T15:59:24.113000", "date_updated": "2022-11-08T15:59:24.113000", "id": "ev_44OwC6nlLHdAWy2DfuxlIH", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "DELETE", "request_path": "/api/v1/contact/cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC/"}, "object_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC"], "date_updated": "2022-11-08T15:59:12.219000+00:00"}, "request_id": "req_0GlUUpnIrC8WXpTKZNn99V", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475080} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["contact_ids", "date_updated"], "data": {"addresses": [], "contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-08T15:59:12.219000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T15:59:12.221000", "date_updated": "2022-11-08T15:59:12.221000", "id": "ev_4vkfHubu3srD7FeaX4bDJ8", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/contact/"}, "object_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP"], "date_updated": "2022-11-08T15:58:52.124000+00:00"}, "request_id": "req_4hOR6whghRH7VhJtndmAMZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475082} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:59:12.211000+00:00", "date_updated": "2022-11-08T15:59:12.211000+00:00", "emails": [], "id": "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:59:12.213000", "date_updated": "2022-11-08T15:59:12.213000", "id": "ev_08w9w3Y7SLUevspCwHRBUl", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/contact/"}, "object_id": "cont_iN8dRLv2oU62jXfkgPjetnQrGHTne4YGGfy8hL99iHC", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4hOR6whghRH7VhJtndmAMZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475084} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2021-07-26T09:08:50+00:00", "attachments": [{"content_id": null, "content_type": "image/jpeg", "filename": "image0.jpeg", "size": 144978}], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": null, "created_by_name": null, "date_created": "2021-07-26T09:08:50+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:58:52.109000+00:00", "direction": "incoming", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Mon, 26 Jul 2021 12:08:50 +0300", "from": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<56EC0E81-FE10-40C6-ACF8-8B448B510DFD@gmail.com>", "reply_to": [], "sender": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "subject": "Pic", "to": [{"email": "iryna.grankova@globallogic.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z", "in_reply_to_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "message_ids": ["<56EC0E81-FE10-40C6-ACF8-8B448B510DFD@gmail.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Irina Grankova ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Pic", "template_id": null, "template_name": null, "thread_id": "acti_v9S0gdPWzRUqjj2taSmmdfigKanA9tThaFe46FtcXGO", "to": ["iryna.grankova@globallogic.com"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:58:52.110000", "date_updated": "2022-11-08T15:58:52.110000", "id": "ev_71a4f23ctfCPczPVhCEfZl", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475828} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2021-07-26T09:08:50.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-07-26T09:08:50.001000+00:00", "date_updated": "2022-11-08T15:58:52.098000+00:00", "email_ids": ["acti_8ylFXNqFPRAesiUZ63CiHVB4MsHwNhD8TlDpvIGJG8Z"], "id": "acti_v9S0gdPWzRUqjj2taSmmdfigKanA9tThaFe46FtcXGO", "latest_normalized_subject": "Pic", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "irina.grankova@gmail.com", "name": "Irina Grankova"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:58:52.106000", "date_updated": "2022-11-08T15:58:52.106000", "id": "ev_7QVQU1a4glMZ06dQjYrI4p", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {}, "object_id": "acti_v9S0gdPWzRUqjj2taSmmdfigKanA9tThaFe46FtcXGO", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413475830} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "emails", "title"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.381000+00:00", "date_updated": "2022-11-08T15:58:50.257000+00:00", "emails": [{"email": "irina.grankova@gmail.com", "type": "office"}], "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Iryna", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+380636306253", "phone_formatted": "+380 63 630 6253", "type": "office"}], "title": "Test Lead", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:58:50.259000", "date_updated": "2022-11-08T15:58:50.259000", "id": "ev_4nGThfW1XaN6zftcnN0V1T", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP/"}, "object_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:54:58.654000+00:00", "emails": [], "title": ""}, "request_id": "req_6PL20eInhJvS22v1MLEIjq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475832} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "quality_info"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:55:39.770000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:55:39.770000+00:00", "date_updated": "2022-11-08T15:55:51.226000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"01dd010c038de56ab637b74ad0cb07f74d4ed1b558a5d201db5fc811f0b7214c\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"}],\"reports\":{\"googTrack_7d8641fc-37f3-4975-8236-3f6c9b4e2b88\":{\"id\":\"googTrack_7d8641fc-37f3-4975-8236-3f6c9b4e2b88\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googTrackId\":\"7d8641fc-37f3-4975-8236-3f6c9b4e2b88\"},\"googLibjingleSession_6502613843596828260\":{\"id\":\"googLibjingleSession_6502613843596828260\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"4\",\"googTransmitBitrate\":\"0\"},\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\":{\"id\":\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googFingerprint\":\"3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFTCBvKADAgECAgh4Rdz2DA7OEzAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZXZWJSVEMwHhcNMjIxMTA3MTU1NTQwWhcNMjIxMjA4MTU1NTQwWjARMQ8wDQYDVQQDDAZXZWJSVEMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATGLbGtLviNzMYC7UJFXyjT1YzsP0YJQ5NGpAj63rehJJ9kkyVmhwQXL2suNwfG/TXfsmLc2Hjoz3ToX7/mk4TZMAoGCCqGSM49BAMCA0gAMEUCIQDs6J88609CMoiF9r3GU7ywBLHKlawn8qaUB64F1KtzJwIgC06MwAJZK5J05DAtc1E7IY803bvVlx5AjJ/oYXRs3ZQ=\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_3C:D5:A6:A1:C6:12:95:15:31:67:22:85:2E:F0:8A:F5:82:88:B0:85:75:E2:4E:B3:C6:76:67:EC:14:9E:F1:74\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-ptPI/8iJ\":{\"id\":\"Cand-ptPI/8iJ\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54281\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-09XybDei\":{\"id\":\"Cand-09XybDei\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54282\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122194687\"},\"Cand-JHFfRiby\":{\"id\":\"Cand-JHFfRiby\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"9\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"Cand-KNXs7pfP\":{\"id\":\"Cand-KNXs7pfP\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518214911\"},\"ssrc_1491824088_send\":{\"id\":\"ssrc_1491824088_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"audioInputLevel\":\"1305\",\"packetsLost\":\"0\",\"googRtt\":\"41\",\"totalSamplesDuration\":\"10.84\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"7d8641fc-37f3-4975-8236-3f6c9b4e2b88\",\"totalAudioEnergy\":\"0.17414\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"1491824088\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"453\",\"bytesSent\":\"36493\"},\"googTrack_9823eb2d-d356-48fa-be23-e524a5fbeb0f\":{\"id\":\"googTrack_9823eb2d-d356-48fa-be23-e524a5fbeb0f\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googTrackId\":\"9823eb2d-d356-48fa-be23-e524a5fbeb0f\"},\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\":{\"id\":\"googCertificate_33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googFingerprint\":\"33:2A:09:C7:85:E8:48:50:82:B1:7E:D3:8A:EE:D8:B4:FA:37:08:88:E5:73:29:16:CF:B0:22:CB:41:EB:3A:79\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQYn2EBUe7cOu6TojMnF084mg39ETAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA3MTU1NTQwWhcNMjIxMjA4MTU1NTQwWjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASpGYWWHn+7WsEVbebOoh2t8tVjDXrgCrfMW5gRd1BZvxOZOjy26b3ujeg4Omu0j3FJXaUKAo/+cDV1tWUKXjMPMAoGCCqGSM49BAMCA0gAMEUCIQDQ6Ihc7VdXbgKr1FjFkwiH6l5BJDJ4P7Cgg0gj9kLEAwIgHBU9WDZ6iBtB9IsaVadXT7CD4A+mX2VGj6UPD4xhQsk=\"},\"Cand-N3dAA/zp\":{\"id\":\"Cand-N3dAA/zp\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"54282\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853759231\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:54282\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.31:14268\",\"googRtt\":\"36\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"59076\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-xxV+nP6X\",\"localCandidateId\":\"Cand-N3dAA/zp\",\"bytesSent\":\"42535\",\"packetsSent\":\"460\"},\"Cand-xxV+nP6X\":{\"id\":\"Cand-xxV+nP6X\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"portNumber\":\"14268\",\"ipAddress\":\"3.122.181.31\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"Conn-0-1-1\":{\"id\":\"Conn-0-1-1\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"false\",\"googLocalAddress\":\"172.22.63.145:54281\",\"consentRequestsSent\":\"16\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"local\",\"googWritable\":\"false\",\"requestsSent\":\"16\",\"googRemoteAddress\":\"3.122.181.31:14268\",\"googRtt\":\"3000\",\"googActiveConnection\":\"false\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"0\",\"responsesReceived\":\"0\",\"remoteCandidateId\":\"Cand-xxV+nP6X\",\"localCandidateId\":\"Cand-ptPI/8iJ\",\"bytesSent\":\"0\",\"packetsSent\":\"0\"},\"ssrc_493233143_recv\":{\"id\":\"ssrc_493233143_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:55:50.970Z\",\"googDecodingCTN\":\"903\",\"packetsLost\":\"2\",\"googSecondaryDecodedRate\":\"0.00244141\",\"googDecodingPLC\":\"34\",\"packetsReceived\":\"407\",\"googJitterReceived\":\"2\",\"googDecodingCNG\":\"0\",\"ssrc\":\"493233143\",\"googPreferredJitterBufferMs\":\"80\",\"googSpeechExpandRate\":\"0.0394287\",\"totalSamplesDuration\":\"9.03\",\"totalAudioEnergy\":\"0.213002\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"81\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"0.996887\",\"googDecodingNormal\":\"788\",\"googTrackId\":\"9823eb2d-d356-48fa-be23-e524a5fbeb0f\",\"audioOutputLevel\":\"2302\",\"googAccelerateRate\":\"0.0200806\",\"bytesReceived\":\"53896\",\"googCurrentDelayMs\":\"266\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.0723267\",\"googPreemptiveExpandRate\":\"0.00976562\",\"googJitterBufferMs\":\"197\",\"googDecodingMuted\":\"80\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:55:51.228000", "date_updated": "2022-11-08T15:55:51.228000", "id": "ev_7moyf83QQfjva5tg93RhD6", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/call/acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG/"}, "object_id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:55:40.560000+00:00", "quality_info": ""}, "request_id": "req_53quutY4lJgYrxlaIGxEN2", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475834} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:55:39.770000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:55:39.770000+00:00", "date_updated": "2022-11-08T15:55:40.560000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:55:40.562000", "date_updated": "2022-11-08T15:55:40.562000", "id": "ev_4zcUvUddibN0HXoNgxAcU7", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/twilio/routing/"}, "object_id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:55:39.770000+00:00", "disposition": null, "status": "created"}, "request_id": "req_2eh49VPImziXm458xVZFwf", "user_id": null}, "emitted_at": 1670413475836} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-08T15:55:39.770000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:55:39.770000+00:00", "date_updated": "2022-11-08T15:55:39.770000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:55:39.772000", "date_updated": "2022-11-08T15:55:39.772000", "id": "ev_5KZv48gx4Kw5A2R2WQw6ga", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_cBMvILyTlk57YSm7c8xfb9qNjgTX1z2OyjnPPsTXpRG", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3scpfPr70WyteAU3xYR0bH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475838} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-16", "date_created": "2022-11-08T15:55:27.773000+00:00", "date_updated": "2022-11-08T15:55:27.773000+00:00", "id": "noti_mLYZbUFr2FuDE4ZH78FsYktgbfKjEnTqR1GW5qLv7sI", "is_complete": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "object_id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:55:27.774000", "date_updated": "2022-11-08T15:55:27.774000", "id": "ev_2CZPj494pUqqQ4rW5Mqnvr", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "noti_mLYZbUFr2FuDE4ZH78FsYktgbfKjEnTqR1GW5qLv7sI", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5a5XwuQsEVpAe1WtFVXjMa", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475840} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"annualized_expected_value": 5000, "annualized_value": 10000, "confidence": 50, "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "contact_name": "Iryna", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:55:27.750000+00:00", "date_lost": null, "date_updated": "2022-11-08T15:55:27.750000+00:00", "date_won": "2022-11-16", "expected_value": 5000, "id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "note": "Test", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "status_label": "Demo Completed", "status_type": "active", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 10000, "value_currency": "USD", "value_formatted": "$100", "value_period": "one_time"}, "date_created": "2022-11-08T15:55:27.752000", "date_updated": "2022-11-08T15:55:27.752000", "id": "ev_6uEeoDaNKLXKR5LypaWsMC", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5a5XwuQsEVpAe1WtFVXjMa", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475842} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-17T08:30:00+00:00", "date_created": "2022-11-08T15:55:06.275000+00:00", "date_updated": "2022-11-08T15:55:06.275000+00:00", "due_date": "2022-11-17T08:30:00+00:00", "id": "task_Va4jRQkIhZrUwzejqF3lZ4VaJeqR0cAvzzuaN0IaE5r", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "lead_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:55:06.277000", "date_updated": "2022-11-08T15:55:06.277000", "id": "ev_6PnfkZhzJcdkKKSGvlhUJm", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_Va4jRQkIhZrUwzejqF3lZ4VaJeqR0cAvzzuaN0IaE5r", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1McstDK8PWufvVxLETdmBH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475844} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["contact_id", "date_updated", "lead_id"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:53:39.388000+00:00", "call_method": "regular", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:53:39.388000+00:00", "date_updated": "2022-11-08T15:54:58.677000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"01dd010c038de56ab637b74ad0cb07f74d4ed1b558a5d201db5fc811f0b7214c\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"}],\"reports\":{\"googTrack_21097906-5e16-4546-a1e5-99a25141d149\":{\"id\":\"googTrack_21097906-5e16-4546-a1e5-99a25141d149\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googTrackId\":\"21097906-5e16-4546-a1e5-99a25141d149\"},\"googLibjingleSession_7992846545231585686\":{\"id\":\"googLibjingleSession_7992846545231585686\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\":{\"id\":\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googFingerprint\":\"B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFjCBvaADAgECAgkAoA4j75C8pHkwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwNzE1NTMzOVoXDTIyMTIwODE1NTMzOVowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErdOmsw7jnSBVuYv3U8vO/OmQoBkAo9xzuZdotq0FbZnUJ3hGyxpd+fXJ6r6QUzhIWBml9+gCI7mTaWY+mliddjAKBggqhkjOPQQDAgNIADBFAiEAuqbNQ1vV0MKe2+dpNmB3k95xntpGdXHcDq2KC9HfFkECIHI7zgkNQxz/8laMcnSwunYQV3va4q0mWPlMY+kNhp7V\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-yLaNq35b\":{\"id\":\"Cand-yLaNq35b\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52066\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-5aTDwlok\":{\"id\":\"Cand-5aTDwlok\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52067\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122194687\"},\"Cand-ZlyWsNC0\":{\"id\":\"Cand-ZlyWsNC0\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"9\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"Cand-vWheUEuo\":{\"id\":\"Cand-vWheUEuo\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518214911\"},\"ssrc_3124050629_send\":{\"id\":\"ssrc_3124050629_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"audioInputLevel\":\"15187\",\"packetsLost\":\"0\",\"googRtt\":\"39\",\"totalSamplesDuration\":\"10.77\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"21097906-5e16-4546-a1e5-99a25141d149\",\"totalAudioEnergy\":\"0.2048\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"3124050629\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"451\",\"bytesSent\":\"35887\"},\"googTrack_e173b88f-743e-499e-8902-ffdcd5153933\":{\"id\":\"googTrack_e173b88f-743e-499e-8902-ffdcd5153933\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googTrackId\":\"e173b88f-743e-499e-8902-ffdcd5153933\"},\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\":{\"id\":\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googFingerprint\":\"DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQJl7smVexGaG/Qr9v5qYZsXta+QTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA3MTU1MzM5WhcNMjIxMjA4MTU1MzM5WjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATX1jJm+uTeMjAU8oYuqRa8KUh+q5LcyAMKAPGeMyG+JGudLf2ANpZzFa29WuKtwGU0agGPb1+osv/sl3JCtjo+MAoGCCqGSM49BAMCA0gAMEUCIQD9/bOonuf8+GRFNBTQxvFFx5EVCCc2n4EDRc3QnEDyBQIgPdZ+XGZbzaptQP4S2cE3sZy8g0Adhm3FnrQuYfC3gzI=\"},\"Cand-YVPTyt7p\":{\"id\":\"Cand-YVPTyt7p\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52067\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853759231\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:52067\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.25:13394\",\"googRtt\":\"40\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"59297\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-NRCBQXDe\",\"localCandidateId\":\"Cand-YVPTyt7p\",\"bytesSent\":\"41842\",\"packetsSent\":\"457\"},\"Cand-NRCBQXDe\":{\"id\":\"Cand-NRCBQXDe\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"13394\",\"ipAddress\":\"3.122.181.25\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"Conn-0-1-1\":{\"id\":\"Conn-0-1-1\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"false\",\"googLocalAddress\":\"172.22.63.145:52066\",\"consentRequestsSent\":\"16\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"local\",\"googWritable\":\"false\",\"requestsSent\":\"16\",\"googRemoteAddress\":\"3.122.181.25:13394\",\"googRtt\":\"3000\",\"googActiveConnection\":\"false\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"0\",\"responsesReceived\":\"0\",\"remoteCandidateId\":\"Cand-NRCBQXDe\",\"localCandidateId\":\"Cand-yLaNq35b\",\"bytesSent\":\"0\",\"packetsSent\":\"0\"},\"ssrc_1314978720_recv\":{\"id\":\"ssrc_1314978720_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googDecodingCTN\":\"918\",\"packetsLost\":\"1\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"13\",\"packetsReceived\":\"408\",\"googJitterReceived\":\"3\",\"googDecodingCNG\":\"0\",\"ssrc\":\"1314978720\",\"googPreferredJitterBufferMs\":\"40\",\"googSpeechExpandRate\":\"0.0134888\",\"totalSamplesDuration\":\"9.18\",\"totalAudioEnergy\":\"0.208203\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"96\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"809\",\"googTrackId\":\"e173b88f-743e-499e-8902-ffdcd5153933\",\"audioOutputLevel\":\"649\",\"googAccelerateRate\":\"0.00823975\",\"bytesReceived\":\"54095\",\"googCurrentDelayMs\":\"102\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.0524902\",\"googPreemptiveExpandRate\":\"0.00360107\",\"googJitterBufferMs\":\"32\",\"googDecodingMuted\":\"95\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:54:58.679000", "date_updated": "2022-11-08T15:54:58.679000", "id": "ev_53ArnyOoeXFvCBtCKDceGn", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP/"}, "object_id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"contact_id": null, "date_updated": "2022-11-08T15:53:51.106000+00:00", "lead_id": null}, "request_id": "req_6Yc1zSvUGqd9BQuqhw9OAA", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475846} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "phones"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.381000+00:00", "date_updated": "2022-11-08T15:54:58.654000+00:00", "emails": [], "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Iryna", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+380636306253", "phone_formatted": "+380 63 630 6253", "type": "office"}], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:54:58.656000", "date_updated": "2022-11-08T15:54:58.656000", "id": "ev_1JiBQ5XQvNkjmgUFwPwdx5", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP/"}, "object_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:54:42.381000+00:00", "phones": []}, "request_id": "req_6Yc1zSvUGqd9BQuqhw9OAA", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475848} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Created", "activity_at": "2022-11-08T15:54:42.377000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-08T15:54:42.398000+00:00", "id": "acti_CojceqMDlW46aVmKCv6YXS8oMJGPfchHYfXXySGMm39", "import_id": null, "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:54:42.400000", "date_updated": "2022-11-08T15:54:42.400000", "id": "ev_7j5Q59chxt2eHsjFtfHgim", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "acti_CojceqMDlW46aVmKCv6YXS8oMJGPfchHYfXXySGMm39", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1nEFEcijpyI40ReiCcvQgD", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475850} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"addresses": [], "contact_ids": ["cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:54:42.377000+00:00", "date_updated": "2022-11-08T15:54:42.385000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "has:phone_numbers opportunities:1 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T15:54:42.387000", "date_updated": "2022-11-08T15:54:42.387000", "id": "ev_3qA6kOTuiB4VdFwxl4WTyf", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1nEFEcijpyI40ReiCcvQgD", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475852} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:54:42.381000+00:00", "date_updated": "2022-11-08T15:54:42.381000+00:00", "emails": [], "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "name": "Iryna", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:54:42.383000", "date_updated": "2022-11-08T15:54:42.383000", "id": "ev_705h595sD1lJg0A4AeFZ5j", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1nEFEcijpyI40ReiCcvQgD", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475853} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "quality_info"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:53:39.388000+00:00", "call_method": "regular", "contact_id": null, "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:53:39.388000+00:00", "date_updated": "2022-11-08T15:53:51.106000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": null, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "{\"version\":\"7.0.7\",\"platform\":\"Win32\",\"type\":\"webrtc\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CloseIO/7.0.7 Chrome/91.0.4472.164 Electron/13.6.6 Safari/537.36\",\"devices\":[{\"deviceId\":\"default\",\"kind\":\"audioinput\",\"label\":\"Default - Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"communications\",\"kind\":\"audioinput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"02ce050e090c446c08a2f369d11befe4a043df584c6dcaa2818ce9673f44b77d\",\"kind\":\"audioinput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"f22c0a8b3012377e4a5c8a8ba0050d336545cf2d52650ae978566bbb461d9386\",\"kind\":\"audioinput\",\"label\":\"Microphone (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"83921fe5825a5823c756da838e2c87c161cbfaefba6d74003cf256372a843d38\",\"kind\":\"videoinput\",\"label\":\"HP HD Camera (04f2:b5ee)\",\"groupId\":\"01dd010c038de56ab637b74ad0cb07f74d4ed1b558a5d201db5fc811f0b7214c\"},{\"deviceId\":\"default\",\"kind\":\"audiooutput\",\"label\":\"Default - Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"},{\"deviceId\":\"communications\",\"kind\":\"audiooutput\",\"label\":\"Communications - Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"7b0e22e3609b4b35ad95aec2e9865e004b5a051ae71e220ff1ee18472802dd41\",\"kind\":\"audiooutput\",\"label\":\"Speakers (Conexant ISST Audio)\",\"groupId\":\"a0f6204e379b40b0abf0bb7ba0c8c2143c70b68486fcc12000b4e26304c786f0\"},{\"deviceId\":\"030fa574cbd9c7ce44ba12c33b7cafa13c1ace35207eb3e851371aa4ddca879a\",\"kind\":\"audiooutput\",\"label\":\"Headset (JBL TUNE510BT Hands-Free AG Audio) (Bluetooth)\",\"groupId\":\"748e4bd95919a67f46c183da9dbc19742ea24bff16ecd5a4a1c220136c5dfa22\"},{\"deviceId\":\"77a66164273de44ca89916508139996aac0473f329234fae178faf773b59c8d8\",\"kind\":\"audiooutput\",\"label\":\"Headphones (JBL TUNE510BT Stereo) (Bluetooth)\",\"groupId\":\"dd3e8462a7fc3ea5a14a0d9eb6009918071a82b3a1d120666e645a849a13e12a\"}],\"reports\":{\"googTrack_21097906-5e16-4546-a1e5-99a25141d149\":{\"id\":\"googTrack_21097906-5e16-4546-a1e5-99a25141d149\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googTrackId\":\"21097906-5e16-4546-a1e5-99a25141d149\"},\"googLibjingleSession_7992846545231585686\":{\"id\":\"googLibjingleSession_7992846545231585686\",\"type\":\"googLibjingleSession\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googInitiator\":\"true\"},\"bweforvideo\":{\"id\":\"bweforvideo\",\"type\":\"VideoBwe\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googActualEncBitrate\":\"0\",\"googAvailableSendBandwidth\":\"300000\",\"googRetransmitBitrate\":\"0\",\"googAvailableReceiveBandwidth\":\"0\",\"googTargetEncBitrate\":\"0\",\"googBucketDelay\":\"0\",\"googTransmitBitrate\":\"0\"},\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\":{\"id\":\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googFingerprint\":\"B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBFjCBvaADAgECAgkAoA4j75C8pHkwCgYIKoZIzj0EAwIwETEPMA0GA1UEAwwGV2ViUlRDMB4XDTIyMTEwNzE1NTMzOVoXDTIyMTIwODE1NTMzOVowETEPMA0GA1UEAwwGV2ViUlRDMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErdOmsw7jnSBVuYv3U8vO/OmQoBkAo9xzuZdotq0FbZnUJ3hGyxpd+fXJ6r6QUzhIWBml9+gCI7mTaWY+mliddjAKBggqhkjOPQQDAgNIADBFAiEAuqbNQ1vV0MKe2+dpNmB3k95xntpGdXHcDq2KC9HfFkECIHI7zgkNQxz/8laMcnSwunYQV3va4q0mWPlMY+kNhp7V\"},\"Channel-0-1\":{\"id\":\"Channel-0-1\",\"type\":\"googComponent\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googComponent\":\"1\",\"remoteCertificateId\":\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"selectedCandidatePairId\":\"Conn-0-1-0\",\"dtlsCipher\":\"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256\",\"localCertificateId\":\"googCertificate_B7:3A:30:DF:EA:98:D6:8E:9B:52:4F:BF:4B:E8:AD:4F:D2:FD:20:9D:AE:D6:88:FD:3B:DB:8B:B7:21:B1:FB:13\",\"srtpCipher\":\"AES_CM_128_HMAC_SHA1_80\"},\"Cand-yLaNq35b\":{\"id\":\"Cand-yLaNq35b\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52066\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122260223\"},\"Cand-5aTDwlok\":{\"id\":\"Cand-5aTDwlok\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52067\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"host\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"2122194687\"},\"Cand-ZlyWsNC0\":{\"id\":\"Cand-ZlyWsNC0\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"9\",\"networkType\":\"lan\",\"ipAddress\":\"172.22.63.145\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518280447\"},\"Cand-vWheUEuo\":{\"id\":\"Cand-vWheUEuo\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"9\",\"networkType\":\"wlan\",\"ipAddress\":\"192.168.0.178\",\"transport\":\"tcp\",\"candidateType\":\"host\",\"priority\":\"1518214911\"},\"ssrc_3124050629_send\":{\"id\":\"ssrc_3124050629_send\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"audioInputLevel\":\"15187\",\"packetsLost\":\"0\",\"googRtt\":\"39\",\"totalSamplesDuration\":\"10.77\",\"googEchoCancellationReturnLossEnhancement\":\"0\",\"googTrackId\":\"21097906-5e16-4546-a1e5-99a25141d149\",\"totalAudioEnergy\":\"0.2048\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googEchoCancellationReturnLoss\":\"-30\",\"googCodecName\":\"opus\",\"ssrc\":\"3124050629\",\"googJitterReceived\":\"2\",\"googTypingNoiseState\":\"false\",\"packetsSent\":\"451\",\"bytesSent\":\"35887\"},\"googTrack_e173b88f-743e-499e-8902-ffdcd5153933\":{\"id\":\"googTrack_e173b88f-743e-499e-8902-ffdcd5153933\",\"type\":\"googTrack\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googTrackId\":\"e173b88f-743e-499e-8902-ffdcd5153933\"},\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\":{\"id\":\"googCertificate_DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"type\":\"googCertificate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googFingerprint\":\"DD:29:AC:5B:8E:36:4D:CC:A7:E3:5B:5A:BE:AB:9F:70:0E:35:58:7E:95:62:F8:91:75:45:C2:79:F0:FE:9A:F1\",\"googFingerprintAlgorithm\":\"sha-256\",\"googDerBase64\":\"MIIBITCByKADAgECAhQJl7smVexGaG/Qr9v5qYZsXta+QTAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZ0d2lsaW8wHhcNMjIxMTA3MTU1MzM5WhcNMjIxMjA4MTU1MzM5WjARMQ8wDQYDVQQDDAZ0d2lsaW8wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATX1jJm+uTeMjAU8oYuqRa8KUh+q5LcyAMKAPGeMyG+JGudLf2ANpZzFa29WuKtwGU0agGPb1+osv/sl3JCtjo+MAoGCCqGSM49BAMCA0gAMEUCIQD9/bOonuf8+GRFNBTQxvFFx5EVCCc2n4EDRc3QnEDyBQIgPdZ+XGZbzaptQP4S2cE3sZy8g0Adhm3FnrQuYfC3gzI=\"},\"Cand-YVPTyt7p\":{\"id\":\"Cand-YVPTyt7p\",\"type\":\"localcandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"stunKeepaliveRequestsSent\":\"0\",\"portNumber\":\"52067\",\"networkType\":\"wlan\",\"ipAddress\":\"85.209.47.207\",\"stunKeepaliveResponsesReceived\":\"0\",\"stunKeepaliveRttTotal\":\"0\",\"transport\":\"udp\",\"candidateType\":\"peerreflexive\",\"stunKeepaliveRttSquaredTotal\":\"0\",\"priority\":\"1853759231\"},\"Conn-0-1-0\":{\"id\":\"Conn-0-1-0\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"true\",\"googLocalAddress\":\"85.209.47.207:52067\",\"consentRequestsSent\":\"1\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"prflx\",\"googWritable\":\"true\",\"requestsSent\":\"7\",\"googRemoteAddress\":\"3.122.181.25:13394\",\"googRtt\":\"40\",\"googActiveConnection\":\"true\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"59297\",\"responsesReceived\":\"7\",\"remoteCandidateId\":\"Cand-NRCBQXDe\",\"localCandidateId\":\"Cand-YVPTyt7p\",\"bytesSent\":\"41842\",\"packetsSent\":\"457\"},\"Cand-NRCBQXDe\":{\"id\":\"Cand-NRCBQXDe\",\"type\":\"remotecandidate\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"portNumber\":\"13394\",\"ipAddress\":\"3.122.181.25\",\"transport\":\"udp\",\"candidateType\":\"host\",\"priority\":\"2130706431\"},\"Conn-0-1-1\":{\"id\":\"Conn-0-1-1\",\"type\":\"googCandidatePair\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"responsesSent\":\"0\",\"requestsReceived\":\"0\",\"googRemoteCandidateType\":\"local\",\"googReadable\":\"false\",\"googLocalAddress\":\"172.22.63.145:52066\",\"consentRequestsSent\":\"16\",\"googTransportType\":\"udp\",\"googChannelId\":\"Channel-0-1\",\"googLocalCandidateType\":\"local\",\"googWritable\":\"false\",\"requestsSent\":\"16\",\"googRemoteAddress\":\"3.122.181.25:13394\",\"googRtt\":\"3000\",\"googActiveConnection\":\"false\",\"packetsDiscardedOnSend\":\"0\",\"bytesReceived\":\"0\",\"responsesReceived\":\"0\",\"remoteCandidateId\":\"Cand-NRCBQXDe\",\"localCandidateId\":\"Cand-yLaNq35b\",\"bytesSent\":\"0\",\"packetsSent\":\"0\"},\"ssrc_1314978720_recv\":{\"id\":\"ssrc_1314978720_recv\",\"type\":\"ssrc\",\"timestamp\":\"2022-11-08T15:53:50.476Z\",\"googDecodingCTN\":\"918\",\"packetsLost\":\"1\",\"googSecondaryDecodedRate\":\"0\",\"googDecodingPLC\":\"13\",\"packetsReceived\":\"408\",\"googJitterReceived\":\"3\",\"googDecodingCNG\":\"0\",\"ssrc\":\"1314978720\",\"googPreferredJitterBufferMs\":\"40\",\"googSpeechExpandRate\":\"0.0134888\",\"totalSamplesDuration\":\"9.18\",\"totalAudioEnergy\":\"0.208203\",\"transportId\":\"Channel-0-1\",\"mediaType\":\"audio\",\"googDecodingPLCCNG\":\"96\",\"googCodecName\":\"opus\",\"googSecondaryDiscardedRate\":\"1\",\"googDecodingNormal\":\"809\",\"googTrackId\":\"e173b88f-743e-499e-8902-ffdcd5153933\",\"audioOutputLevel\":\"649\",\"googAccelerateRate\":\"0.00823975\",\"bytesReceived\":\"54095\",\"googCurrentDelayMs\":\"102\",\"googDecodingCTSG\":\"0\",\"googExpandRate\":\"0.0524902\",\"googPreemptiveExpandRate\":\"0.00360107\",\"googJitterBufferMs\":\"32\",\"googDecodingMuted\":\"95\"}},\"inputId\":\"default\",\"outputId\":\"default\",\"ringtoneId\":\"default\",\"dtmfInfo\":[]}", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:53:51.108000", "date_updated": "2022-11-08T15:53:51.108000", "id": "ev_6VaXEt7XPtwqMrb54DWZhj", "lead_id": null, "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/call/acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ/"}, "object_id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:53:40.150000+00:00", "quality_info": ""}, "request_id": "req_2Bl7dPyCQMcpduW49IKifG", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475855} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "disposition", "status"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:53:39.388000+00:00", "call_method": "regular", "contact_id": null, "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:53:39.388000+00:00", "date_updated": "2022-11-08T15:53:40.150000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "blocked", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": null, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "failed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:53:40.153000", "date_updated": "2022-11-08T15:53:40.153000", "id": "ev_5yMGB9HNOYZYefUVXaYYfP", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/twilio/routing/"}, "object_id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:53:39.388000+00:00", "disposition": null, "status": "created"}, "request_id": "req_7B5nKPQddmYLsGarHd8WBH", "user_id": null}, "emitted_at": 1670413475857} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-08T15:53:39.388000+00:00", "call_method": "regular", "contact_id": null, "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:53:39.388000+00:00", "date_updated": "2022-11-08T15:53:39.388000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": null, "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": null, "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+380636306253", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "UA", "remote_phone": "+380636306253", "remote_phone_formatted": "+380 63 630 6253", "sequence_id": null, "sequence_subscription_id": null, "source": "Close.io", "status": "created", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:53:39.392000", "date_updated": "2022-11-08T15:53:39.392000", "id": "ev_2maC3WHimNes2vQDclaDnQ", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_HpPgUhPNiZeEkjdpfW6jmK11uXJyTZHHiubYmU0uoFZ", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6qjxD7IbhIBCvZ21AIhoOF", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475859} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"date_created": "2022-11-08T15:50:57.032374", "date_updated": "2022-11-08T15:50:57.032374", "id": "save_UeQpNDWG0AuXKKunEIABD0qSjHvV62EFaTHzN70B6gN", "is_shared": false, "is_user_dependent": false, "name": "Deleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": null, "s_query": {"query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "results_limit": null, "sort": []}, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:50:57.034000", "date_updated": "2022-11-08T15:50:57.034000", "id": "ev_6aWq2kWz9duPf63ZIwbhy9", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/saved_search/"}, "object_id": "save_UeQpNDWG0AuXKKunEIABD0qSjHvV62EFaTHzN70B6gN", "object_type": "saved_search", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4NhKIo1f0nC4CodvXzLrP7", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475861} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed", "status"], "data": {"bulk_object_type": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:49:38.627000+00:00", "date_updated": "2022-11-08T15:49:44.832000+00:00", "id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "n_leads": 3, "n_leads_processed": 3, "n_objects": 3, "n_objects_processed": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "send_done_email": true, "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:49:43.181000", "date_updated": "2022-11-08T15:49:44.840000", "id": "ev_52jvR8zgKF2561ffYM0gne", "lead_id": null, "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "object_type": "bulk_action.delete", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:49:42.212000+00:00", "n_leads_processed": 0, "n_objects_processed": 0, "status": "processing"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475863} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"bulk_object_type": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:49:38.627000+00:00", "date_updated": "2022-11-08T15:49:44.832000+00:00", "id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "n_leads": 3, "n_leads_processed": 3, "n_objects": 3, "n_objects_processed": 3, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "send_done_email": true, "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:49:44.840000", "date_updated": "2022-11-08T15:49:44.840000", "id": "ev_3pLh6xQoRbPFBZlvm2HSCj", "lead_id": null, "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "object_type": "bulk_action.delete", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475865} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.195000", "date_updated": "2022-11-08T15:49:44.195000", "id": "ev_08L0oQryDMsEgdqgqFmseK", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"addresses": [], "contact_ids": ["cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:18.101000+00:00", "date_updated": "2022-11-08T15:02:54.138000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "status_label": "Qualified", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475867} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.160000", "date_updated": "2022-11-08T15:49:44.160000", "id": "ev_4oTvpet9x9EvSaBL170JBr", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"annualized_expected_value": 600000, "annualized_value": 600000, "confidence": 100, "contact_id": null, "contact_name": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:45.225000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:39:45.225000+00:00", "date_won": "2022-11-08", "expected_value": 50000, "id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_gaqEGSVHIFzrofTfzzg5UfjyBZ1B6KERccIy2MOp8FG", "status_label": "Won", "status_type": "won", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 50000, "value_currency": "USD", "value_formatted": "$500 monthly", "value_period": "monthly"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475869} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.114000", "date_updated": "2022-11-08T15:49:44.114000", "id": "ev_2Qwkl36GqKyUQIPMeLvPsV", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "noti_TmKkh9qNFLGadhDQaMvSBhvt7NpKG5LaQeA8QMoy7mD", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:39:45.247000+00:00", "date_updated": "2022-11-08T12:39:45.247000+00:00", "id": "noti_TmKkh9qNFLGadhDQaMvSBhvt7NpKG5LaQeA8QMoy7mD", "is_complete": true, "is_new": false, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475871} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.083000", "date_updated": "2022-11-08T15:49:44.083000", "id": "ev_3QceiagvLbpgOVJH5vUj09", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "task_TkXjx6VgrvQDAvjgw5zF3tbMfVOKSUgfv4T9wDDvzor", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:39:28.163000+00:00", "date_updated": "2022-11-08T12:39:28.163000+00:00", "due_date": "2022-11-08", "id": "task_TkXjx6VgrvQDAvjgw5zF3tbMfVOKSUgfv4T9wDDvzor", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475872} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.051000", "date_updated": "2022-11-08T15:49:44.051000", "id": "ev_3Vnz3YErgvKZXaGGgij8Du", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_9XUHcfmeKdaDhVS82diWdqGnKPvEfM3SkEr2t0uVVtb", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Created", "activity_at": "2022-11-08T12:39:18.101000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:18.101000+00:00", "date_updated": "2022-11-08T12:39:18.119000+00:00", "id": "acti_9XUHcfmeKdaDhVS82diWdqGnKPvEfM3SkEr2t0uVVtb", "import_id": null, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475874} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.036000", "date_updated": "2022-11-08T15:49:44.036000", "id": "ev_2YAKsQ5f9sktHLRgNpYFFt", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_djNEynab5lvt0dA3DR2zp57cty6YQ958yzPyTH14rp3", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "LeadStatusChange", "activity_at": "2022-11-08T12:39:23.457000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:23.457000+00:00", "date_updated": "2022-11-08T12:39:23.457000+00:00", "id": "acti_djNEynab5lvt0dA3DR2zp57cty6YQ958yzPyTH14rp3", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "new_status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "new_status_label": "Qualified", "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "old_status_label": "Potential", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475876} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:44.008000", "date_updated": "2022-11-08T15:49:44.008000", "id": "ev_70IxN5nW0T7vG1drZGDSS7", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:09.329000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Facebook", "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": "Yes", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Stark Industries", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Media", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Point of Contact"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:40:09.329000+00:00", "date_updated": "2022-11-08T12:40:25.872000+00:00", "id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475878} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.984000", "date_updated": "2022-11-08T15:49:43.984000", "id": "ev_04M1UF4zGlTWGbfrYmyjPj", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:32.535000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "Meeting 1", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:40:32.535000+00:00", "date_updated": "2022-11-08T12:40:38.917000+00:00", "id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475880} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.956000", "date_updated": "2022-11-08T15:49:43.956000", "id": "ev_5oGT1yYcKEN6XwKbVrLMNW", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:53.603000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:02:53.603000+00:00", "date_updated": "2022-11-08T15:02:53.603000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475882} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.934000", "date_updated": "2022-11-08T15:49:43.934000", "id": "ev_3NXxfiLZI1jJcJKs3iYBaV", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Call", "activity_at": "2022-11-08T15:02:48.288000+00:00", "call_method": "external", "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:02:48.288000+00:00", "date_updated": "2022-11-08T15:02:54.131000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "Test call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "External", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475884} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.573000", "date_updated": "2022-11-08T15:49:43.573000", "id": "ev_62exwVxfm273vZ7afSu8rO", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:39:18.105000+00:00", "date_updated": "2022-11-08T15:02:31.847000+00:00", "emails": [], "id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "Test Lead 3", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "Test lead", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475886} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.099000", "date_updated": "2022-11-08T15:49:43.099000", "id": "ev_1UVQT6sBYcTRgo9SXTGL8T", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"addresses": [], "contact_ids": ["cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:25:18.399000+00:00", "date_updated": "2022-11-08T15:18:01.057000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475888} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.081000", "date_updated": "2022-11-08T15:49:43.081000", "id": "ev_5i0J2MfRnvycVmEkYmz4PW", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"annualized_expected_value": 50000, "annualized_value": 100000, "confidence": 50, "contact_id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "contact_name": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_Ci7oJh7QiC0Bizd4Lcw9jrDLSC5OSWGux5O0YLbyzBw": "12345", "custom.cf_Z6Vyxe2J0lrRqFpWQQGLkPo8iwhmZ9hzWc69ll2oFox": "2022-11-23", "date_created": "2022-11-08T12:26:13.638000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:26:13.638000+00:00", "date_won": "2022-11-30", "expected_value": 50000, "id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "status_label": "Demo Completed", "status_type": "active", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 100000, "value_currency": "USD", "value_formatted": "$1,000", "value_period": "one_time"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475889} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.031000", "date_updated": "2022-11-08T15:49:43.031000", "id": "ev_0CpbJj1WXkDckr6sUAJMWq", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"addresses": [], "contact_ids": ["cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:24.066000+00:00", "date_updated": "2022-11-08T12:38:51.610000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475891} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.026000", "date_updated": "2022-11-08T15:49:43.026000", "id": "ev_7fJd5iVETHMy2Hz53dPDCr", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "noti_92aFlB5tcmbJW89lg4fTyBOdAJFJt13bToBOvzypOw5", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30", "date_created": "2022-11-08T12:26:13.663000+00:00", "date_updated": "2022-11-08T12:26:13.663000+00:00", "id": "noti_92aFlB5tcmbJW89lg4fTyBOdAJFJt13bToBOvzypOw5", "is_complete": false, "is_new": true, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475893} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:43.012000", "date_updated": "2022-11-08T15:49:43.012000", "id": "ev_2oJogVbe9dzUTLU5QLZb0s", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"annualized_expected_value": 10000, "annualized_value": 20000, "confidence": 50, "contact_id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "contact_name": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:51.568000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:38:51.568000+00:00", "date_won": "2022-11-17", "expected_value": 10000, "id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_ObYTUqjVZW0nTZXjvHhzMGyK999e42WZdIhkaNq12En", "status_label": "Contract Sent", "status_type": "active", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 20000, "value_currency": "USD", "value_formatted": "$200", "value_period": "one_time"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475895} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.988000", "date_updated": "2022-11-08T15:49:42.988000", "id": "ev_2i8CHROwV4DQSuIky602rL", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-15", "date_created": "2022-11-08T12:25:32.733000+00:00", "date_updated": "2022-11-08T15:18:00.018000+00:00", "due_date": "2022-11-15", "id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475897} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.951000", "date_updated": "2022-11-08T15:49:42.951000", "id": "ev_7aWgJ5vKeTdl2RbB1zaihy", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_32MAr5WHnmOsYHOjucM11mMoVcrg6K3nNu3z7dux3Bt", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Created", "activity_at": "2022-11-08T12:25:18.399000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:25:18.399000+00:00", "date_updated": "2022-11-08T12:25:18.415000+00:00", "id": "acti_32MAr5WHnmOsYHOjucM11mMoVcrg6K3nNu3z7dux3Bt", "import_id": null, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475899} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.950000", "date_updated": "2022-11-08T15:49:42.950000", "id": "ev_6W4d9Bwla94c1YT7nTl2Nb", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "noti_5CwYYAqPoVjCYRZagjxdbeyEOusRDISkehgr3v1KVfV", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-17", "date_created": "2022-11-08T12:38:51.597000+00:00", "date_updated": "2022-11-08T12:38:51.597000+00:00", "id": "noti_5CwYYAqPoVjCYRZagjxdbeyEOusRDISkehgr3v1KVfV", "is_complete": false, "is_new": true, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475901} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.934000", "date_updated": "2022-11-08T15:49:42.934000", "id": "ev_7eOjUvmL04QvHLxW4UeHLd", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "object_type": "activity.note", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Note", "activity_at": "2022-11-08T12:26:32.324000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:26:32.324000+00:00", "date_updated": "2022-11-08T12:26:34.786000+00:00", "id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "note": "Test note", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475902} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.907000", "date_updated": "2022-11-08T15:49:42.907000", "id": "ev_2YbHjExjal4lwQ82u9jqFD", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "task_xKiuX4ZjnL2zRUlNWFjPbupKofLLhYkLPsDdEnsLBMb", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:38:32.187000+00:00", "date_updated": "2022-11-08T12:38:32.187000+00:00", "due_date": "2022-11-08", "id": "task_xKiuX4ZjnL2zRUlNWFjPbupKofLLhYkLPsDdEnsLBMb", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475904} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.876000", "date_updated": "2022-11-08T15:49:42.876000", "id": "ev_1LrDU6Cc7B9e215H0q8iSd", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "acti_HZwfZd2NtUbwSXTUsxMhMLGDltDnYSoVhGTa26NgY1I", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Created", "activity_at": "2022-11-08T12:38:24.066000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:24.066000+00:00", "date_updated": "2022-11-08T12:38:24.084000+00:00", "id": "acti_HZwfZd2NtUbwSXTUsxMhMLGDltDnYSoVhGTa26NgY1I", "import_id": null, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475906} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.815000", "date_updated": "2022-11-08T15:49:42.815000", "id": "ev_7ivXJn8OfNOodruqb5xJ7N", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:25:18.403000+00:00", "date_updated": "2022-11-08T12:25:18.403000+00:00", "emails": [], "id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "name": "Company 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475908} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:49:42.731000", "date_updated": "2022-11-08T15:49:42.731000", "id": "ev_0UuEbqBzwxQi9pjP3Ml74h", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:38:24.071000+00:00", "date_updated": "2022-11-08T12:38:24.071000+00:00", "emails": [], "id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "name": "Test Lead 2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475910} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads", "n_objects", "status"], "data": {"bulk_object_type": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:49:38.627000+00:00", "date_updated": "2022-11-08T15:49:42.212000+00:00", "id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "n_leads": 3, "n_leads_processed": 0, "n_objects": 3, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "send_done_email": true, "sort": [], "status": "processing", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:49:41.320000", "date_updated": "2022-11-08T15:49:42.214000", "id": "ev_5JBIgnjqvvd3sjvdCpb2Tp", "lead_id": null, "meta": {"bulk_action_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52"}, "object_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "object_type": "bulk_action.delete", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:49:38.627000+00:00", "n_leads": null, "n_objects": null, "status": "created"}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475912} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"bulk_object_type": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:49:38.627000+00:00", "date_updated": "2022-11-08T15:49:38.627000+00:00", "id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "n_leads": null, "n_leads_processed": 0, "n_objects": null, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "send_done_email": true, "sort": [], "status": "created", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:49:38.630000", "date_updated": "2022-11-08T15:49:38.630000", "id": "ev_56QxI5UrlqlZ0neD4xAsMS", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/bulk_action/delete/"}, "object_id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "object_type": "bulk_action.delete", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_10PxohqYOvE1AeDQBYwlAu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475914} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:45:08.951000", "date_updated": "2022-11-08T15:45:08.951000", "id": "ev_17cX5HF569gRxd0Z25AkUg", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "DELETE", "request_path": "/api/v1/activity/call/acti_5VyvfRIrzD2ufdY1O5nWGJpJMMuN7DNjxTMmygrFoKv/"}, "object_id": "acti_5VyvfRIrzD2ufdY1O5nWGJpJMMuN7DNjxTMmygrFoKv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "Call", "activity_at": "2022-11-08T15:45:01.299000+00:00", "call_method": "external", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:45:01.299000+00:00", "date_updated": "2022-11-08T15:45:01.299000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_5VyvfRIrzD2ufdY1O5nWGJpJMMuN7DNjxTMmygrFoKv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "External", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "request_id": "req_6wxzK8vbwwUNXgbNjL25EZ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475916} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:45:04.639000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:42.011000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:45:04.639000+00:00", "date_updated": "2022-11-08T15:45:04.640000+00:00", "direction": "outbound", "error_message": null, "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:45:04.642000", "date_updated": "2022-11-08T15:45:04.642000", "id": "ev_3OxLOF5cSjyxH54LhUcIpg", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:44:42.011000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:45:03.787000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475918} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:45:04.639000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:42.011000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:45:04.639000+00:00", "date_updated": "2022-11-08T15:45:04.640000+00:00", "direction": "outbound", "error_message": null, "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:45:04.642000", "date_updated": "2022-11-08T15:45:04.642000", "id": "ev_0OMxbkyY1DJ9CuuqCdKjte", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413475920} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:44:42.011000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:42.011000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:45:03.787000+00:00", "direction": "outbound", "error_message": null, "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:45:03.789000", "date_updated": "2022-11-08T15:45:03.789000", "id": "ev_0ZZG6EQxdYCwf1VRZU2ssx", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T15:44:51.226000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413475921} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-08T15:45:01.299000+00:00", "call_method": "external", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:45:01.299000+00:00", "date_updated": "2022-11-08T15:45:01.299000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_5VyvfRIrzD2ufdY1O5nWGJpJMMuN7DNjxTMmygrFoKv", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "External", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:45:01.300000", "date_updated": "2022-11-08T15:45:01.300000", "id": "ev_3FDPahyDxYoXzkRKf3sac6", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_5VyvfRIrzD2ufdY1O5nWGJpJMMuN7DNjxTMmygrFoKv", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4VGM99TMzEkCdf4fPlkjao", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476642} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "template_id", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:44:42.011000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:42.011000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:44:51.226000+00:00", "direction": "outbound", "error_message": null, "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:44:46.774000", "date_updated": "2022-11-08T15:44:51.228000", "id": "ev_4NWYeTTlGpS6lkr1HHVYxi", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q/"}, "object_id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:44:42.011000+00:00", "status": "draft", "template_id": "", "text": ""}, "request_id": "req_6tmsytxwayPnjCwhWFYfZG", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476644} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:44:42.011000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:42.011000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:44:42.011000+00:00", "direction": "outbound", "error_message": null, "id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:44:42.013000", "date_updated": "2022-11-08T15:44:42.013000", "id": "ev_25mvEudAz2gTdgbc8w6TUL", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_GZs8fnu859jbSuV6jTVhgUwx1oBOhlUhh1JCeYHsS7q", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2HIkMtDjMasmKfCauwbk4t", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476647} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_scheduled", "date_updated", "status", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:55.510000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": "2022-11-09T07:00:00+00:00", "date_sent": null, "date_updated": "2022-11-08T15:44:34.783000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "scheduled", "template_id": "", "text": "Test message", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:44:30.032000", "date_updated": "2022-11-08T15:44:34.785000", "id": "ev_2r3ksZOrA7XEHyHJdT47rs", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x/"}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_scheduled": null, "date_updated": "2022-11-08T15:44:28.785000+00:00", "status": "draft", "text": "Test"}, "request_id": "req_7aQmW5xDix0Y1Z34AE3aW1", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476649} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:55.510000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:44:27.549000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "Test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:44:27.551000", "date_updated": "2022-11-08T15:44:27.551000", "id": "ev_2EdohTy5OyMaUcA0o6Svqq", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x/"}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:01:55.510000+00:00", "text": ""}, "request_id": "req_7hritBslpcBEJlmBfwJwuo", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476651} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:44:17.804000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:44:17.804000+00:00", "date_updated": "2022-11-08T15:44:19.328000+00:00", "email_ids": ["acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs"], "id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "latest_normalized_subject": "(no subject)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:44:19.331000", "date_updated": "2022-11-08T15:44:19.331000", "id": "ev_1aYuqsDhgmgKnmud54QxX7", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:43:48.820000+00:00", "date_created": "2022-11-08T15:43:48.820000+00:00", "date_updated": "2022-11-08T15:44:05.123000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476653} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:44:17.803000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:44:17.803000+00:00", "date_updated": "2022-11-08T15:44:19.299000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166792225784.2629.13990873364570888607@smtpgw.close.com>", "<166792225784.2629.12825104744076060180@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "(no subject)", "template_id": null, "template_name": null, "thread_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:44:19.302000", "date_updated": "2022-11-08T15:44:19.302000", "id": "ev_4BN7x20enlOwY9sEfMH2d5", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476655} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:44:17.803000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:44:17.803000+00:00", "date_updated": "2022-11-08T15:44:19.299000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:44:18 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792225784.2629.13990873364570888607@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166792225784.2629.13990873364570888607@smtpgw.close.com>", "<166792225784.2629.12825104744076060180@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "(no subject)", "template_id": null, "template_name": null, "thread_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:44:19.302000", "date_updated": "2022-11-08T15:44:19.302000", "id": "ev_2X9yaM4rWS6PYAYKXIJLvE", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:43:48.819000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:44:05.128000+00:00", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:43:48 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "message_ids": [], "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476657} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "email_followup", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "Test", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-15", "date_created": "2022-11-08T15:44:05.221000+00:00", "date_updated": "2022-11-08T15:44:05.221000+00:00", "email_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "id": "noti_3I4QaKqYel0nzGyKT8mpDKy4q2KKu4IuIZZ3Gb7gs4x", "is_complete": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "(no subject)", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:44:05.222000", "date_updated": "2022-11-08T15:44:05.222000", "id": "ev_0WD1lYbUeo9VuQTYPDouca", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/"}, "object_id": "noti_3I4QaKqYel0nzGyKT8mpDKy4q2KKu4IuIZZ3Gb7gs4x", "object_type": "task.email_followup", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_07war6cU7ByuIulpwNIPeQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476659} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:44:05.209000", "date_updated": "2022-11-08T15:44:05.209000", "id": "ev_2RFuvzAfVIPZ1dUtPo15x2", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/"}, "object_id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:43:48.820000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.820000+00:00", "date_updated": "2022-11-08T15:43:56.690000+00:00", "email_ids": [], "id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "latest_normalized_subject": "", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "request_id": "req_07war6cU7ByuIulpwNIPeQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476661} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "envelope", "status", "subject", "thread_id"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:43:48.819000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:44:05.128000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:43:48 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "(no subject)", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "(no subject)", "template_id": null, "template_name": null, "thread_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:44:05.130000", "date_updated": "2022-11-08T15:44:05.130000", "id": "ev_2TlB2BgErWjZ6llmdKxaXa", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/"}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:43:56.673000+00:00", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:43:48 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "status": "draft", "subject": "", "thread_id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb"}, "request_id": "req_07war6cU7ByuIulpwNIPeQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476663} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:43:48.820000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.820000+00:00", "date_updated": "2022-11-08T15:44:05.123000+00:00", "email_ids": ["acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs"], "id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "latest_normalized_subject": "(no subject)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:44:05.125000", "date_updated": "2022-11-08T15:44:05.125000", "id": "ev_2KKn22maUvg7Pe6VuNpsfP", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/"}, "object_id": "acti_NK92jfBZlqmHvmGsKMa1rSH4mXfORzm45CG7RycCyMK", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_07war6cU7ByuIulpwNIPeQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476665} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "body_preview", "body_text", "date_updated", "envelope"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:43:48.819000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:43:56.673000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:43:48 -0000", "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "", "template_id": null, "template_name": null, "thread_id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:43:53.106000", "date_updated": "2022-11-08T15:43:56.675000", "id": "ev_31fDLDT9NAMsDbfKA4t9AD", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs/"}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "", "body_preview": null, "body_text": "", "date_updated": "2022-11-08T15:43:48.829000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "thedarkknight@close.com", "name": ""}]}}, "request_id": "req_5Lw6YbQtfyezIRyLSV9k0r", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476667} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:43:48.819000+00:00", "attachments": [], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.819000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:43:48.829000+00:00", "direction": "outgoing", "email_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "subject": "", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "", "template_id": null, "template_name": null, "thread_id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:43:48.830000", "date_updated": "2022-11-08T15:43:48.830000", "id": "ev_3mOuL7jTg3W0xO08QBUvVR", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_58Zsdur3Exl0VRTtSmM34r", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476669} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:43:48.820000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:43:48.820000+00:00", "date_updated": "2022-11-08T15:43:48.825000+00:00", "email_ids": ["acti_tDbd3J7HQmX2I5dBWJSXrlwCdKpZedpsTdAWLsYPzUs"], "id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "latest_normalized_subject": "", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:43:48.827000", "date_updated": "2022-11-08T15:43:48.827000", "id": "ev_1sWbGK8i6vpG582tIQY86p", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_FFWbMYg4t16GpjPuV00vPq8m8ut9kuFQ0hdv8B2fNfb", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_58Zsdur3Exl0VRTtSmM34r", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476671} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:43:38.471000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:13:05.125000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:15:47.492000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "85.209.47.207", "opened_at": "2022-11-08T15:43:38.471000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:43:38.473000", "date_updated": "2022-11-08T15:43:38.473000", "id": "ev_3B3yLrq03kYrVDu3vi2A54", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:15:47.492000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:13:05.125000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:15:47.492000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_7fp1fPs0ACR0fWRg6BPEDc", "user_id": null}, "emitted_at": 1670413476673} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_created", "date_updated", "emails"], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "cleared_followups": [], "contact_id": null, "created_by": null, "created_by_name": null, "date": "2022-11-08T15:21:52+00:00", "date_created": "2022-11-08T15:21:52+00:00", "date_updated": "2022-11-08T15:22:03.794000+00:00", "emails": ["acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs"], "id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "is_complete": false, "is_new": true, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "lead_name": "Bluth Company (Example\u00a0Lead)", "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Delivery Status Notification (Failure)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-08T15:22:03.800000", "date_updated": "2022-11-08T15:22:03.800000", "id": "ev_5nMmIRc78B6kog8eZzFkQ4", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-08T12:58:48+00:00", "date_created": "2022-11-08T12:58:48+00:00", "date_updated": "2022-11-08T13:00:58.979000+00:00", "emails": ["acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr"]}, "request_id": null, "user_id": null}, "emitted_at": 1670413476675} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "bluth@close.com", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:50.524698", "date_updated": "2022-11-08T15:22:03.707426", "id": "sub_77gWyXwSd44zuQaciQYW0O", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": "2022-11-08T15:21:48.934327", "updated_by_id": null}, "date_created": "2022-11-08T15:22:03.707000", "date_updated": "2022-11-08T15:22:03.707000", "id": "ev_0jV0BLvTPq4fTMqu4pjkg9", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_77gWyXwSd44zuQaciQYW0O", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:21:49.382953", "paused_by_activity_id": null, "status": "active", "status_reason": null}, "request_id": null, "user_id": null}, "emitted_at": 1670413476677} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "paused_by_activity_id", "status", "status_reason", "updated_by_id"], "data": {"calls_assigned_to": [], "contact_email": "bluth@close.com", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:08.800188", "date_updated": "2022-11-08T15:22:03.703891", "id": "sub_5AqfaB02KqNgXDUU2wQKy5", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "error", "status_reason": "email-bounced", "step_last_processed_at": null, "updated_by_id": null}, "date_created": "2022-11-08T15:22:03.703000", "date_updated": "2022-11-08T15:22:03.703000", "id": "ev_0fFdR50oYPzG8gy6UTQsnC", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_5AqfaB02KqNgXDUU2wQKy5", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:09.356667", "paused_by_activity_id": null, "status": "active", "status_reason": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413476679} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T15:22:03.592000", "date_updated": "2022-11-08T15:22:03.592000", "id": "ev_5HaE00asA8vRHs4HaoYZ6u", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:21:48.935000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:48.935000+00:00", "date_updated": "2022-11-08T15:21:52.162000+00:00", "email_ids": ["acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp"], "id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "latest_normalized_subject": "Bluth Company (Example Lead) + Airbyte", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "request_id": null, "user_id": null}, "emitted_at": 1670413476681} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:21:52.001000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:21:52.001000+00:00", "date_updated": "2022-11-08T15:22:03.526000+00:00", "email_ids": ["acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:22:03.530000", "date_updated": "2022-11-08T15:22:03.530000", "id": "ev_6Y98N12NB2k0WRf4qkxTYD", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:58:48.001000+00:00", "date_created": "2022-11-08T12:58:48.001000+00:00", "date_updated": "2022-11-08T13:00:58.808000+00:00", "latest_normalized_subject": "Delivery Status Notification (Failure)", "n_emails": 2, "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413476683} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:52+00:00", "attachments": [{"content_id": "", "content_type": "image/png", "filename": "icon.png", "size": 1450}], "bcc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Bluth Company (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 15:21:50 +0000
\nTo: Gob Bluth <bluth@close.com>
\n
\nHi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
\"\"

", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "body_text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Bluth Company (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 15:21:50 +0000\nTo: Gob Bluth \n\nHi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:52+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:22:03.515000+00:00", "direction": "incoming", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 07:21:52 -0800 (PST)", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "in_reply_to": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "is_autoreply": true, "message_id": "<636a7410.630a0220.27b8e.b6e2.GMR@mx.google.com>", "reply_to": [], "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "subject": "Delivery Status Notification (Failure)", "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<636a7410.630a0220.27b8e.b6e2.GMR@mx.google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": ["<166792090941.10645.8722656406065573871@smtpgw.close.com>", "<166792090941.10645.3407832652098417673@smtpgw.close.com>"], "send_as_id": null, "send_attempts": [], "sender": "Mail Delivery Subsystem ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Delivery Status Notification (Failure)", "template_id": null, "template_name": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["iryna.grankova@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:22:03.518000", "date_updated": "2022-11-08T15:22:03.518000", "id": "ev_2boNBcUFHdfrarXojiPqsJ", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_GL7cU90GDGioV1bSbUHirloT9mzJecTpY4dIug4BlDs", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413476685} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "thread_id"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:48.934000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.243000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:21:48.934000+00:00", "date_updated": "2022-11-08T15:22:03.271000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792090941.10645.3407832652098417673@smtpgw.close.com>", "<166792090941.10645.8722656406065573871@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T15:21:52.108000+00:00", "opened_by": "Gob Bluth ", "user_agent": "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"}], "opens_summary": "Opened by Gob Bluth (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "sent", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["Gob Bluth "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:22:03.288000", "date_updated": "2022-11-08T15:22:03.288000", "id": "ev_3Yz3aoWtnyJdPTiFwzXC6f", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:21:52.108000+00:00", "thread_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr"}, "request_id": null, "user_id": null}, "emitted_at": 1670413476686} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:48.934000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.243000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:21:48.934000+00:00", "date_updated": "2022-11-08T15:21:52.108000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792090941.10645.3407832652098417673@smtpgw.close.com>", "<166792090941.10645.8722656406065573871@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.23", "opened_at": "2022-11-08T15:21:52.108000+00:00", "opened_by": "Gob Bluth ", "user_agent": "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"}], "opens_summary": "Opened by Gob Bluth (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "sent", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "to": ["Gob Bluth "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:21:52.110000", "date_updated": "2022-11-08T15:21:52.110000", "id": "ev_42cUkCSxWlHBegtxkXmDY4", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"request_method": "GET", "request_path": "/t/AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp/DIwaIsCbZM.png"}, "object_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:21:50.827000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_4OapVGddsfUPHCXMmrO7lJ", "user_id": null}, "emitted_at": 1670413476689} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_completed", "date_sent", "date_updated", "message_id", "status"], "data": {"created_by": null, "date_completed": "2022-11-08T15:21:48.934327", "date_created": "2022-11-08T15:21:48.934327", "date_sent": "2022-11-08T15:21:48.934327", "date_updated": "2022-11-08T15:21:50.971527", "email_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "id": "subhis_0fPYvvoq8fe1rMK6vgipeb", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "completed", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T15:21:50.971000", "date_updated": "2022-11-08T15:21:50.971000", "id": "ev_33L4KM1hTTcrC6cqZedbYl", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "subhis_0fPYvvoq8fe1rMK6vgipeb", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_completed": null, "date_sent": null, "date_updated": "2022-11-08T15:21:49.397029", "message_id": null, "status": "pending"}, "request_id": null, "user_id": null}, "emitted_at": 1670413476691} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "updated_by", "updated_by_name"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:21:48.935000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:48.935000+00:00", "date_updated": "2022-11-08T15:21:50.867000+00:00", "email_ids": ["acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp"], "id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "latest_normalized_subject": "Bluth Company (Example Lead) + Airbyte", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:21:50.869000", "date_updated": "2022-11-08T15:21:50.869000", "id": "ev_6dC4NjbHyUs8uijXycqM2P", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:21:49.244000+00:00", "date_created": "2022-11-08T15:21:49.244000+00:00", "date_updated": "2022-11-08T15:21:49.249000+00:00", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476693} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status", "updated_by", "updated_by_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:48.934000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.243000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:21:48.934000+00:00", "date_updated": "2022-11-08T15:21:50.827000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792090941.10645.3407832652098417673@smtpgw.close.com>", "<166792090941.10645.8722656406065573871@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "sent", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "to": ["Gob Bluth "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:21:50.830000", "date_updated": "2022-11-08T15:21:50.830000", "id": "ev_6ZKu4fkiG7shAfHVuOZfvl", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:21:49.243000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:21:49.253000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "message_ids": [], "status": "outbox", "updated_by": null, "updated_by_name": null}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476694} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:48.934000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.243000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:21:48.934000+00:00", "date_updated": "2022-11-08T15:21:50.827000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 15:21:50 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166792090941.10645.3407832652098417673@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166792090941.10645.3407832652098417673@smtpgw.close.com>", "<166792090941.10645.8722656406065573871@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sequence_name": "Sequence 1", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "sent", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "to": ["Gob Bluth "], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:21:50.830000", "date_updated": "2022-11-08T15:21:50.830000", "id": "ev_3yKP5Q6KrToTXflME75aRD", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476696} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": null, "date_completed": null, "date_created": "2022-11-08T15:21:48.934327", "date_sent": null, "date_updated": "2022-11-08T15:21:49.397029", "email_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "id": "subhis_0fPYvvoq8fe1rMK6vgipeb", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "sequence_subscription_id": "sub_77gWyXwSd44zuQaciQYW0O", "status": "pending", "step_id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "updated_by": null}, "date_created": "2022-11-08T15:21:49.397000", "date_updated": "2022-11-08T15:21:49.397000", "id": "ev_2etmSeQuZpaUV8V1OnTweX", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "subhis_0fPYvvoq8fe1rMK6vgipeb", "object_type": "subscription_history", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413476698} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "step_last_processed_at", "updated_by_id"], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "bluth@close.com", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:50.524698", "date_updated": "2022-11-08T15:21:49.382953", "id": "sub_77gWyXwSd44zuQaciQYW0O", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": "2022-11-08T15:21:48.934327", "updated_by_id": null}, "date_created": "2022-11-08T15:21:49.382000", "date_updated": "2022-11-08T15:21:49.382000", "id": "ev_6njYIP9SC1ESh1zws71FGo", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "sub_77gWyXwSd44zuQaciQYW0O", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:50.758735", "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "request_id": null, "user_id": null}, "emitted_at": 1670413476700} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T15:21:49.243000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

I'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth Company (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show y", "body_text": "Hi Gob, \n \nI'm Jean with Airbyte. We help companies in the Real estate space [INSERT YOUR\nPRODUCT/SERVICE]. I wanted to learn how you handle this currently at Bluth\nCompany (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.243000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:21:49.253000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "to": [{"email": "bluth@close.com", "name": "Gob Bluth"}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Bluth Company (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "to": ["Gob Bluth "], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:21:49.254000", "date_updated": "2022-11-08T15:21:49.254000", "id": "ev_1DdXK7xTfNtejbRklExPpc", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413476702} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T15:21:49.244000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T15:21:49.244000+00:00", "date_updated": "2022-11-08T15:21:49.249000+00:00", "email_ids": ["acti_AiN0xVV0ZqsaXF2lowGGjtav6fPvWMVvuqCd5ihHLtp"], "id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "latest_normalized_subject": "Bluth Company (Example Lead) + Airbyte", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T15:21:49.251000", "date_updated": "2022-11-08T15:21:49.251000", "id": "ev_4fAEQvJepup3MlUagH8SnE", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_rmjK1wsSPo2zOD3d8x5mniRj1rOJb2ybMwz9qwOj8Vr", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413476704} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date", "date_updated", "due_date", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-15", "date_created": "2022-11-08T12:25:32.733000+00:00", "date_updated": "2022-11-08T15:18:00.018000+00:00", "due_date": "2022-11-15", "id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:18:00.020000", "date_updated": "2022-11-08T15:18:00.020000", "id": "ev_6ZvaXMIWjdiYVjVJ0OEIXh", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date": "2022-11-08", "date_updated": "2022-11-08T12:25:32.733000+00:00", "due_date": "2022-11-08", "view": "inbox"}, "request_id": "req_2r7jYXmWGpb5nK5lwfRV7T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476706} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:15:47.492000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:13:05.125000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:15:47.492000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:15:47.494000", "date_updated": "2022-11-08T15:15:47.494000", "id": "ev_5xK2sMEXL0quzrJjXnodn4", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:13:05.125000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:13:05.125000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_7i07j5tiA62KgOHMQfNTPo", "user_id": null}, "emitted_at": 1670413476708} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-19T09:00:00+00:00", "date_created": "2022-11-08T15:13:22.159000+00:00", "date_updated": "2022-11-08T15:13:22.159000+00:00", "due_date": "2022-11-19T09:00:00+00:00", "id": "task_pIYI4An2qA84qea5mCLggCL0dZ8QIk2c2YrzoqSV8fd", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:13:22.161000", "date_updated": "2022-11-08T15:13:22.161000", "id": "ev_3shWck6eJBVicnBNEhiSh5", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_pIYI4An2qA84qea5mCLggCL0dZ8QIk2c2YrzoqSV8fd", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4BUFf4bTplOJxgJJJ1fREn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476710} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30T08:00:00+00:00", "date_created": "2022-11-08T15:13:13.470000+00:00", "date_updated": "2022-11-08T15:13:13.470000+00:00", "due_date": "2022-11-30T08:00:00+00:00", "id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T15:13:13.472000", "date_updated": "2022-11-08T15:13:13.472000", "id": "ev_5tuyPgUd4HLapGag104bvZ", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_hMgl18LN4kAUM7XWO4fYlu3amtKadZahsb7OV9J5qWD", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0tqFWFUvCDMpqiL845siLU", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476712} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:13:05.125000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:13:05.125000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:13:05.127000", "date_updated": "2022-11-08T15:13:05.127000", "id": "ev_57MqFYNkZC33TY1qHEZbKL", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:30.843000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_7A1xOq9i9rIfqgTQLwod17", "user_id": null}, "emitted_at": 1670413476714} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08T08:00:00+00:00", "date_created": "2022-11-08T15:10:57.220000+00:00", "date_updated": "2022-11-08T15:10:57.220000+00:00", "due_date": "2022-11-08T08:00:00+00:00", "id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-08T15:10:57.222000", "date_updated": "2022-11-08T15:10:57.222000", "id": "ev_6XIHY7y0JACzRvTtmxrLrh", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_Wgzt6t0ZGRlvZTnfhSfxHoFRWm6zXBMuuecKxRkfYmZ", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_13kN23IfqKXwvcbw2Ed0XE", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476716} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:10:30.843000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:10:30.843000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:10:30.844000", "date_updated": "2022-11-08T15:10:30.844000", "id": "ev_2M7LEG1NwZcYwYXzOAXNGE", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:07:41.553000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_0JKwLUXZgrsKj4uwE2ADw9", "user_id": null}, "emitted_at": 1670413476718} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"action_type": "subscribe", "calls_assigned_to": [], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:10:17.831000+00:00", "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "n_leads": 11, "n_leads_processed": 11, "n_objects": 11, "n_objects_processed": 11, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:17.910000", "date_updated": "2022-11-08T15:10:17.910000", "id": "ev_7LS7sHd8TLLsTmhB5c5ZXR", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476720} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed", "status"], "data": {"action_type": "subscribe", "calls_assigned_to": [], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:10:17.831000+00:00", "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "n_leads": 11, "n_leads_processed": 11, "n_objects": 11, "n_objects_processed": 11, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:13.013000", "date_updated": "2022-11-08T15:10:17.910000", "id": "ev_2sxuQoPLclCM4yT2SKDrRu", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:11.632000+00:00", "n_leads_processed": 5, "n_objects_processed": 5, "status": "processing"}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476722} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "thedarkknight@close.com", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:15.902085", "date_updated": "2022-11-08T15:10:15.902088", "id": "sub_7mCfXm4Y3eZajJp0rkjwFU", "initial_email_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:15.902000", "date_updated": "2022-11-08T15:10:15.902000", "id": "ev_7M8t0OtblxNHoDfmSS0YYt", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_7mCfXm4Y3eZajJp0rkjwFU", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476724} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:14.589854", "date_updated": "2022-11-08T15:10:14.589857", "id": "sub_3AChiei0PuAIJ1X0OWnWNR", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:14.589000", "date_updated": "2022-11-08T15:10:14.589000", "id": "ev_5dApKOJ2XXyM97aO2fmvq7", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_3AChiei0PuAIJ1X0OWnWNR", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476726} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:12.582772", "date_updated": "2022-11-08T15:10:12.582778", "id": "sub_7Zv78mWCJuul1Ipd4EDE32", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:12.582000", "date_updated": "2022-11-08T15:10:12.582000", "id": "ev_1Be2WlW0FpNRrnftW4JJU4", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_7Zv78mWCJuul1Ipd4EDE32", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476728} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed"], "data": {"action_type": "subscribe", "calls_assigned_to": [], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:10:11.632000+00:00", "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "n_leads": 11, "n_leads_processed": 5, "n_objects": 11, "n_objects_processed": 5, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sort": [], "status": "processing", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:07.134000", "date_updated": "2022-11-08T15:10:11.637000", "id": "ev_7X2R0NZC1ThFI9h9Ktfd9o", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:10:05.687000+00:00", "n_leads_processed": 0, "n_objects_processed": 0}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476729} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "tobiasfunke@close.com", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:11.239696", "date_updated": "2022-11-08T15:10:11.239699", "id": "sub_1rgSspOohLocAaucazbFbB", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:11.239000", "date_updated": "2022-11-08T15:10:11.239000", "id": "ev_5qEaXgcdkVYz6WgtUxRGB4", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_1rgSspOohLocAaucazbFbB", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476731} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:10.011072", "date_updated": "2022-11-08T15:10:10.011075", "id": "sub_3J812U6VNcZBmBDEJ1iIdX", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:10.011000", "date_updated": "2022-11-08T15:10:10.011000", "id": "ev_5kggxeS0mhEwZtk4t82jFk", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_3J812U6VNcZBmBDEJ1iIdX", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476733} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "bluth@close.com", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:08.800188", "date_updated": "2022-11-08T15:10:08.800191", "id": "sub_5AqfaB02KqNgXDUU2wQKy5", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:08.800000", "date_updated": "2022-11-08T15:10:08.800000", "id": "ev_3rsTwUe7MG9vyp1ub6YN1u", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_5AqfaB02KqNgXDUU2wQKy5", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476735} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": [], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:10:06.399661", "date_updated": "2022-11-08T15:10:06.399664", "id": "sub_174GiA85Ui8g1OuQUrzdWe", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:06.399000", "date_updated": "2022-11-08T15:10:06.399000", "id": "ev_2uGgGxSL1uQXakASGMhluo", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "sub_174GiA85Ui8g1OuQUrzdWe", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476737} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads", "n_objects", "status"], "data": {"action_type": "subscribe", "calls_assigned_to": [], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:10:04.414000+00:00", "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "n_leads": 11, "n_leads_processed": 0, "n_objects": 11, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sort": [], "status": "processing", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:10:03.745000", "date_updated": "2022-11-08T15:10:04.834000", "id": "ev_7cDNgKSP8uGKvGc99O4EP2", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv"}, "object_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:57.014000+00:00", "n_leads": null, "n_objects": null, "status": "created"}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413476739} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"action_type": "subscribe", "calls_assigned_to": [], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:09:57.014000+00:00", "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "n_leads": null, "n_leads_processed": 0, "n_objects": null, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "sender_email": "integration-test@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "sort": [], "status": "created", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:57.018000", "date_updated": "2022-11-08T15:09:57.018000", "id": "ev_0udMKySXkGEqPxZ2VG7sEN", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/bulk_action/sequence_subscription/"}, "object_id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6oetFfxqmRAE3Ws0pOTmpn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477471} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"action_type": "subscribe", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:55.730000+00:00", "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "n_leads": 11, "n_leads_processed": 11, "n_objects": 11, "n_objects_processed": 11, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:55.802000", "date_updated": "2022-11-08T15:09:55.802000", "id": "ev_1Ym9tfaxulgCVHCvbD5tnV", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477473} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed", "status"], "data": {"action_type": "subscribe", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:55.730000+00:00", "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "n_leads": 11, "n_leads_processed": 11, "n_objects": 11, "n_objects_processed": 11, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sort": [], "status": "done", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:50.829000", "date_updated": "2022-11-08T15:09:55.802000", "id": "ev_1EIvJzlE0XIe19xJq5gvDZ", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:49.713000+00:00", "n_leads_processed": 4, "n_objects_processed": 4, "status": "processing"}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477475} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "support@close.com", "contact_id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:53.882456", "date_updated": "2022-11-08T15:09:53.882460", "id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:53.882000", "date_updated": "2022-11-08T15:09:53.882000", "id": "ev_1gaaBxohgeyiOxNHmw7unV", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_1HBbWm3EXb2OtQYHjjIJ7d", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477477} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "success@close.com", "contact_id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:52.688271", "date_updated": "2022-11-08T15:09:52.688278", "id": "sub_06TCoNKHiRvgz5eajOG5iM", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:52.688000", "date_updated": "2022-11-08T15:09:52.688000", "id": "ev_09gKWdVdrDiTgyU6TGRTUr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_06TCoNKHiRvgz5eajOG5iM", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477479} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "bluth@close.com", "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:50.524698", "date_updated": "2022-11-08T15:09:50.524702", "id": "sub_77gWyXwSd44zuQaciQYW0O", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:50.524000", "date_updated": "2022-11-08T15:09:50.524000", "id": "ev_4orXRsAWg7PouDrGzfmRbt", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_77gWyXwSd44zuQaciQYW0O", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477481} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed"], "data": {"action_type": "subscribe", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:49.713000+00:00", "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "n_leads": 11, "n_leads_processed": 4, "n_objects": 11, "n_objects_processed": 4, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sort": [], "status": "processing", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:44.802000", "date_updated": "2022-11-08T15:09:49.721000", "id": "ev_0BOx3l2bjoquFlb1IxHk5w", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:44.215000+00:00", "n_leads_processed": 0, "n_objects_processed": 0}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477483} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "tobiasfunke@close.com", "contact_id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:49.320380", "date_updated": "2022-11-08T15:09:49.320385", "id": "sub_55pcJcrKsTL3fUX3ZJ3rw1", "initial_email_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:49.320000", "date_updated": "2022-11-08T15:09:49.320000", "id": "ev_42BnSJVHXYggwK7Ot2wtF8", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_55pcJcrKsTL3fUX3ZJ3rw1", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477485} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "nick@close.com", "contact_id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:47.911844", "date_updated": "2022-11-08T15:09:47.911849", "id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:47.911000", "date_updated": "2022-11-08T15:09:47.911000", "id": "ev_1C0t1eFe4XVTaV0qyuNLG8", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_1Ptn4uOWoiCVDsJGVdciWx", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477487} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "thedarkknight@close.com", "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:46.583319", "date_updated": "2022-11-08T15:09:46.583326", "id": "sub_5MuKAZDXfR1pHQL0xGBUp3", "initial_email_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:46.583000", "date_updated": "2022-11-08T15:09:46.583000", "id": "ev_1Y5UjmxSCkQn2h0b8nZJ1j", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_5MuKAZDXfR1pHQL0xGBUp3", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477489} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_email": "sales@close.com", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:43.734431", "date_updated": "2022-11-08T15:09:43.734437", "id": "sub_5kEnI9yY80Y9mjetrZqrxn", "initial_email_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "paused_by_activity_id": null, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "start_date": null, "status": "active", "status_reason": null, "step_last_processed_at": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:43.734000", "date_updated": "2022-11-08T15:09:43.734000", "id": "ev_7BqQdEsZYUUFlB73YeIZ8V", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "sub_5kEnI9yY80Y9mjetrZqrxn", "object_type": "sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477491} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads", "n_objects", "status"], "data": {"action_type": "subscribe", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:42.917000+00:00", "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "n_leads": 11, "n_leads_processed": 0, "n_objects": 11, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sort": [], "status": "processing", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:41.928000", "date_updated": "2022-11-08T15:09:43.016000", "id": "ev_5fvCSQgxUaXQhxGkUAwCoz", "lead_id": null, "meta": {"bulk_action_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw"}, "object_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:09:38.582000+00:00", "n_leads": null, "n_objects": null, "status": "created"}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477492} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"action_type": "subscribe", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "contact_preference": "contact", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:38.582000+00:00", "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "n_leads": null, "n_leads_processed": 0, "n_objects": null, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "results_limit": null, "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "send_done_email": true, "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender_email": "iryna.grankova@airbyte.io", "sender_name": "Jean Lafleur", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "sort": [], "status": "created", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T15:09:38.584000", "date_updated": "2022-11-08T15:09:38.584000", "id": "ev_7kyi9kOFS3o5bTkg9A7fww", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/bulk_action/sequence_subscription/"}, "object_id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "object_type": "bulk_action.sequence_subscription", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6Lcef9pLs4TgObjFtctqpW", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477494} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:07:41.553000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:07:41.553000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:07:41.557000", "date_updated": "2022-11-08T15:07:41.557000", "id": "ev_6yaiLBhv81qkOzoW0WCYaR", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:00:34.029000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_4PdcK5fCQSTyRevhKk3VKq", "user_id": null}, "emitted_at": 1670413477496} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "note"], "data": {"_type": "Call", "activity_at": "2022-11-08T15:02:48.288000+00:00", "call_method": "external", "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:02:48.288000+00:00", "date_updated": "2022-11-08T15:02:54.131000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "Test call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "External", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:02:52.665000", "date_updated": "2022-11-08T15:02:54.132000", "id": "ev_0k2jgHzfPgNpDY2ActdsDc", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/call/acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj/"}, "object_id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:02:48.288000+00:00", "note": ""}, "request_id": "req_2Xj9xLqj04GloAU6Oe8ZGD", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477498} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:53.603000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:02:53.603000+00:00", "date_updated": "2022-11-08T15:02:53.603000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:02:53.607000", "date_updated": "2022-11-08T15:02:53.607000", "id": "ev_6HoSRXyEgxIZ4vIQiqWBP7", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:02:35.118000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:02:52.946000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477500} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:53.603000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:02:53.603000+00:00", "date_updated": "2022-11-08T15:02:53.603000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:02:53.607000", "date_updated": "2022-11-08T15:02:53.607000", "id": "ev_63FMKPP1M3XWyoXXmzNlkm", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477502} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:35.118000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:02:52.946000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:02:52.949000", "date_updated": "2022-11-08T15:02:52.949000", "id": "ev_3VXHqQEiBuu56FZu9C8jb0", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T15:02:39.799000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413477504} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Call", "activity_at": "2022-11-08T15:02:48.288000+00:00", "call_method": "external", "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_answered": null, "date_created": "2022-11-08T15:02:48.288000+00:00", "date_updated": "2022-11-08T15:02:48.288000+00:00", "dialer_id": null, "dialer_saved_search_id": null, "direction": "outbound", "disposition": "answered", "duration": 0, "forwarded_to": null, "has_recording": false, "id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "is_forwarded": false, "is_joinable": false, "is_to_group_number": false, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "", "local_phone": null, "local_phone_formatted": null, "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phone": "+14156236785", "quality_info": "", "recording_expires_at": null, "recording_url": null, "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "sequence_id": null, "sequence_subscription_id": null, "source": "External", "status": "completed", "transferred_from": null, "transferred_from_user_id": null, "transferred_to": null, "transferred_to_user_id": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": [], "voicemail_duration": 0, "voicemail_url": null}, "date_created": "2022-11-08T15:02:48.291000", "date_updated": "2022-11-08T15:02:48.291000", "id": "ev_2F5QyCCruG9X2puqrqSyr3", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/call/"}, "object_id": "acti_UP1u6YW6eZkO2PP1M4YdPEu78ba2Rv73vmF3GJzVcgj", "object_type": "activity.call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0YsbOAuPqkBJpbvKesefzX", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477506} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:35.118000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:02:39.799000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "test", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:02:37.195000", "date_updated": "2022-11-08T15:02:39.801000", "id": "ev_0qPE9XQ1nY0hEy5PqZWOBf", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM/"}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:02:35.118000+00:00", "status": "draft", "text": ""}, "request_id": "req_28VFH6WJHh5B37xXB8mMfa", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477508} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:02:35.118000+00:00", "attachments": [], "contact_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:02:35.118000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:02:35.118000+00:00", "direction": "outbound", "error_message": null, "id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:02:35.120000", "date_updated": "2022-11-08T15:02:35.120000", "id": "ev_5GuLHp3hBgZ9vbg0hvmRJN", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_9ccs9ErF3uKKXdV9QXJ8Y54bnrQFMOWozWH1MBPWxcM", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_56VPAsZfhsR9qZ6RQhg8bn", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477510} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "phones", "title"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:39:18.105000+00:00", "date_updated": "2022-11-08T15:02:31.847000+00:00", "emails": [], "id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "Test Lead 3", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "Test lead", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:02:31.849000", "date_updated": "2022-11-08T15:02:31.849000", "id": "ev_7Gt8KXXVueejZX1oSuR4n2", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih/"}, "object_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:39:18.105000+00:00", "phones": [], "title": ""}, "request_id": "req_73FVrs6YjrHOvPe8rIVYJG", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477512} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:55.510000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:55.510000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:01:55.510000+00:00", "direction": "outbound", "error_message": null, "id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:55.512000", "date_updated": "2022-11-08T15:01:55.512000", "id": "ev_66XN7cer1DLVo98YOFiIap", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_87utjiO1VZBwuxKNThrsWehpMHQJ9fk9yYPqDze4w9x", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6nSlV0L7aBpCE9enFUPYCi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477514} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:40.416000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:20.794000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:01:40.416000+00:00", "date_updated": "2022-11-08T15:01:40.416000+00:00", "direction": "outbound", "error_message": null, "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:40.424000", "date_updated": "2022-11-08T15:01:40.424000", "id": "ev_5Ig4TPq0eNTBYSNqT2PUW7", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T15:01:20.794000+00:00", "date_sent": null, "date_updated": "2022-11-08T15:01:39.677000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477515} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:40.416000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:20.794000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T15:01:40.416000+00:00", "date_updated": "2022-11-08T15:01:40.416000+00:00", "direction": "outbound", "error_message": null, "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:40.424000", "date_updated": "2022-11-08T15:01:40.424000", "id": "ev_3TB1d8KVpLTVuqu9EvEgYr", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477517} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:20.794000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:20.794000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:01:39.677000+00:00", "direction": "outbound", "error_message": null, "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:39.680000", "date_updated": "2022-11-08T15:01:39.680000", "id": "ev_6mV3wGb9Rg42nDr573YVgq", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T15:01:27.188000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413477519} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:20.794000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:20.794000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:01:27.188000+00:00", "direction": "outbound", "error_message": null, "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:22.918000", "date_updated": "2022-11-08T15:01:27.189000", "id": "ev_05S1GRN57LaIxQPtA6h2qf", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau/"}, "object_id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:01:20.794000+00:00", "status": "draft", "text": ""}, "request_id": "req_5WsnrviVBixeKSvBRFUNhx", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477521} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T15:01:20.794000+00:00", "attachments": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T15:01:20.794000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T15:01:20.794000+00:00", "direction": "outbound", "error_message": null, "id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+14156236785", "remote_phone_formatted": "+1 415-623-6785", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T15:01:20.796000", "date_updated": "2022-11-08T15:01:20.796000", "id": "ev_0KLEduJAMuvaPvN2wrJxWW", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_LJip5gktnzD3bWZlPsUVfvGQAu4Aij5AZVIWLoi0gau", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_529JeDbVhTjwVSWY7sHJ0q", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477523} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "phones"], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker", "Point of Contact"], "date_created": "2021-07-13T11:39:04.977000+00:00", "date_updated": "2022-11-08T15:01:17.915000+00:00", "emails": [{"email": "thedarkknight@close.com", "type": "office"}], "id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "name": "Bruce Wayne", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [{"phone": "+14156236785", "phone_formatted": "+1 415-623-6785", "type": "office"}], "title": "The Dark Knight", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T15:01:17.917000", "date_updated": "2022-11-08T15:01:17.917000", "id": "ev_4gsM7oqZ4bg47VS78E9Q1L", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/contact/cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6/"}, "object_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2021-07-13T11:39:04.977000+00:00", "phones": []}, "request_id": "req_0TLhH1od1yjEyr7A3MtSZq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477525} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:00:34.029000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:34.029000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:00:34.031000", "date_updated": "2022-11-08T15:00:34.031000", "id": "ev_4CwkEwQDIit6ZvRjWxlpVv", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T15:00:24.078000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}]}, "request_id": "req_1YAwKAWaIrSfRgG8L420rU", "user_id": null}, "emitted_at": 1670413477527} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T15:00:24.078000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T15:00:24.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5+ times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T15:00:24.079000", "date_updated": "2022-11-08T15:00:24.079000", "id": "ev_1UG4Fvdu7LRJg68NBYrHHT", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:59:28.676000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5 times, latest 2022-11-08)"}, "request_id": "req_1nvJHiEyGkPSQNX9CtXjmm", "user_id": null}, "emitted_at": 1670413477529} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T14:59:28.676000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:28.676000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (5 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T14:59:28.678000", "date_updated": "2022-11-08T14:59:28.678000", "id": "ev_10boG4heOXwC0CbtkLhqe8", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:59:10.078000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (4 times, latest 2022-11-08)"}, "request_id": "req_2LZ6zxgfXnOZWjCcgGXwgC", "user_id": null}, "emitted_at": 1670413477531} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T14:59:10.078000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:10.078000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (4 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T14:59:10.079000", "date_updated": "2022-11-08T14:59:10.079000", "id": "ev_3QzQHJcJS6PUyOkb8o9ztX", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:59:00.139000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (3 times, latest 2022-11-08)"}, "request_id": "req_1k0cssmaYjMNGdI3HZq3rL", "user_id": null}, "emitted_at": 1670413477533} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T14:59:00.139000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:59:00.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (3 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T14:59:00.141000", "date_updated": "2022-11-08T14:59:00.141000", "id": "ev_03k1apuypTuSAwdGVfiGUQ", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:48:01.421000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (2 times, latest 2022-11-08)"}, "request_id": "req_2jxrR41E041b7WITFgyTnC", "user_id": null}, "emitted_at": 1670413477535} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T14:48:01.421000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}, {"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:48:01.421000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (2 times, latest 2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T14:48:01.423000", "date_updated": "2022-11-08T14:48:01.423000", "id": "ev_3AErSa8QMe4549Fo9Vkt1o", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T14:25:56.139000+00:00", "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (2022-11-08)"}, "request_id": "req_2Jdhg9WvPxzh1NyQtOUJoi", "user_id": null}, "emitted_at": 1670413477537} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["hangup_recording_url"], "data": {"country": "US", "default_caller_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "hangup_recording_url": "https://closeio-hangup-recordings.s3.amazonaws.com/7CIYcVuunXA1lxoF4jYEzE/voicemail.mp3", "id": "memb_HETbVNHM1DQq9NgkJkeG6pFNNaLWMRDloahsFzPUVyH", "is_free": false, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions_granted": ["bulk_delete", "bulk_edit", "bulk_email", "bulk_import", "bulk_sequence_subscriptions", "call_coach_barge", "call_coach_listen", "calling", "delete_leads", "delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "export", "manage_customizations", "manage_email_sequences", "manage_group_numbers", "manage_organization", "manage_others_activities", "manage_others_opportunities", "manage_others_tasks", "manage_team_email_templates", "manage_team_smart_views", "merge_leads"], "primary_personal_number": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "record_calls": false, "role": "admin", "role_id": "admin", "track_email_opens": true, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T14:33:02.112000", "date_updated": "2022-11-08T14:33:02.112000", "id": "ev_6acJbJCMxB5oNx3x9YZphV", "lead_id": null, "meta": {"request_method": "PUT", "request_path": "/api/v1/membership/memb_HETbVNHM1DQq9NgkJkeG6pFNNaLWMRDloahsFzPUVyH/"}, "object_id": "memb_HETbVNHM1DQq9NgkJkeG6pFNNaLWMRDloahsFzPUVyH", "object_type": "membership", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"hangup_recording_url": null}, "request_id": "req_4qXgZixdQIjuLApZAzT6px", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477539} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "voicemail_greeting_url"], "data": {"address_id": null, "bundle_id": null, "carrier": "twilio", "country": "US", "date_created": "2022-11-08T12:35:29.464000+00:00", "date_updated": "2022-11-08T14:32:41.736000+00:00", "forward_to": null, "forward_to_enabled": false, "forward_to_formatted": null, "id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "is_group_number": false, "is_verified": false, "label": null, "last_billed_price": "1.15", "mms_enabled": true, "next_billing_on": "2022-12-07", "number": "+14156251293", "number_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "press_1_to_accept": true, "sms_enabled": true, "supports_mms_to_countries": ["CA", "US"], "supports_sms_to_countries": ["CA", "PR", "US"], "type": "internal", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "voicemail_greeting_url": "https://closeio-voicemail-greetings.s3.amazonaws.com/14bzVblrIaekmXSGQEKM11/undefined.mp3"}, "date_created": "2022-11-08T14:32:41.739000", "date_updated": "2022-11-08T14:32:41.739000", "id": "ev_7Dn05g5dJxaxuAfZHrwcir", "lead_id": null, "meta": {"request_method": "PUT", "request_path": "/api/v1/phone_number/phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN/"}, "object_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "object_type": "phone_number", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:35:33.618000+00:00", "voicemail_greeting_url": null}, "request_id": "req_6DL9OuMRpAMmQqNLlfjyhB", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477541} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"accepts_multiple_values": false, "back_reference_is_visible": null, "choices": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T14:27:04.532000+00:00", "date_updated": "2022-11-08T14:27:04.532000+00:00", "description": "Test activity", "editable_with_roles": [], "id": "cf_aea8B3HHCHNaoNIqzpH6HLvYqvlxCbZNZU8OkhkAuuW", "is_shared": false, "name": "Test Actvity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "referenced_custom_type_id": "", "required": false, "type": "datetime", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T14:27:04.534000", "date_updated": "2022-11-08T14:27:04.534000", "id": "ev_1jGS1P6zfWSXwd2lDyv2Ek", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/custom_field/activity/"}, "object_id": "cf_aea8B3HHCHNaoNIqzpH6HLvYqvlxCbZNZU8OkhkAuuW", "object_type": "custom_fields.activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3derTyObZvV4OsJk3uAN3T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477543} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T14:25:56.139000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "185.143.147.236", "opened_at": "2022-11-08T14:25:56.139000+00:00", "opened_by": "thedarkknight@close.com", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"}], "opens_summary": "Opened by thedarkknight@close.com (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T14:25:56.141000", "date_updated": "2022-11-08T14:25:56.141000", "id": "ev_1uP4qB8gyUOfPe3nzbbzWp", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "GET", "request_path": "/t/ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/LKMjsg1Cwf.png"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:56:53.891000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_3SqL4MVrjMq1GiKvvlk5ad", "user_id": null}, "emitted_at": 1670413477545} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "cleared_followups": [], "contact_id": null, "created_by": null, "created_by_name": null, "date": "2022-11-08T12:58:48+00:00", "date_created": "2022-11-08T12:58:48+00:00", "date_updated": "2022-11-08T13:00:58.979000+00:00", "emails": ["acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr"], "id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "is_complete": false, "is_new": true, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "lead_name": "Bluth Company (Example\u00a0Lead)", "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Delivery Status Notification (Failure)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-08T13:00:58.986000", "date_updated": "2022-11-08T13:00:58.986000", "id": "ev_2Y2sCQq2z6AApIveosgq9g", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "noti_9IHsSYqeUsxtZHI3umO2tpFpCCs5lou3KuMsVxmSKMV", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413477547} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:58:48.001000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:48.001000+00:00", "date_updated": "2022-11-08T13:00:58.808000+00:00", "email_ids": ["acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T13:00:58.811000", "date_updated": "2022-11-08T13:00:58.811000", "id": "ev_1RBZrtjsDHmy5rNVfRjBYO", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:58:44.680000+00:00", "date_created": "2022-11-08T12:58:44.680000+00:00", "date_updated": "2022-11-08T12:58:47.596000+00:00", "latest_normalized_subject": "Airbyte Follow-up", "n_emails": 1, "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413477549} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:58:48+00:00", "attachments": [{"content_id": "", "content_type": "image/png", "filename": "icon.png", "size": 1450}], "bcc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Airbyte Follow-up
\nDate: Tue, 08 Nov 2022 12:58:44 +0000
\nTo: bluth@close.com
\n
\nHi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
\"\"

", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer", "body_text": "\n** Address not found **\n\nYour message wasn't delivered to bluth@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Airbyte Follow-up\nDate: Tue, 08 Nov 2022 12:58:44 +0000\nTo: bluth@close.com\n\nHi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T12:58:48+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T13:00:58.801000+00:00", "direction": "incoming", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 04:58:48 -0800 (PST)", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "in_reply_to": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "is_autoreply": true, "message_id": "<636a5288.170a0220.f87e2.10cf.GMR@mx.google.com>", "reply_to": [], "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "subject": "Delivery Status Notification (Failure)", "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<636a5288.170a0220.f87e2.10cf.GMR@mx.google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": ["<166791232468.5302.12366928756676498962@smtpgw.close.com>", "<166791232468.5302.9789676641910298968@smtpgw.close.com>"], "send_as_id": null, "send_attempts": [], "sender": "Mail Delivery Subsystem ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Delivery Status Notification (Failure)", "template_id": null, "template_name": null, "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["iryna.grankova@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T13:00:58.803000", "date_updated": "2022-11-08T13:00:58.803000", "id": "ev_7G4f4nb5yfwcEPGiMQrcK6", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {}, "object_id": "acti_5qMpsIcBXwPqYpI8jAFBBWAKcWCzWkG7J5aUHUlUUpr", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413477551} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "incoming_email", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "cleared_followups": [], "contact_id": null, "created_by": null, "created_by_name": null, "date": "2022-11-08T12:56:55+00:00", "date_created": "2022-11-08T12:56:55+00:00", "date_updated": "2022-11-08T13:00:57.869000+00:00", "emails": ["acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8"], "id": "noti_U722qGVxvXSd1AP7Cs2ygzun3Vm0tmfKOv1dSt2Itw0", "is_complete": false, "is_new": true, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "emailthread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "subject": "Delivery Status Notification (Failure)", "updated_by": null, "updated_by_name": null, "view": null}, "date_created": "2022-11-08T13:00:57.874000", "date_updated": "2022-11-08T13:00:57.874000", "id": "ev_70B5yRmhN2qe6zEnG2SUXr", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "noti_U722qGVxvXSd1AP7Cs2ygzun3Vm0tmfKOv1dSt2Itw0", "object_type": "task.incoming_email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413477553} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated", "latest_normalized_subject", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:56:55.001000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:56:55.001000+00:00", "date_updated": "2022-11-08T13:00:57.707000+00:00", "email_ids": ["acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe"], "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "latest_normalized_subject": "Delivery Status Notification (Failure)", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}, {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T13:00:57.710000", "date_updated": "2022-11-08T13:00:57.710000", "id": "ev_3Yo4PWcHJzT8dbLCSyRiZZ", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:56:52.539000+00:00", "date_created": "2022-11-08T12:56:52.539000+00:00", "date_updated": "2022-11-08T12:56:53.916000+00:00", "latest_normalized_subject": "Wayne Enterprises (Example Lead) + Airbyte", "n_emails": 1, "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413477554} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:55+00:00", "attachments": [{"content_id": "", "content_type": "image/png", "filename": "icon.png", "size": 1450}], "bcc": [], "body_html": "\n\n\n\n\n\n\n\n\n\n
\n\n\n
\n\"Error\n\n\n\n\n

\nAddress not found\n

\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n
\nLEARN MORE\n
\n
\n
\nThe response was:
\n

\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\n

\n
\n\n

\nFrom: Jean Lafleur <iryna.grankova@airbyte.io>
\nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte
\nDate: Tue, 08 Nov 2022 12:56:52 +0000
\nTo: thedarkknight@close.com
\n
\nHi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?\"\"

", "body_preview": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mai", "body_text": "\n** Address not found **\n\nYour message wasn't delivered to thedarkknight@close.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/answer/6596\n\nThe response was:\n\nThe email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596\nFrom: Jean Lafleur \nSubject: Wayne Enterprises (Example\u00a0Lead) + Airbyte\nDate: Tue, 08 Nov 2022 12:56:52 +0000\nTo: thedarkknight@close.com\n\nHi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2022-11-08T12:56:55+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T13:00:57.698000+00:00", "direction": "incoming", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 04:56:55 -0800 (PST)", "from": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "in_reply_to": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "is_autoreply": true, "message_id": "<636a5217.170a0220.675e1.11c0.GMR@mx.google.com>", "reply_to": [], "sender": [{"email": "mailer-daemon@googlemail.com", "name": "Mail Delivery Subsystem"}], "subject": "Delivery Status Notification (Failure)", "to": [{"email": "iryna.grankova@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<636a5217.170a0220.675e1.11c0.GMR@mx.google.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": ["<166791221256.1235.14063741572606059919@smtpgw.close.com>", "<166791221256.1235.11589873218010129427@smtpgw.close.com>"], "send_as_id": null, "send_attempts": [], "sender": "Mail Delivery Subsystem ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "inbox", "subject": "Delivery Status Notification (Failure)", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["iryna.grankova@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T13:00:57.700000", "date_updated": "2022-11-08T13:00:57.700000", "id": "ev_6LLEZCMYH8d4sS0fTaUycm", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_Yc8SKxsCvKYEdmrOElcfbI4TeWAutmDsSG7mmHigzE8", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413477556} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "opens", "opens_summary"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:58:44.679000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "body_text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.579000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:58:44.679000+00:00", "date_updated": "2022-11-08T12:58:47.565000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:58:44 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "bluth@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166791232468.5302.9789676641910298968@smtpgw.close.com>", "<166791232468.5302.12366928756676498962@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [{"ip_address": "66.249.92.10", "opened_at": "2022-11-08T12:58:47.565000+00:00", "opened_by": "bluth@close.com", "user_agent": "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"}], "opens_summary": "Opened by bluth@close.com (2022-11-08)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["bluth@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:58:47.567000", "date_updated": "2022-11-08T12:58:47.567000", "id": "ev_4xALAmBfx7MgOqR9Hi4aVw", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"request_method": "GET", "request_path": "/t/uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x/M0vtraSSWF.png"}, "object_id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:58:46.363000+00:00", "opens": [], "opens_summary": null}, "request_id": "req_4jTaS1Oahxdp5a5kIczhWM", "user_id": null}, "emitted_at": 1670413477558} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"contact_preference": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:58:33.566000+00:00", "date_updated": "2022-11-08T12:58:47.020000+00:00", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "n_leads": 1, "n_leads_processed": 1, "n_objects": 1, "n_objects_processed": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "results_limit": null, "s_query": {"negate": false, "type": "match_all"}, "send_done_email": true, "sender": "Jean Lafleur ", "sort": [], "status": "done", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:58:47.030000", "date_updated": "2022-11-08T12:58:47.030000", "id": "ev_4judlv4UH9RjOadjdc2fr4", "lead_id": null, "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "object_type": "bulk_action.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477560} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads_processed", "n_objects_processed", "status"], "data": {"contact_preference": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:58:33.566000+00:00", "date_updated": "2022-11-08T12:58:47.020000+00:00", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "n_leads": 1, "n_leads_processed": 1, "n_objects": 1, "n_objects_processed": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "results_limit": null, "s_query": {"negate": false, "type": "match_all"}, "send_done_email": true, "sender": "Jean Lafleur ", "sort": [], "status": "done", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:58:47.030000", "date_updated": "2022-11-08T12:58:47.030000", "id": "ev_3C83dxfuzK99pcrjMK14Y9", "lead_id": null, "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "object_type": "bulk_action.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:58:46.548000+00:00", "n_leads_processed": 0, "n_objects_processed": 0, "status": "processing"}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477562} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:58:44.680000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.680000+00:00", "date_updated": "2022-11-08T12:58:46.388000+00:00", "email_ids": ["acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:58:46.389000", "date_updated": "2022-11-08T12:58:46.389000", "id": "ev_7fxWpvBSpgfCyEQlM4Q4jk", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:58:44.580000+00:00", "date_created": "2022-11-08T12:58:44.580000+00:00", "date_updated": "2022-11-08T12:58:44.586000+00:00"}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477564} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "body_preview", "body_text", "date_sent", "date_updated", "envelope", "message_ids", "status"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:58:44.679000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "body_text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.579000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:58:44.679000+00:00", "date_updated": "2022-11-08T12:58:46.363000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:58:44 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "bluth@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166791232468.5302.9789676641910298968@smtpgw.close.com>", "<166791232468.5302.12366928756676498962@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["bluth@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:58:46.365000", "date_updated": "2022-11-08T12:58:46.365000", "id": "ev_7ZNQMsUU91esDNeDZ5vSXH", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:58:44.579000+00:00", "body_preview": "Hi Gob, Friendly follow-up. I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? - Wed @ 11AM - Thur @ 2PM - Fri @ 3P", "body_text": null, "date_sent": null, "date_updated": "2022-11-08T12:58:44.592000+00:00", "envelope": null, "message_ids": [], "status": "draft"}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413477566} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:58:44.679000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur ", "body_text": "Hi Gob, \n \nFriendly follow-up. \n \nI wanted to show you how Airbyte can help you with [INSERT YOUR\nPRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? \n \n\\- Wed @ 11AM \n\\- Thur @ 2PM \n\\- Fri @ 3PM", "bulk_email_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.579000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:58:44.679000+00:00", "date_updated": "2022-11-08T12:58:46.363000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:58:44 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791232468.5302.9789676641910298968@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Airbyte Follow-up", "to": [{"email": "bluth@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": ["<166791232468.5302.9789676641910298968@smtpgw.close.com>", "<166791232468.5302.12366928756676498962@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["bluth@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:58:46.365000", "date_updated": "2022-11-08T12:58:46.365000", "id": "ev_3flLUOo1CMbfmNChFM2uWy", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478250} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:58:44.579000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Gob,

Friendly follow-up.

I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "body_preview": "Hi Gob, Friendly follow-up. I wanted to show you how Airbyte can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week? - Wed @ 11AM - Thur @ 2PM - Fri @ 3P", "body_text": null, "bulk_email_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "cc": [], "contact_id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.579000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:58:44.592000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": null, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "in_reply_to_id": null, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Airbyte Follow-up", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "template_name": "Email 2 - Follow-up #1", "thread_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "to": ["bluth@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:58:44.594000", "date_updated": "2022-11-08T12:58:44.594000", "id": "ev_4EC9gH3wBkStT61uj7AGHs", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478252} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:58:44.580000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:58:44.580000+00:00", "date_updated": "2022-11-08T12:58:44.586000+00:00", "email_ids": ["acti_uTYUIkVvkt5gjJjn5D3RtEIveSqwuP6pCVwC6vNA69x"], "id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "latest_normalized_subject": "Airbyte Follow-up", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:58:44.588000", "date_updated": "2022-11-08T12:58:44.588000", "id": "ev_0juNxEsdkzTcqFWmfsUsCV", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "acti_4XmjyRgIPIH5OSEa18MH6FFVPf0JnS65X8AX8KucQwJ", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478254} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_leads", "n_objects", "status"], "data": {"contact_preference": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:58:33.566000+00:00", "date_updated": "2022-11-08T12:58:43.481000+00:00", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "n_leads": 1, "n_leads_processed": 0, "n_objects": 1, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "results_limit": null, "s_query": {"negate": false, "type": "match_all"}, "send_done_email": true, "sender": "Jean Lafleur ", "sort": [], "status": "processing", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:58:42.667000", "date_updated": "2022-11-08T12:58:43.492000", "id": "ev_37SshV7XUNLmOSTzTZew2X", "lead_id": null, "meta": {"bulk_action_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB"}, "object_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "object_type": "bulk_action.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:58:33.566000+00:00", "n_leads": null, "n_objects": null, "status": "created"}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478255} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"contact_preference": "lead", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:58:33.566000+00:00", "date_updated": "2022-11-08T12:58:33.566000+00:00", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "n_leads": null, "n_leads_processed": 0, "n_objects": null, "n_objects_processed": 0, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "results_limit": null, "s_query": {"negate": false, "type": "match_all"}, "send_done_email": true, "sender": "Jean Lafleur ", "sort": [], "status": "created", "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:58:33.568000", "date_updated": "2022-11-08T12:58:33.568000", "id": "ev_2nHQYOznAOdmPsKZdjHobS", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/bulk_action/email/"}, "object_id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "object_type": "bulk_action.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_69alL99OIy5Byf57uk9f1Z", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478257} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "date_updated", "status"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:57:36.327000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "Test meeting", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:57:36.327000+00:00", "date_updated": "2022-11-08T12:57:41.036000+00:00", "id": "acti_ndvZApXIgLqbUsyciHCX3kmvPTwr7jQymarl4uOt43l", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:57:39.344000", "date_updated": "2022-11-08T12:57:41.038000", "id": "ev_1Jo9jzSb4Dt2Uggoa7qnVM", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_ndvZApXIgLqbUsyciHCX3kmvPTwr7jQymarl4uOt43l/"}, "object_id": "acti_ndvZApXIgLqbUsyciHCX3kmvPTwr7jQymarl4uOt43l", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "T", "date_updated": "2022-11-08T12:57:36.327000+00:00", "status": "draft"}, "request_id": "req_38GnoVKcIh5e1wND1vM55x", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478259} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "status"], "data": {"_type": "SMS", "activity_at": "2022-11-08T12:57:39.721000+00:00", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:57:17.961000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:57:39.721000+00:00", "date_updated": "2022-11-08T12:57:39.721000+00:00", "direction": "outbound", "error_message": null, "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+16505176539", "remote_phone_formatted": "+1 650-517-6539", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T12:57:39.729000", "date_updated": "2022-11-08T12:57:39.729000", "id": "ev_3idANNKfwKPqZ5GOmIH7Gd", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:57:17.961000+00:00", "date_sent": null, "date_updated": "2022-11-08T12:57:38.849000+00:00", "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478261} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T12:57:39.721000+00:00", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:57:17.961000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:57:39.721000+00:00", "date_updated": "2022-11-08T12:57:39.721000+00:00", "direction": "outbound", "error_message": null, "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+16505176539", "remote_phone_formatted": "+1 650-517-6539", "source": "Close.io", "status": "sent", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T12:57:39.729000", "date_updated": "2022-11-08T12:57:39.729000", "id": "ev_3GzgrmMI4ktUC8Hly48Lyr", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478263} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["cost", "date_updated"], "data": {"_type": "SMS", "activity_at": "2022-11-08T12:57:17.961000+00:00", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cost": "1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:57:17.961000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:57:38.849000+00:00", "direction": "outbound", "error_message": null, "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+16505176539", "remote_phone_formatted": "+1 650-517-6539", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T12:57:38.856000", "date_updated": "2022-11-08T12:57:38.856000", "id": "ev_6Z81XgNhZA8e3IPALkwJTB", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"cost": null, "date_updated": "2022-11-08T12:57:26.038000+00:00"}, "request_id": null, "user_id": null}, "emitted_at": 1670413478265} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:57:36.327000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "T", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:57:36.327000+00:00", "date_updated": "2022-11-08T12:57:36.327000+00:00", "id": "acti_ndvZApXIgLqbUsyciHCX3kmvPTwr7jQymarl4uOt43l", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:57:36.329000", "date_updated": "2022-11-08T12:57:36.329000", "id": "ev_75pXRbuBCn7HusyaITNAwt", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/custom/"}, "object_id": "acti_ndvZApXIgLqbUsyciHCX3kmvPTwr7jQymarl4uOt43l", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0rElvTA8qPHyCiEVvH6vxI", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478267} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status", "text"], "data": {"_type": "SMS", "activity_at": "2022-11-08T12:57:17.961000+00:00", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:57:17.961000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:57:26.038000+00:00", "direction": "outbound", "error_message": null, "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+16505176539", "remote_phone_formatted": "+1 650-517-6539", "source": "Close.io", "status": "outbox", "template_id": "", "text": "Test sms", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T12:57:21.071000", "date_updated": "2022-11-08T12:57:26.040000", "id": "ev_5ySbiYjCEgGSIbxKEhCMZn", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/sms/acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC/"}, "object_id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:57:17.961000+00:00", "status": "draft", "text": ""}, "request_id": "req_3R3Vw2T8Bx0XajvoUZkq65", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478269} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "SMS", "activity_at": "2022-11-08T12:57:17.961000+00:00", "attachments": [], "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cost": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:57:17.961000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:57:17.961000+00:00", "direction": "outbound", "error_message": null, "id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "local_country_iso": "US", "local_phone": "+14156251293", "local_phone_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "remote_country_iso": "US", "remote_phone": "+16505176539", "remote_phone_formatted": "+1 650-517-6539", "source": "Close.io", "status": "draft", "template_id": "", "text": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur"}, "date_created": "2022-11-08T12:57:17.963000", "date_updated": "2022-11-08T12:57:17.963000", "id": "ev_5G9woDnJH0svN96CIPtE08", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/sms/"}, "object_id": "acti_KidUxSobTFVZwPO3zz7F7IfYeheY6rqEOOSfuuPI2xC", "object_type": "activity.sms", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5qRtFcVYq6Aqi4gDcFN1uc", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478271} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_created", "date_updated"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:56:52.539000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:56:52.539000+00:00", "date_updated": "2022-11-08T12:56:53.916000+00:00", "email_ids": ["acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe"], "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "latest_normalized_subject": "Wayne Enterprises (Example Lead) + Airbyte", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:56:53.918000", "date_updated": "2022-11-08T12:56:53.918000", "id": "ev_0LORDQEVzrS8pvHOJbovE6", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:54:51.104000+00:00", "date_created": "2022-11-08T12:54:51.104000+00:00", "date_updated": "2022-11-08T12:56:39.644000+00:00"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478273} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["activity_at", "date_sent", "date_updated", "envelope", "message_ids", "status"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T12:56:53.891000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:56:53.893000", "date_updated": "2022-11-08T12:56:53.893000", "id": "ev_2uk8G8LihWSmA5ye5nw0bu", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"activity_at": "2022-11-08T12:54:51.103000+00:00", "date_sent": null, "date_updated": "2022-11-08T12:56:39.623000+00:00", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:54:51 -0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "message_ids": [], "status": "outbox"}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478274} +{"stream": "events", "data": {"action": "sent", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:56:52.538000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": "2022-11-08T12:56:52.538000+00:00", "date_updated": "2022-11-08T12:56:53.891000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:56:52 +0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<166791221256.1235.11589873218010129427@smtpgw.close.com>", "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": ["<166791221256.1235.11589873218010129427@smtpgw.close.com>", "<166791221256.1235.14063741572606059919@smtpgw.close.com>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:56:53.893000", "date_updated": "2022-11-08T12:56:53.893000", "id": "ev_19pY6D5ddgRpKMaLJZBurd", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478276} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "date_updated", "status"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:54:51.103000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:56:39.623000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:54:51 -0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "outbox", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:56:39.624000", "date_updated": "2022-11-08T12:56:39.624000", "id": "ev_6g6SjjAq0BFqYDQKMXDbXF", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "date_updated": "2022-11-08T12:56:28.840000+00:00", "status": "draft"}, "request_id": "req_5JFKYAzGuO9OAx2jRO5I6Y", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478279} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "latest_normalized_subject", "participants"], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:54:51.104000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.104000+00:00", "date_updated": "2022-11-08T12:56:28.852000+00:00", "email_ids": ["acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe"], "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "latest_normalized_subject": "Wayne Enterprises (Example Lead) + Airbyte", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:56:25.569000", "date_updated": "2022-11-08T12:56:28.853000", "id": "ev_4i43OZDSnOrtxVuSvBytin", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/"}, "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:54:56.503000+00:00", "latest_normalized_subject": "Test", "participants": []}, "request_id": "req_6r2Gn3nkUuLmQNlrGdgNiy", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478281} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "body_preview", "body_text", "date_updated", "email_account_id", "envelope", "sender", "subject", "template_id", "template_name"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:54:51.103000+00:00", "attachments": [], "bcc": [], "body_html": "Hi Bruce,

I'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at Wayne Enterprises (Example\u00a0Lead) and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "body_preview": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) an", "body_text": "Hi Bruce, \n \nI'm Jean with Airbyte. We help companies in the Manufacturing space [INSERT\nYOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at\nWayne Enterprises (Example Lead) and show you what we're working on. \n \nAre you available for a quick call tomorrow afternoon?", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:56:28.840000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:54:51 -0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Wayne Enterprises (Example\u00a0Lead) + Airbyte", "template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "template_name": "Email 1 - Intro", "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:56:25.546000", "date_updated": "2022-11-08T12:56:28.842000", "id": "ev_0ofIb1fBDuBp7AbfCQ3cn8", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "test", "body_preview": "test", "body_text": "test", "date_updated": "2022-11-08T12:54:56.492000+00:00", "email_account_id": null, "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:54:51 -0000", "from": [], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "sender": null, "subject": "Test", "template_id": null, "template_name": null}, "request_id": "req_6r2Gn3nkUuLmQNlrGdgNiy", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478282} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "body_preview", "body_text", "date_updated", "envelope"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:55:49.388000+00:00", "attachments": [], "bcc": [], "body_html": "Test", "body_preview": "Test", "body_text": "Test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:55:49.388000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:55:54.125000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:55:49 -0000", "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Test", "template_id": null, "template_name": null, "thread_id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:55:52.669000", "date_updated": "2022-11-08T12:55:54.127000", "id": "ev_4G7O0HFExUkOHYpSyJKITO", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA/"}, "object_id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "", "body_preview": null, "body_text": "", "date_updated": "2022-11-08T12:55:49.397000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}}, "request_id": "req_7MP7G9O8mus0hHAGJ9IrCG", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478284} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:55:49.388000+00:00", "attachments": [], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:55:49.388000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:55:49.397000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": null, "from": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "Jean Lafleur ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Test", "template_id": null, "template_name": null, "thread_id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:55:49.399000", "date_updated": "2022-11-08T12:55:49.399000", "id": "ev_2oE1GjMC8yz65iLyI6bsxM", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2njnA6dxxrBlr0QZZf11YL", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478286} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:55:49.389000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:55:49.389000+00:00", "date_updated": "2022-11-08T12:55:49.393000+00:00", "email_ids": ["acti_XF6sSdUpFbve6PLReW4YrwwxTunoon1q7EAjkhiolZA"], "id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "latest_normalized_subject": "Test", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:55:49.395000", "date_updated": "2022-11-08T12:55:49.395000", "id": "ev_6Ic1jfulUodOYYRBg2eqWr", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_diSbB5sLhZK1kkgpBgzl4dlojtN1Nt6MEvLPC5DEZpe", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2njnA6dxxrBlr0QZZf11YL", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478288} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["body_html", "body_preview", "body_text", "date_updated", "envelope"], "data": {"_type": "Email", "activity_at": "2022-11-08T12:54:51.103000+00:00", "attachments": [], "bcc": [], "body_html": "test", "body_preview": "test", "body_text": "test", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:54:56.492000+00:00", "direction": "outgoing", "email_account_id": null, "envelope": {"bcc": [], "cc": [], "date": "Tue, 08 Nov 2022 12:54:51 -0000", "from": [], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": null, "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Test", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:54:56.494000", "date_updated": "2022-11-08T12:54:56.494000", "id": "ev_6bDYnuHT90jg1kg6b0R7z0", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/email/acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe/"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"body_html": "", "body_preview": null, "body_text": "", "date_updated": "2022-11-08T12:54:51.116000+00:00", "envelope": {"bcc": [], "cc": [], "date": null, "from": [], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}}, "request_id": "req_7R7JY1nJXQjYxlE3pv0hDE", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478290} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2022-11-08T12:54:51.103000+00:00", "attachments": [], "bcc": [], "body_html": "", "body_preview": null, "body_text": "", "bulk_email_action_id": null, "cc": [], "contact_id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.103000+00:00", "date_scheduled": null, "date_sent": null, "date_updated": "2022-11-08T12:54:51.116000+00:00", "direction": "outgoing", "email_account_id": null, "envelope": {"bcc": [], "cc": [], "date": null, "from": [], "in_reply_to": null, "is_autoreply": false, "message_id": null, "reply_to": [], "sender": [], "subject": "Test", "to": [{"email": "thedarkknight@close.com", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "in_reply_to_id": null, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "message_ids": [], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": null, "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "draft", "subject": "Test", "template_id": null, "template_name": null, "thread_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "to": ["thedarkknight@close.com"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:54:51.118000", "date_updated": "2022-11-08T12:54:51.118000", "id": "ev_3EPymJ3HjasusuLyJfzm42", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6cqclJ7coAWXFOYzJDPyaf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478292} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2022-11-08T12:54:51.104000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:54:51.104000+00:00", "date_updated": "2022-11-08T12:54:51.111000+00:00", "email_ids": ["acti_ZU8MvgvFu21A7QMkYFD5SAI8EqrITmfJuu4f5FJDnCe"], "id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "latest_normalized_subject": "Test", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:54:51.113000", "date_updated": "2022-11-08T12:54:51.113000", "id": "ev_1tnTsAiOrK75gb7vf64WxP", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/email/"}, "object_id": "acti_wK6I4m4SqRMvvm0VHR8DhdUL35HRfjIlBkrMVCKWNaU", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_6cqclJ7coAWXFOYzJDPyaf", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478294} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "date_updated", "status"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:32.535000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "Meeting 1", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:40:32.535000+00:00", "date_updated": "2022-11-08T12:40:38.917000+00:00", "id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:40:35.396000", "date_updated": "2022-11-08T12:40:38.919000", "id": "ev_4l9KF2jvor1Vpw7HbjPeUr", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh/"}, "object_id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "M", "date_updated": "2022-11-08T12:40:32.535000+00:00", "status": "draft"}, "request_id": "req_6zXr6RYINKmkRZ1nKN66Ak", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478296} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:32.535000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "M", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:40:32.535000+00:00", "date_updated": "2022-11-08T12:40:32.535000+00:00", "id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:40:32.538000", "date_updated": "2022-11-08T12:40:32.538000", "id": "ev_4Z4tK2JqKv64R71GblPEb9", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/custom/"}, "object_id": "acti_FTn9toCS3uqaRzfmlo7RaVjAHuuWWlio1ShJlwguBxh", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_30UgRVVFROdIDMB6mCbEtM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478298} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4", "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D", "date_updated", "status"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:09.329000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Facebook", "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": "Yes", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Stark Industries", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Media", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Point of Contact"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:40:09.329000+00:00", "date_updated": "2022-11-08T12:40:25.872000+00:00", "id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:40:21.951000", "date_updated": "2022-11-08T12:40:25.874000", "id": "ev_1t7IfQaKaIgsa8Bmk5Fq7H", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0/"}, "object_id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": null, "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": null, "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": null, "date_updated": "2022-11-08T12:40:18.612000+00:00", "status": "draft"}, "request_id": "req_1CrOg7446y9lJP9Jo2kOtq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478300} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi", "date_updated"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:09.329000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Media", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Point of Contact"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:40:09.329000+00:00", "date_updated": "2022-11-08T12:40:18.612000+00:00", "id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:40:15.338000", "date_updated": "2022-11-08T12:40:18.613000", "id": "ev_12UsNZ1ycUB5kkeGVXZIq5", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0/"}, "object_id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": null, "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": null, "date_updated": "2022-11-08T12:40:09.329000+00:00"}, "request_id": "req_2YNxxoArlVB52PtTXqKrv3", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478302} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:40:09.329000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:40:09.329000+00:00", "date_updated": "2022-11-08T12:40:09.329000+00:00", "id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:40:09.331000", "date_updated": "2022-11-08T12:40:09.331000", "id": "ev_0Y3Ynbm8HjexOx8AwYd5ub", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/custom/"}, "object_id": "acti_56OhzlisdLZ3EBRnVtqA2Ez4lB9rI7IZNT3fR2jaJg0", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0WtkS7j32Aa5DK814Ie32W", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478304} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:39:45.247000+00:00", "date_updated": "2022-11-08T12:39:45.247000+00:00", "id": "noti_TmKkh9qNFLGadhDQaMvSBhvt7NpKG5LaQeA8QMoy7mD", "is_complete": true, "is_new": false, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-08T12:39:45.249000", "date_updated": "2022-11-08T12:39:45.249000", "id": "ev_1uKf3DVSX7iYgTfbfRtg5Z", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "noti_TmKkh9qNFLGadhDQaMvSBhvt7NpKG5LaQeA8QMoy7mD", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2tvnBBeG0usfUKh0sKRnHa", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478305} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"annualized_expected_value": 600000, "annualized_value": 600000, "confidence": 100, "contact_id": null, "contact_name": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:45.225000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:39:45.225000+00:00", "date_won": "2022-11-08", "expected_value": 50000, "id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_gaqEGSVHIFzrofTfzzg5UfjyBZ1B6KERccIy2MOp8FG", "status_label": "Won", "status_type": "won", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 50000, "value_currency": "USD", "value_formatted": "$500 monthly", "value_period": "monthly"}, "date_created": "2022-11-08T12:39:45.227000", "date_updated": "2022-11-08T12:39:45.227000", "id": "ev_5mYcsYjtXoi0CoYjjuVneL", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "oppo_Q5P0tdfD07i2ik9Xj3BtLO0z7R8DYe9sdCOoQgCXCju", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2tvnBBeG0usfUKh0sKRnHa", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478307} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:39:28.163000+00:00", "date_updated": "2022-11-08T12:39:28.163000+00:00", "due_date": "2022-11-08", "id": "task_TkXjx6VgrvQDAvjgw5zF3tbMfVOKSUgfv4T9wDDvzor", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-08T12:39:28.164000", "date_updated": "2022-11-08T12:39:28.164000", "id": "ev_7T18bm9r9shLy6w7V7U4P5", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_TkXjx6VgrvQDAvjgw5zF3tbMfVOKSUgfv4T9wDDvzor", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0cEEOoW9fa6xz6s8r0YYDd", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478309} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status_id", "status_label"], "data": {"addresses": [], "contact_ids": ["cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:18.101000+00:00", "date_updated": "2022-11-08T12:39:23.493000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "status_label": "Qualified", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T12:39:23.495000", "date_updated": "2022-11-08T12:39:23.495000", "id": "ev_7dgBXgu2unGNxxG4ogshJZ", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q/"}, "object_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:39:18.129000+00:00", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential"}, "request_id": "req_45OMxPljzUgXRgQsSvUrDM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478311} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "LeadStatusChange", "activity_at": "2022-11-08T12:39:23.457000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:23.457000+00:00", "date_updated": "2022-11-08T12:39:23.457000+00:00", "id": "acti_djNEynab5lvt0dA3DR2zp57cty6YQ958yzPyTH14rp3", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "new_status_id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "new_status_label": "Qualified", "old_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "old_status_label": "Potential", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:39:23.459000", "date_updated": "2022-11-08T12:39:23.459000", "id": "ev_1h9U3cr13euw9wPOfwU2Jk", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q/"}, "object_id": "acti_djNEynab5lvt0dA3DR2zp57cty6YQ958yzPyTH14rp3", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_45OMxPljzUgXRgQsSvUrDM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478313} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Created", "activity_at": "2022-11-08T12:39:18.101000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:18.101000+00:00", "date_updated": "2022-11-08T12:39:18.119000+00:00", "id": "acti_9XUHcfmeKdaDhVS82diWdqGnKPvEfM3SkEr2t0uVVtb", "import_id": null, "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:39:18.122000", "date_updated": "2022-11-08T12:39:18.122000", "id": "ev_4WeFva4YNBsneCWoeGO4Yg", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "acti_9XUHcfmeKdaDhVS82diWdqGnKPvEfM3SkEr2t0uVVtb", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1MycTaWunddiPYvHNHeGbt", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478315} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"addresses": [], "contact_ids": ["cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:39:18.101000+00:00", "date_updated": "2022-11-08T12:39:18.109000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T12:39:18.110000", "date_updated": "2022-11-08T12:39:18.110000", "id": "ev_6BmXHaXvhvs0kpCYdJelmy", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1MycTaWunddiPYvHNHeGbt", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478317} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:39:18.105000+00:00", "date_updated": "2022-11-08T12:39:18.105000+00:00", "emails": [], "id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "name": "Test Lead 3", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T12:39:18.106000", "date_updated": "2022-11-08T12:39:18.106000", "id": "ev_3iV2ehtWnqDAxpMiJkMvHO", "lead_id": "lead_k4vzXFytFf3MNtDFBQ7dmracwique8ihE5vB0yqNc0Q", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "cont_yPMHEQ9BNIa5ZcOs6SXzte1qUQsBGkQyMe5Ytmf72ih", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1MycTaWunddiPYvHNHeGbt", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478319} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-17", "date_created": "2022-11-08T12:38:51.597000+00:00", "date_updated": "2022-11-08T12:38:51.597000+00:00", "id": "noti_5CwYYAqPoVjCYRZagjxdbeyEOusRDISkehgr3v1KVfV", "is_complete": false, "is_new": true, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T12:38:51.598000", "date_updated": "2022-11-08T12:38:51.598000", "id": "ev_6QGlhTC49Hm3ATgv1GaBCZ", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "noti_5CwYYAqPoVjCYRZagjxdbeyEOusRDISkehgr3v1KVfV", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_21UD5YvJOWMLGR88SSAmoH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478320} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"annualized_expected_value": 10000, "annualized_value": 20000, "confidence": 50, "contact_id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "contact_name": "Test Lead 2", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:51.568000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:38:51.568000+00:00", "date_won": "2022-11-17", "expected_value": 10000, "id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_ObYTUqjVZW0nTZXjvHhzMGyK999e42WZdIhkaNq12En", "status_label": "Contract Sent", "status_type": "active", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 20000, "value_currency": "USD", "value_formatted": "$200", "value_period": "one_time"}, "date_created": "2022-11-08T12:38:51.570000", "date_updated": "2022-11-08T12:38:51.570000", "id": "ev_1wOVvMtz3NCC0QvBoQdrNl", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "oppo_jKsuUM39hyb0lRGfX42LdnNA7gAPeg6WPGDyshYQdtd", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_21UD5YvJOWMLGR88SSAmoH", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478322} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:38:32.187000+00:00", "date_updated": "2022-11-08T12:38:32.187000+00:00", "due_date": "2022-11-08", "id": "task_xKiuX4ZjnL2zRUlNWFjPbupKofLLhYkLPsDdEnsLBMb", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-08T12:38:32.189000", "date_updated": "2022-11-08T12:38:32.189000", "id": "ev_4VzXL1MgpwkfNub6NKdKFo", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_xKiuX4ZjnL2zRUlNWFjPbupKofLLhYkLPsDdEnsLBMb", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1SlKVluzthCS62IFQM916h", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478324} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Created", "activity_at": "2022-11-08T12:38:24.066000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:24.066000+00:00", "date_updated": "2022-11-08T12:38:24.084000+00:00", "id": "acti_HZwfZd2NtUbwSXTUsxMhMLGDltDnYSoVhGTa26NgY1I", "import_id": null, "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:38:24.086000", "date_updated": "2022-11-08T12:38:24.086000", "id": "ev_4uXRorkllLKr8Xa8zALhOH", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "acti_HZwfZd2NtUbwSXTUsxMhMLGDltDnYSoVhGTa26NgY1I", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_73FLliAHOTmRpX8ssRrUci", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478326} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"addresses": [], "contact_ids": ["cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:38:24.066000+00:00", "date_updated": "2022-11-08T12:38:24.075000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T12:38:24.077000", "date_updated": "2022-11-08T12:38:24.077000", "id": "ev_2rD528XH9VddwW31wINcjT", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_73FLliAHOTmRpX8ssRrUci", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478328} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:38:24.071000+00:00", "date_updated": "2022-11-08T12:38:24.071000+00:00", "emails": [], "id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "name": "Test Lead 2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T12:38:24.073000", "date_updated": "2022-11-08T12:38:24.073000", "id": "ev_1r6XAwPLvd3UE7HjjtSA7X", "lead_id": "lead_wHmSTaI65HmsT7qaYK0f89m0w65a9d0LRCwCws7ujWl", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "cont_qs64s6KtlTtHuDUfftdGRYnHE6tdU8GIGdPr1zurKz1", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_73FLliAHOTmRpX8ssRrUci", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478330} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_emails"], "data": {"_type": "EmailThread", "activity_at": "2021-08-25T21:15:36.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-08-25T21:15:36.001000+00:00", "date_updated": "2022-11-08T12:36:06.162000+00:00", "email_ids": ["acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn", "acti_6pzzBcXnRUrC7ClGxkbfyifOL0tKELXmDQsGffzFx8N"], "id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "latest_normalized_subject": "Your bulk edit for Airbyte is done", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 2, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "'Close CRM' via Integration tests"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:36:06.165000", "date_updated": "2022-11-08T12:36:06.165000", "id": "ev_25I25vUFlNEdRTz2g4WNs5", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:36:05.975000+00:00", "n_emails": 1}, "request_id": null, "user_id": null}, "emitted_at": 1670413478332} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2021-08-25T21:03:54+00:00", "attachments": [], "bcc": [], "body_html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Set custom field "Lead Owner" to "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
\n", "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modifie", "body_text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Set custom field \"Lead Owner\" to \"user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-08-25T21:03:54+00:00", "date_scheduled": null, "date_sent": "2021-08-25T21:03:54+00:00", "date_updated": "2022-11-08T12:36:06.154000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Wed, 25 Aug 2021 21:03:54 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "'Close CRM' via Integration tests"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<162992543485.16564.1574709800437653559@closeio-tasktiger-other-7bd975b8f7-x9jpv>", "reply_to": [{"email": "support@close.com", "name": "Close CRM"}], "sender": [{"email": "support@close.com", "name": ""}], "subject": "Your bulk edit for Airbyte is done", "to": [{"email": "integration-test@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_6pzzBcXnRUrC7ClGxkbfyifOL0tKELXmDQsGffzFx8N", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<162992543485.16564.1574709800437653559@closeio-tasktiger-other-7bd975b8f7-x9jpv>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "'Close CRM' via Integration tests ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Your bulk edit for Airbyte is done", "template_id": null, "template_name": null, "thread_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "to": ["integration-test@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:36:06.156000", "date_updated": "2022-11-08T12:36:06.156000", "id": "ev_1Tpw8hUDH07ph8YR0LTSTi", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_6pzzBcXnRUrC7ClGxkbfyifOL0tKELXmDQsGffzFx8N", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413478333} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Email", "activity_at": "2021-08-25T21:15:36+00:00", "attachments": [], "bcc": [], "body_html": "Hello Jean,
\n
\nYour bulk edit in Close was completed successfully.
\n
\nSearch query: *
\nAction: Change lead status to "Interested".
\n
\nAll 2 leads were modified successfully.
\n
\nThanks,
\nClose Support
\nsupport@close.com
\n
\n
\n", "body_preview": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@cl", "body_text": "Hello Jean,\n\nYour bulk edit in Close was completed successfully.\n\nSearch query: *\nAction: Change lead status to \"Interested\".\n\nAll 2 leads were modified successfully.\n\nThanks,\nClose Support\nsupport@close.com\n\n\n", "bulk_email_action_id": null, "cc": [], "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-08-25T21:15:36+00:00", "date_scheduled": null, "date_sent": "2021-08-25T21:15:36+00:00", "date_updated": "2022-11-08T12:36:05.979000+00:00", "direction": "outgoing", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "envelope": {"bcc": [], "cc": [], "date": "Wed, 25 Aug 2021 21:15:36 +0000", "from": [{"email": "integration-test@airbyte.io", "name": "'Close CRM' via Integration tests"}], "in_reply_to": null, "is_autoreply": false, "message_id": "<162992613594.10130.17609834081606867635@closeio-tasktiger-other-7bd975b8f7-f5phd>", "reply_to": [{"email": "support@close.com", "name": "Close CRM"}], "sender": [{"email": "support@close.com", "name": ""}], "subject": "Your bulk edit for Airbyte is done", "to": [{"email": "integration-test@airbyte.io", "name": ""}]}, "followup_sequence_delay": null, "followup_sequence_id": null, "has_reply": false, "id": "acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn", "in_reply_to_id": null, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "message_ids": ["<162992613594.10130.17609834081606867635@closeio-tasktiger-other-7bd975b8f7-f5phd>"], "need_smtp_credentials": false, "opens": [], "opens_summary": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "references": [], "send_as_id": null, "send_attempts": [], "sender": "'Close CRM' via Integration tests ", "sequence_id": null, "sequence_name": null, "sequence_subscription_id": null, "status": "sent", "subject": "Your bulk edit for Airbyte is done", "template_id": null, "template_name": null, "thread_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "to": ["integration-test@airbyte.io"], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:36:05.981000", "date_updated": "2022-11-08T12:36:05.981000", "id": "ev_5D16kNj1ChExjyV0jxW3ZF", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn", "object_type": "activity.email", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413478335} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2021-08-25T21:15:36.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-08-25T21:15:36.001000+00:00", "date_updated": "2022-11-08T12:36:05.975000+00:00", "email_ids": ["acti_iNuDRoYQ5w17aiH9BRIfN2gHbWBth11m4D16q9mxkdn"], "id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "latest_normalized_subject": "Your bulk edit for Airbyte is done", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "integration-test@airbyte.io", "name": "'Close CRM' via Integration tests"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:36:05.977000", "date_updated": "2022-11-08T12:36:05.977000", "id": "ev_4wxQqVuMzg5TJ64zZsvNq1", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_3rQgtNnE0L7Wo90WzgOXcbfSR2WCjOBipMrAq41yJFE", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413478337} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "last_billed_price", "next_billing_on"], "data": {"address_id": null, "bundle_id": null, "carrier": "twilio", "country": "US", "date_created": "2022-11-08T12:35:29.464000+00:00", "date_updated": "2022-11-08T12:35:33.618000+00:00", "forward_to": null, "forward_to_enabled": false, "forward_to_formatted": null, "id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "is_group_number": false, "is_verified": false, "label": null, "last_billed_price": "1.15", "mms_enabled": true, "next_billing_on": "2022-12-07", "number": "+14156251293", "number_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "press_1_to_accept": true, "sms_enabled": true, "supports_mms_to_countries": ["CA", "US"], "supports_sms_to_countries": ["CA", "PR", "US"], "type": "internal", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "voicemail_greeting_url": null}, "date_created": "2022-11-08T12:35:33.628000", "date_updated": "2022-11-08T12:35:33.628000", "id": "ev_7bWeUoANNhA4EgHCa5TgnM", "lead_id": null, "meta": {}, "object_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "object_type": "phone_number", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:35:29.464000+00:00", "last_billed_price": null, "next_billing_on": "2022-11-07"}, "request_id": null, "user_id": null}, "emitted_at": 1670413478339} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["default_caller_id", "primary_personal_number"], "data": {"country": "US", "default_caller_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "hangup_recording_url": null, "id": "memb_HETbVNHM1DQq9NgkJkeG6pFNNaLWMRDloahsFzPUVyH", "is_free": false, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions_granted": ["bulk_delete", "bulk_edit", "bulk_email", "bulk_import", "bulk_sequence_subscriptions", "call_coach_barge", "call_coach_listen", "calling", "delete_leads", "delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "export", "manage_customizations", "manage_email_sequences", "manage_group_numbers", "manage_organization", "manage_others_activities", "manage_others_opportunities", "manage_others_tasks", "manage_team_email_templates", "manage_team_smart_views", "merge_leads"], "primary_personal_number": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "record_calls": false, "role": "admin", "role_id": "admin", "track_email_opens": true, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:35:29.476000", "date_updated": "2022-11-08T12:35:29.476000", "id": "ev_3ujc4KLgsv9zzSIWoSUEBF", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/phone_number/request/internal/"}, "object_id": "memb_HETbVNHM1DQq9NgkJkeG6pFNNaLWMRDloahsFzPUVyH", "object_type": "membership", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"default_caller_id": null, "primary_personal_number": null}, "request_id": "req_5CrV6GWmp7vwMRfvTm7fkd", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478341} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"address_id": null, "bundle_id": null, "carrier": "twilio", "country": "US", "date_created": "2022-11-08T12:35:29.464000+00:00", "date_updated": "2022-11-08T12:35:29.464000+00:00", "forward_to": null, "forward_to_enabled": false, "forward_to_formatted": null, "id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "is_group_number": false, "is_verified": false, "label": null, "last_billed_price": null, "mms_enabled": true, "next_billing_on": "2022-11-07", "number": "+14156251293", "number_formatted": "+1 415-625-1293", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "press_1_to_accept": true, "sms_enabled": true, "supports_mms_to_countries": ["CA", "US"], "supports_sms_to_countries": ["CA", "PR", "US"], "type": "internal", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "voicemail_greeting_url": null}, "date_created": "2022-11-08T12:35:29.466000", "date_updated": "2022-11-08T12:35:29.466000", "id": "ev_01nqUobTbIKXuHsANWyfvK", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/phone_number/request/internal/"}, "object_id": "phon_jhMWlB6anhT8vcsGNEFukaVl806zfxCgbSAAkvtNBpN", "object_type": "phone_number", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5CrV6GWmp7vwMRfvTm7fkd", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413478343} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "n_emails", "participants"], "data": {"_type": "EmailThread", "activity_at": "2021-09-17T21:29:12.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-09-17T21:29:12.001000+00:00", "date_updated": "2022-11-08T12:35:29.323000+00:00", "email_ids": ["acti_aHMyKom3arlMpEVXQYPNxASS0Luskq7sNLAl3Z23vyE", "acti_3Mapa6JtEWAYWsQU2xF6sPDFz97slwbmFqhye8vDxAV", "acti_DvkhzZr7BulOSmgomLFc3htdTwCDnu85eEoDuL8qQ9R", "acti_cz7ITkJ0XVxLg6IGHjISOt0ETJiMtvzCvuKkC5HNZlj", "acti_gF8wEbqW7Cx3fDIQTCnejQ3cOQKXLsE5md5JN88z4Lx", "acti_RyrqEGKMJKZldE6blecDGgmoWwVC2Thm3E2dPYXscss"], "id": "acti_ca3UUwuIKEStBlyz5WsmniBKV60eVZCxVknub1SSnyL", "latest_normalized_subject": "Sandbox Account", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 6, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "john@airbyte.io", "name": "Jean Lafleur"}, {"email": "sherif@airbyte.io", "name": "Sherif Nada"}, {"email": "integration-test@airbyte.io", "name": "'Nick Persico' via Integration tests"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:35:28.447000", "date_updated": "2022-11-08T12:35:29.326000", "id": "ev_3BLvdgGQ7EX5BdhSkEHSPf", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_ca3UUwuIKEStBlyz5WsmniBKV60eVZCxVknub1SSnyL", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:35:28.244000+00:00", "n_emails": 1, "participants": [{"email": "john@airbyte.io", "name": "Jean Lafleur"}]}, "request_id": null, "user_id": null}, "emitted_at": 1670413479029} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "EmailThread", "activity_at": "2021-09-17T21:29:12.001000+00:00", "contact_id": null, "created_by": null, "created_by_name": null, "date_created": "2021-09-17T21:29:12.001000+00:00", "date_updated": "2022-11-08T12:35:28.244000+00:00", "email_ids": ["acti_aHMyKom3arlMpEVXQYPNxASS0Luskq7sNLAl3Z23vyE"], "id": "acti_ca3UUwuIKEStBlyz5WsmniBKV60eVZCxVknub1SSnyL", "latest_normalized_subject": "Sandbox Account", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "n_emails": 1, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "participants": [{"email": "john@airbyte.io", "name": "Jean Lafleur"}], "updated_by": null, "updated_by_name": null, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": ["user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"]}, "date_created": "2022-11-08T12:35:28.247000", "date_updated": "2022-11-08T12:35:28.247000", "id": "ev_3vrey02xMDE3lexg84zdJn", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {}, "object_id": "acti_ca3UUwuIKEStBlyz5WsmniBKV60eVZCxVknub1SSnyL", "object_type": "activity.email_thread", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": null, "user_id": null}, "emitted_at": 1670413479043} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "note"], "data": {"_type": "Note", "activity_at": "2022-11-08T12:26:32.324000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:26:32.324000+00:00", "date_updated": "2022-11-08T12:26:34.786000+00:00", "id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "note": "Test note", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:26:33.563000", "date_updated": "2022-11-08T12:26:34.788000", "id": "ev_53cI1v8TDwmq9IuNDGcsJ1", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/note/acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ/"}, "object_id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "object_type": "activity.note", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:26:32.324000+00:00", "note": "T"}, "request_id": "req_21wlxnpaBv7LLvLK6VgaQb", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479045} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Note", "activity_at": "2022-11-08T12:26:32.324000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:26:32.324000+00:00", "date_updated": "2022-11-08T12:26:32.324000+00:00", "id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "note": "T", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:26:32.325000", "date_updated": "2022-11-08T12:26:32.325000", "id": "ev_3igaC0pFXy6LzbeJAtS3w3", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/note/"}, "object_id": "acti_gdEJ9MEBXycdmPViSYFS92PYJyQqIGTgx0iP0PvDutQ", "object_type": "activity.note", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5Bej9W8VGldC4u7TCgwc9C", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479047} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "opportunity_due", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-30", "date_created": "2022-11-08T12:26:13.663000+00:00", "date_updated": "2022-11-08T12:26:13.663000+00:00", "id": "noti_92aFlB5tcmbJW89lg4fTyBOdAJFJt13bToBOvzypOw5", "is_complete": false, "is_new": true, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "future"}, "date_created": "2022-11-08T12:26:13.665000", "date_updated": "2022-11-08T12:26:13.665000", "id": "ev_4OhcKNuRQzkt59vkuQWAzl", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "noti_92aFlB5tcmbJW89lg4fTyBOdAJFJt13bToBOvzypOw5", "object_type": "task.opportunity_due", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_144EXd1t5vEgKMB3UaKThN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479049} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"annualized_expected_value": 50000, "annualized_value": 100000, "confidence": 50, "contact_id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "contact_name": "Company 1", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_Ci7oJh7QiC0Bizd4Lcw9jrDLSC5OSWGux5O0YLbyzBw": "12345", "custom.cf_Z6Vyxe2J0lrRqFpWQQGLkPo8iwhmZ9hzWc69ll2oFox": "2022-11-23", "date_created": "2022-11-08T12:26:13.638000+00:00", "date_lost": null, "date_updated": "2022-11-08T12:26:13.638000+00:00", "date_won": "2022-11-30", "expected_value": 50000, "id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "note": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "status_label": "Demo Completed", "status_type": "active", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "value": 100000, "value_currency": "USD", "value_formatted": "$1,000", "value_period": "one_time"}, "date_created": "2022-11-08T12:26:13.639000", "date_updated": "2022-11-08T12:26:13.639000", "id": "ev_4ljZRD5w6ODs6567o0VvDM", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/opportunity/"}, "object_id": "oppo_dZRZrkuLZqxtoVlK3bwAmKM3UyIgHW9gc1Gkr7SOtvR", "object_type": "opportunity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_144EXd1t5vEgKMB3UaKThN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479051} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2022-11-08", "date_created": "2022-11-08T12:25:32.733000+00:00", "date_updated": "2022-11-08T12:25:32.733000+00:00", "due_date": "2022-11-08", "id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "is_complete": false, "is_dateless": false, "is_new": true, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "lead_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Follow up", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "inbox"}, "date_created": "2022-11-08T12:25:32.734000", "date_updated": "2022-11-08T12:25:32.734000", "id": "ev_1ly5Zt1SJCX7kpBHI863HK", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/task/"}, "object_id": "task_gwhiRc96yDf2eXxh31ZhPgCEnTJYuRlV3xg2EMFD7Pp", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_54iiY92Up2Wx63BPatUGJw", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479053} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "Created", "activity_at": "2022-11-08T12:25:18.399000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:25:18.399000+00:00", "date_updated": "2022-11-08T12:25:18.415000+00:00", "id": "acti_32MAr5WHnmOsYHOjucM11mMoVcrg6K3nNu3z7dux3Bt", "import_id": null, "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "source": "ui", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:25:18.417000", "date_updated": "2022-11-08T12:25:18.417000", "id": "ev_2JiofVZFKgQdUuJFfvIKPl", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "acti_32MAr5WHnmOsYHOjucM11mMoVcrg6K3nNu3z7dux3Bt", "object_type": "activity.created", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4nhO3wK1MORA5ifqPMSsjq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479055} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"addresses": [], "contact_ids": ["cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:25:18.399000+00:00", "date_updated": "2022-11-08T12:25:18.407000+00:00", "description": "", "display_name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "name": "has:phone_numbers opportunities:0 calls:0 tasks:0", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "status_label": "Potential", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": null}, "date_created": "2022-11-08T12:25:18.409000", "date_updated": "2022-11-08T12:25:18.409000", "id": "ev_5Auh2AVrAe7WziM0ML7f8A", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4nhO3wK1MORA5ifqPMSsjq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479057} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:25:18.403000+00:00", "date_updated": "2022-11-08T12:25:18.403000+00:00", "emails": [], "id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "name": "Company 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "phones": [], "title": "", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "urls": []}, "date_created": "2022-11-08T12:25:18.404000", "date_updated": "2022-11-08T12:25:18.404000", "id": "ev_71DiT1Xbe28O09iKBiIP8d", "lead_id": "lead_WRRmEJY2eU5AJq1oQqpJsg2S1mCSbTXfSEEQ2GmbiHT", "meta": {"request_method": "POST", "request_path": "/api/v1/lead/"}, "object_id": "cont_XZV5fWf7skLHu1NrWmcu2Bb5T2hjFx1wMm3YKh4Pvdh", "object_type": "contact", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_4nhO3wK1MORA5ifqPMSsjq", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479058} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status_id", "status_label"], "data": {"addresses": [{"address_1": "PO Box 7775 #69574", "address_2": null, "city": "San Francisco", "country": "US", "label": "mailing", "state": "CA", "zipcode": "94120"}], "contact_ids": ["cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Website", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Stark Industries", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Software", "custom.cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.315000+00:00", "date_updated": "2022-11-08T12:23:58.287000+00:00", "description": "Visit our blog for high quality sales content, blog.close.com!", "display_name": "Close (Example\u00a0Lead)", "id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "name": "Close (Example\u00a0Lead)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "status_label": "Interested", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": "https://close.com"}, "date_created": "2022-11-08T12:23:58.288000", "date_updated": "2022-11-08T12:23:58.288000", "id": "ev_1OoEXljfwYcbCIpPRFU1vX", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/"}, "object_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:23:55.706000+00:00", "status_id": "stat_K2bWWhgZqujhdsO1FPg189wAapaKMVH7bi7FwPqjFfy", "status_label": "Bad Fit"}, "request_id": "req_6bo3OapLJOAYVfVmc7AdLM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479060} +{"stream": "events", "data": {"action": "deleted", "api_key_id": null, "changed_fields": [], "data": {}, "date_created": "2022-11-08T12:23:58.268000", "date_updated": "2022-11-08T12:23:58.268000", "id": "ev_7YE49ZGYW8wXSwGfRi2MR6", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/"}, "object_id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"_type": "LeadStatusChange", "activity_at": "2022-11-08T12:23:53.514000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:23:55.692000+00:00", "date_updated": "2022-11-08T12:23:55.692000+00:00", "id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "new_status_id": "stat_K2bWWhgZqujhdsO1FPg189wAapaKMVH7bi7FwPqjFfy", "new_status_label": "Bad Fit", "old_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "old_status_label": "Interested", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "request_id": "req_6bo3OapLJOAYVfVmc7AdLM", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479062} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "status_id", "status_label"], "data": {"addresses": [{"address_1": "PO Box 7775 #69574", "address_2": null, "city": "San Francisco", "country": "US", "label": "mailing", "state": "CA", "zipcode": "94120"}], "contact_ids": ["cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu"], "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Website", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "Stark Industries", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Software", "custom.cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:03.315000+00:00", "date_updated": "2022-11-08T12:23:55.706000+00:00", "description": "Visit our blog for high quality sales content, blog.close.com!", "display_name": "Close (Example\u00a0Lead)", "id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "name": "Close (Example\u00a0Lead)", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status_id": "stat_K2bWWhgZqujhdsO1FPg189wAapaKMVH7bi7FwPqjFfy", "status_label": "Bad Fit", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "url": "https://close.com"}, "date_created": "2022-11-08T12:23:53.540000", "date_updated": "2022-11-08T12:23:55.708000", "id": "ev_7aWFP37nceHIqEp7DwONRo", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/"}, "object_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "object_type": "lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:22:49.404000+00:00", "status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "status_label": "Interested"}, "request_id": "req_3JmYhzQTnIIdGEvnpVyHzh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479064} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_created", "date_updated", "new_status_id", "new_status_label"], "data": {"_type": "LeadStatusChange", "activity_at": "2022-11-08T12:23:53.514000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:23:55.692000+00:00", "date_updated": "2022-11-08T12:23:55.692000+00:00", "id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "new_status_id": "stat_K2bWWhgZqujhdsO1FPg189wAapaKMVH7bi7FwPqjFfy", "new_status_label": "Bad Fit", "old_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "old_status_label": "Interested", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:23:55.693000", "date_updated": "2022-11-08T12:23:55.693000", "id": "ev_525fK6J16O65zXmJYEt5FC", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/"}, "object_id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_created": "2022-11-08T12:23:53.514000+00:00", "date_updated": "2022-11-08T12:23:53.514000+00:00", "new_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "new_status_label": "Potential"}, "request_id": "req_3JmYhzQTnIIdGEvnpVyHzh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479066} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "LeadStatusChange", "activity_at": "2022-11-08T12:23:53.514000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:23:53.514000+00:00", "date_updated": "2022-11-08T12:23:53.514000+00:00", "id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "new_status_id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "new_status_label": "Potential", "old_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "old_status_label": "Interested", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:23:53.515000", "date_updated": "2022-11-08T12:23:53.515000", "id": "ev_68zpjg9cijFE12r9eYOFDk", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/lead/lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz/"}, "object_id": "acti_Izu3pwypT6WFGEdj2vmrmdWDm8VzVwqsEJRRg6sdUtz", "object_type": "activity.lead_status_change", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_65uxn9RdqN4eNVwFsNPTXK", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479068} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK", "date_updated", "status"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:27.750000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Blog", "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": "Yes", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "BiffCo", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Finance", "custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK": "Test", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:22:27.750000+00:00", "date_updated": "2022-11-08T12:22:49.393000+00:00", "id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:49.391000", "date_updated": "2022-11-08T12:22:49.395000", "id": "ev_4LfOCBksYcFA9EWLhrtlZw", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg/"}, "object_id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK": "Tes", "date_updated": "2022-11-08T12:22:47.673000+00:00", "status": "draft"}, "request_id": "req_3qba0Ddk3Q59EegWyQ3s8S", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479070} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm", "custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK", "date_updated"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:27.750000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Blog", "custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": "Yes", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "BiffCo", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Finance", "custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK": "Tes", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:22:27.750000+00:00", "date_updated": "2022-11-08T12:22:47.673000+00:00", "id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:44.330000", "date_updated": "2022-11-08T12:22:47.675000", "id": "ev_79LLiJI0FsIVfFzzjoKuYI", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg/"}, "object_id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm": null, "custom.cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK": null, "date_updated": "2022-11-08T12:22:41.033000+00:00"}, "request_id": "req_1GTiTlOUGhjdxJchSGTa5n", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479072} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D", "date_updated"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:27.750000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": "Blog", "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": "BiffCo", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Finance", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:22:27.750000+00:00", "date_updated": "2022-11-08T12:22:41.033000+00:00", "id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:37.732000", "date_updated": "2022-11-08T12:22:41.034000", "id": "ev_2uGxTkxcBLtVrx5Trg2LE7", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg/"}, "object_id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4": null, "custom.cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D": null, "date_updated": "2022-11-08T12:22:34.039000+00:00"}, "request_id": "req_1le5cPa3QASuPtD9IVQb89", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479074} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi", "date_updated"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:27.750000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": "Finance", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"], "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:22:27.750000+00:00", "date_updated": "2022-11-08T12:22:34.039000+00:00", "id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:30.759000", "date_updated": "2022-11-08T12:22:34.041000", "id": "ev_7EO0o4p0zuoxokFYHl1gzN", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg/"}, "object_id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim": null, "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": null, "date_updated": "2022-11-08T12:22:27.750000+00:00"}, "request_id": "req_0X1fK7MRrU3IqRoNdCtXXu", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479076} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:27.750000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "date_created": "2022-11-08T12:22:27.750000+00:00", "date_updated": "2022-11-08T12:22:27.750000+00:00", "id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:27.753000", "date_updated": "2022-11-08T12:22:27.753000", "id": "ev_0QMMaXQQnG1YrNXyoLLxv8", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/custom/"}, "object_id": "acti_t80QOzF2GF9gLmVIT0qCT9vPO83UwrTo5EKLrMmg8Mg", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_0ywdnTfCeai600A57Jy0zN", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479077} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "date_updated", "status"], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:15.986000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "Test task 1", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:22:15.986000+00:00", "date_updated": "2022-11-08T12:22:20.377000+00:00", "id": "acti_dnwf7iS7FXehp2sJCe2OUbW1mmU6K2J2cRoD0qsWL7Q", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "published", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:19.006000", "date_updated": "2022-11-08T12:22:20.379000", "id": "ev_0TRgME6RzTxANyAHjKGaYH", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/activity/custom/acti_dnwf7iS7FXehp2sJCe2OUbW1mmU6K2J2cRoD0qsWL7Q/"}, "object_id": "acti_dnwf7iS7FXehp2sJCe2OUbW1mmU6K2J2cRoD0qsWL7Q", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "T", "date_updated": "2022-11-08T12:22:15.986000+00:00", "status": "draft"}, "request_id": "req_2cG16xIEM3Xe8viW6dcSda", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479079} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "CustomActivity", "activity_at": "2022-11-08T12:22:15.986000+00:00", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "custom.cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ": "T", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:22:15.986000+00:00", "date_updated": "2022-11-08T12:22:15.986000+00:00", "id": "acti_dnwf7iS7FXehp2sJCe2OUbW1mmU6K2J2cRoD0qsWL7Q", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "status": "draft", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:22:15.987000", "date_updated": "2022-11-08T12:22:15.987000", "id": "ev_7kagHPOKWaY3hjZUsSVB8U", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "POST", "request_path": "/api/v1/activity/custom/"}, "object_id": "acti_dnwf7iS7FXehp2sJCe2OUbW1mmU6K2J2cRoD0qsWL7Q", "object_type": "activity.custom_activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_5nrOFBl0yR3LuPzH7tBOKX", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479081} +{"stream": "events", "data": {"action": "completed", "api_key_id": null, "changed_fields": [], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2021-07-18", "date_created": "2021-07-13T11:39:03.520000+00:00", "date_updated": "2022-11-08T12:21:15.730000+00:00", "due_date": "2021-07-18", "id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "is_complete": true, "is_dateless": null, "is_new": false, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "lead_name": "Close (Example\u00a0Lead)", "object_id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Call Steli", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-08T12:21:15.731000", "date_updated": "2022-11-08T12:21:15.731000", "id": "ev_7gBZ4QMG9NtI2jsIsRSQyi", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1hfYNFl8zoiUrmqxoiORkh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479083} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "object_id", "object_type"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2021-07-18", "date_created": "2021-07-13T11:39:03.520000+00:00", "date_updated": "2022-11-08T12:21:15.730000+00:00", "due_date": "2021-07-18", "id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "is_complete": true, "is_dateless": null, "is_new": false, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "lead_name": "Close (Example\u00a0Lead)", "object_id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "object_type": "taskcompleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Call Steli", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-08T12:21:15.731000", "date_updated": "2022-11-08T12:21:15.731000", "id": "ev_2OVbleX8RkNGuc6dUfxGgF", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2022-11-08T12:21:10.369000+00:00", "object_id": null, "object_type": null}, "request_id": "req_1hfYNFl8zoiUrmqxoiORkh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479085} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"_type": "TaskCompleted", "activity_at": "2022-11-08T12:21:15.641000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date_created": "2022-11-08T12:21:15.641000+00:00", "date_updated": "2022-11-08T12:21:15.641000+00:00", "id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "task_assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "task_assigned_to_name": "Jean Lafleur", "task_id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "task_text": "Call Steli", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "users": []}, "date_created": "2022-11-08T12:21:15.652000", "date_updated": "2022-11-08T12:21:15.652000", "id": "ev_6cXrUFKDAEQugy8oEVSI35", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "acti_POPD3uA7lSfdf4xLO7PgsxKeoJS1dCRthzQRb13Xbyw", "object_type": "activity.task_completed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_1hfYNFl8zoiUrmqxoiORkh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479087} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["date_updated", "is_complete", "is_new", "view"], "data": {"_type": "lead", "assigned_to": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "assigned_to_name": "Jean Lafleur", "contact_id": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by_name": "Jean Lafleur", "date": "2021-07-18", "date_created": "2021-07-13T11:39:03.520000+00:00", "date_updated": "2022-11-08T12:21:10.369000+00:00", "due_date": "2021-07-18", "id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "is_complete": true, "is_dateless": null, "is_new": false, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "lead_name": "Close (Example\u00a0Lead)", "object_id": null, "object_type": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "text": "Call Steli", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by_name": "Jean Lafleur", "view": "archive"}, "date_created": "2022-11-08T12:21:10.370000", "date_updated": "2022-11-08T12:21:10.370000", "id": "ev_5bJynTce8kHV9dga4lrUJd", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "meta": {"request_method": "PUT", "request_path": "/api/v1/task/"}, "object_id": "task_bboTdYSlGqTBSXF0FEwhBOywDCV6iKDyMWiEfNFi7sW", "object_type": "task.lead", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"date_updated": "2021-07-13T11:39:03.520000+00:00", "is_complete": false, "is_new": true, "view": "inbox"}, "request_id": "req_1hfYNFl8zoiUrmqxoiORkh", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479089} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:08:57.596115", "date_updated": "2022-11-08T12:08:57.596115", "id": "repo_4uMZpQGz6LXEh197wx8QWe", "name": "Report 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owner_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "payload": {"data": {"dateRanges": [{"end": "2022-11-08", "label": "This Week", "start": "2022-11-06"}], "leaderboardMetric": "opportunities.won.all.count", "metrics": ["meetings.upcoming.count", "leads.created.all.count", "calls.outbound.all.count", "calls.inbound.all.count", "calls.all.all.avg_duration", "emails.sent.all.count", "emails.received.all.count", "opportunities.created.all.count", "opportunities.won.all.count", "opportunities.won.all.sum_annualized_value", "opportunities.lost.all.sum_annualized_value", "emails.sent.sequences.count"], "smartViewId": null, "users": []}, "uiMetadata": {"showLeaderboard": true}}, "report_type": "overview", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "version": 1}, "date_created": "2022-11-08T12:08:57.596000", "date_updated": "2022-11-08T12:08:57.596000", "id": "ev_7dO6bv3SuNK4XUuU4L2oT1", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/report/saved/"}, "object_id": "repo_4uMZpQGz6LXEh197wx8QWe", "object_type": "reporting.saved_report", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_05pI7vbZJYvgBpwGd16eoQ", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479091} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:48.571475", "date_updated": "2022-11-08T12:07:48.571481", "id": "seq_7gEZ4ByvvLv1rI6szKolhR", "name": "Sequence 2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "schedule_id": "sched_3MvlPuSqL0NGJyY95MBMpF", "status": "active", "steps": [{"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:48.623996", "date_updated": "2022-11-08T12:07:48.624000", "delay": 3600, "email_template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "threading": "old_thread", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "timezone": "Europe/Kiev", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:07:48.571000", "date_updated": "2022-11-08T12:07:48.571000", "id": "ev_1cfwmTAG19rFSvARAhkixc", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/sequence/"}, "object_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "object_type": "sequence", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_78TMVAw9kul0EJ90j7wDQP", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479093} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.184401", "date_updated": "2022-11-08T12:07:06.184405", "id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "name": "Sequence 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "schedule_id": "sched_1eL83fHJodv0OtoibuJFAw", "status": "active", "steps": [{"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.191662", "date_updated": "2022-11-08T12:07:06.191665", "delay": 0, "email_template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "threading": "old_thread", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.191692", "date_updated": "2022-11-08T12:07:06.191693", "delay": 259200, "email_template_id": null, "id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "threading": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "timezone": "Europe/Kiev", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:07:06.184000", "date_updated": "2022-11-08T12:07:06.184000", "id": "ev_0k6mFolJqnB73OS7YlM153", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/sequence/"}, "object_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "object_type": "sequence", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2j8BmxU2J9DftxkiTW1nlO", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479094} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:05:22.107134", "date_updated": "2022-11-08T12:05:22.107134", "id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "is_shared": false, "name": "SMS 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "owned_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status": "active", "text": "Hi!", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:05:22.107000", "date_updated": "2022-11-08T12:05:22.107000", "id": "ev_4XEbj5heQW7G8pW2VJe04B", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/graphql/"}, "object_id": "smstmpl_6zpaSGDsZyhBhrQH0jmZK9", "object_type": "sms_template", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2YIS3svDoEbtJYeCm7Ol8J", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479096} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"accepts_multiple_values": false, "back_reference_is_visible": null, "choices": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "date_created": "2022-11-08T12:03:47.935000+00:00", "date_updated": "2022-11-08T12:03:47.935000+00:00", "description": "Test description", "editable_with_roles": [], "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "is_shared": false, "name": "Test 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "referenced_custom_type_id": "", "required": false, "type": "text", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:03:47.936000", "date_updated": "2022-11-08T12:03:47.936000", "id": "ev_5UzxflgWUHeL7TK7LQVoly", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/custom_field/activity/"}, "object_id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "object_type": "custom_fields.activity", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_3WXgE0ZbPPbovlbA9yhpxg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479098} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["fields"], "data": {"api_create_only": false, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:03:27.631229", "date_updated": "2022-11-08T12:03:27.631229", "description": null, "editable_with_roles": [], "fields": [{"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test description", "editable_with_roles": [], "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "is_shared": false, "name": "Test 1", "referenced_custom_type_id": null, "required": false, "type": "text"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test activity", "editable_with_roles": [], "id": "cf_aea8B3HHCHNaoNIqzpH6HLvYqvlxCbZNZU8OkhkAuuW", "is_shared": false, "name": "Test Actvity", "referenced_custom_type_id": null, "required": false, "type": "datetime"}], "id": "actitype_4cMlNQsx560XS5dhcUpxp2", "name": "Meeting Activity 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:03:27.631000", "date_updated": "2022-11-08T12:03:27.631000", "id": "ev_7j8UuwrEuLxKJj14Bf8kDZ", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/custom_field/activity/"}, "object_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "object_type": "custom_activity_type", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"fields": [{"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test description", "editable_with_roles": [], "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "is_shared": false, "name": "Test 1", "referenced_custom_type_id": null, "required": false, "type": "text"}]}, "request_id": "req_3derTyObZvV4OsJk3uAN3T", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479100} +{"stream": "events", "data": {"action": "created", "api_key_id": null, "changed_fields": [], "data": {"api_create_only": false, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:03:27.631229", "date_updated": "2022-11-08T12:03:27.631229", "description": null, "editable_with_roles": [], "fields": [], "id": "actitype_4cMlNQsx560XS5dhcUpxp2", "name": "Meeting Activity 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:03:27.631000", "date_updated": "2022-11-08T12:03:27.631000", "id": "ev_73dldkQDrteAlURhAiPJqa", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/custom_activity/"}, "object_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "object_type": "custom_activity_type", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {}, "request_id": "req_2ZiYa8uUgeCHHyp2xSj9X1", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479102} +{"stream": "events", "data": {"action": "updated", "api_key_id": null, "changed_fields": ["fields"], "data": {"api_create_only": false, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:03:27.631229", "date_updated": "2022-11-08T12:03:27.631229", "description": null, "editable_with_roles": [], "fields": [{"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test description", "editable_with_roles": [], "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "is_shared": false, "name": "Test 1", "referenced_custom_type_id": null, "required": false, "type": "text"}], "id": "actitype_4cMlNQsx560XS5dhcUpxp2", "name": "Meeting Activity 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "date_created": "2022-11-08T12:03:27.631000", "date_updated": "2022-11-08T12:03:27.631000", "id": "ev_6di0YZ4bw7LrhudXYaJQII", "lead_id": null, "meta": {"request_method": "POST", "request_path": "/api/v1/custom_field/activity/"}, "object_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "object_type": "custom_activity_type", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "previous_data": {"fields": []}, "request_id": "req_3WXgE0ZbPPbovlbA9yhpxg", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413479104} +{"stream": "lead_custom_fields", "data": {"id": "cf_mhBoQeiuwFRlz7zqyi4kJgzUreEoUp0hUsLwrnUTEgh", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "choices": null, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_updated": "2021-07-13T11:39:01.352000+00:00", "editable_with_roles": [], "date_created": "2021-07-13T11:39:01.352000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "is_shared": false, "type": "user", "description": null, "referenced_custom_type_id": null, "name": "Lead Owner", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi"}, "emitted_at": 1670413480265} +{"stream": "contact_custom_fields", "data": {"choices": null, "is_shared": false, "type": "date", "description": null, "name": "Birthday", "referenced_custom_type_id": null, "date_created": "2021-08-11T18:05:14.598000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-08-11T18:05:14.598000+00:00", "back_reference_is_visible": null, "accepts_multiple_values": false, "id": "cf_Qj3b4cWxvmvqTtZ0U5TaprRDah8g7jRsavfVh8NCPcu", "editable_with_roles": []}, "emitted_at": 1670413481482} +{"stream": "opportunity_custom_fields", "data": {"description": null, "type": "text", "referenced_custom_type_id": null, "is_shared": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "back_reference_is_visible": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "cf_pzwnr4IYZvEqq68ENLlWknEZdVsPk53rd3571eRcP56", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "choices": null, "date_created": "2021-07-13T11:39:01.714000+00:00", "editable_with_roles": [], "accepts_multiple_values": false, "date_updated": "2021-07-13T11:39:01.714000+00:00", "name": "Contract Link (Example)"}, "emitted_at": 1670413482616} +{"stream": "opportunity_custom_fields", "data": {"description": null, "type": "choices", "referenced_custom_type_id": null, "is_shared": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "back_reference_is_visible": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "cf_aDbTIccjcJ9GQqM0xqA8uqgjYuEclhLMxnqfG3TAhsx", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "choices": ["Widget A", "Widget B", "Widget C"], "date_created": "2021-07-13T11:39:01.447000+00:00", "editable_with_roles": [], "accepts_multiple_values": true, "date_updated": "2021-07-13T11:39:01.447000+00:00", "name": "Product (Example)"}, "emitted_at": 1670413482619} +{"stream": "opportunity_custom_fields", "data": {"description": null, "type": "date", "referenced_custom_type_id": null, "is_shared": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "back_reference_is_visible": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "cf_Z6Vyxe2J0lrRqFpWQQGLkPo8iwhmZ9hzWc69ll2oFox", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "choices": null, "date_created": "2021-07-13T11:39:01.676000+00:00", "editable_with_roles": [], "accepts_multiple_values": false, "date_updated": "2021-07-13T11:39:01.676000+00:00", "name": "Renewal Date (Example)"}, "emitted_at": 1670413482623} +{"stream": "opportunity_custom_fields", "data": {"description": null, "type": "text", "referenced_custom_type_id": null, "is_shared": false, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "back_reference_is_visible": null, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "cf_Ci7oJh7QiC0Bizd4Lcw9jrDLSC5OSWGux5O0YLbyzBw", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "choices": null, "date_created": "2021-07-13T11:39:01.815000+00:00", "editable_with_roles": [], "accepts_multiple_values": false, "date_updated": "2021-07-13T11:39:01.815000+00:00", "name": "Tracking ID (Example)"}, "emitted_at": 1670413482626} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:02.212000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Contact", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:02.212000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "contact", "id": "cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483835} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:02.744000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Current Vendor: Other (if applicable)", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:02.744000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "text", "id": "cf_3W4n175LyZ3QMfr665jUS19nt2QATHyM7QaxXQC4QqA", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483836} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:02.478000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Industry: Other (if applicable)", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:02.478000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "text", "id": "cf_bp93vNo2vxbmM2QhQ7JvdytgcozCCGmOklTG9E8rDYa", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483838} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:03.083000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Next Steps", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:03.083000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "textarea", "id": "cf_ldS8XBbJo4PxIpBYkA3XWQkwY3aGqHxJxDRV7sMTsaA", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483840} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:03.149000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Notes", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:03.149000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "textarea", "id": "cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483841} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:02.826000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Number of Potential Users", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:02.826000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "number", "id": "cf_i1zuHB2hra0uMSHQuDvkx3niXapGCORwWL5t9mO6w6Q", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483842} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:03.285000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Qualified?", "choices": ["Yes", "No"], "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:03.285000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "choices", "id": "cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483843} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2021-07-13T11:39:03.006000+00:00", "description": null, "editable_with_roles": [], "referenced_custom_type_id": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Referral Source: Other (if applicable)", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2021-07-13T11:39:03.006000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "text", "id": "cf_WKYpud81IJKhD0uFmxm12baU0YcAuTN3nE6TzktrJoT", "custom_activity_type_id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "required": false}, "emitted_at": 1670413483845} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T12:03:47.935000+00:00", "description": "Test description", "editable_with_roles": [], "referenced_custom_type_id": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Test 1", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2022-11-08T12:03:47.935000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "text", "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "required": false}, "emitted_at": 1670413483846} +{"stream": "activity_custom_fields", "data": {"created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T14:27:04.532000+00:00", "description": "Test activity", "editable_with_roles": [], "referenced_custom_type_id": "", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "name": "Test Actvity", "choices": null, "is_shared": false, "back_reference_is_visible": null, "accepts_multiple_values": false, "date_created": "2022-11-08T14:27:04.532000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "type": "datetime", "id": "cf_aea8B3HHCHNaoNIqzpH6HLvYqvlxCbZNZU8OkhkAuuW", "custom_activity_type_id": "actitype_4cMlNQsx560XS5dhcUpxp2", "required": false}, "emitted_at": 1670413483848} +{"stream": "users", "data": {"email_verification_token_generated_at": null, "last_used_timezone": "Europe/Kiev", "first_name": "Jean", "last_name": "Lafleur", "image": "https://secure.gravatar.com/avatar/0a7841feac7218131ce7b427283c24ef", "id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "email": "integration-test@airbyte.io", "email_verified_at": "2021-07-13T11:37:23.175000+00:00", "date_updated": "2021-10-25T07:34:51.339000+00:00", "date_created": "2021-07-13T11:36:04.905000+00:00", "organizations": ["orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi"]}, "emitted_at": 1670413485584} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Yowan R", "phones": [{"phone_formatted": "+1 646-255-8418", "phone": "+16462558418", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2022-11-11T09:00:52.289000+00:00", "emails": [], "date_updated": "2022-11-11T09:02:10.996000+00:00", "name": "Yowan R", "id": "cont_b4h4BcmWn7rKbnsHQ0JfADwXGgndbpc5JlQEdHHyv78", "lead_id": "lead_AUtZm7EBlaSbYqOrDjIZEuC4tfhLxTDtaK9jlEPMb3y", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Yowan%20R"}], "title": "Product Manager"}, "emitted_at": 1670413486808} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Iryna", "phones": [{"phone_formatted": "+1 415-623-6785", "phone": "+14156236785", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2022-11-08T15:54:42.381000+00:00", "emails": [{"email": "irina.grankova@gmail.com", "type": "office"}], "date_updated": "2022-11-09T11:31:18.119000+00:00", "name": "Iryna", "id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Iryna"}], "title": "Test Lead"}, "emitted_at": 1670413486810} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Cooper", "phones": [], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2022-07-05T21:01:25.612000+00:00", "emails": [], "date_updated": "2022-07-05T21:01:25.612000+00:00", "name": "Cooper", "id": "cont_Dsi7AGMRelIZ2I6DIKicaGJU7mwxPZElLIHy33xbjCM", "lead_id": "lead_Eohw2Vf6WOKZHQ97nS1UTL3iV62pAJFX3ROgJ5WT4cY", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Cooper"}], "title": ""}, "emitted_at": 1670413486812} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Bruce Wayne", "phones": [{"phone_formatted": "+1 415-623-6785", "phone": "+14156236785", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:04.977000+00:00", "emails": [{"email": "thedarkknight@close.com", "type": "office"}], "date_updated": "2022-11-08T15:01:17.915000+00:00", "name": "Bruce Wayne", "id": "cont_ubIO1eBUVw3iFJ1Ot4LY12R7oADqn7bsLUF7NU2fJO6", "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Bruce%20Wayne"}], "title": "The Dark Knight", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker", "Point of Contact"]}, "emitted_at": 1670413486814} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Tobias F\u00fcnke", "phones": [], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:04.441000+00:00", "emails": [{"email": "tobiasfunke@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:04.441000+00:00", "name": "Tobias F\u00fcnke", "id": "cont_at5uglNbyasFp2KsoWQpjQmLp4lmmqX2p1nhvmPYytq", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Tobias%20F%C3%BCnke"}], "title": "Blue Man Group (Understudy)", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Point of Contact"]}, "emitted_at": 1670413486816} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Gob Bluth", "phones": [{"phone_formatted": "+1 202-555-0186", "phone": "+12025550186", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:04.430000+00:00", "emails": [{"email": "bluth@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:04.430000+00:00", "name": "Gob Bluth", "id": "cont_fcD6Y7PO1v6Olb4gGs36mLtLhOjyRA9SjuXEpwBVyhI", "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Gob%20Bluth"}], "title": "Magician", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Gatekeeper"]}, "emitted_at": 1670413486818} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Support", "phones": [], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:03.380000+00:00", "emails": [{"email": "support@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:03.380000+00:00", "name": "Support", "id": "cont_CI5c6Ekew0cyhSgoFIXeaz2PJVmmtigF2XNIGUDXKnu", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Support"}], "title": null}, "emitted_at": 1670413486819} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Customer Success Team", "phones": [{"phone_formatted": "+1 833-462-5673", "phone": "+18334625673", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:03.374000+00:00", "emails": [{"email": "success@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:03.374000+00:00", "name": "Customer Success Team", "id": "cont_4cmimyQMTMi61kc72mLAV9XdHdddw6LR1LqzvoNdSuV", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Customer%20Success%20Team"}], "title": null}, "emitted_at": 1670413486821} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Nick Persico", "phones": [{"phone_formatted": "+1 833-462-5673", "phone": "+18334625673", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:03.366000+00:00", "emails": [{"email": "nick@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:03.366000+00:00", "name": "Nick Persico", "id": "cont_FY5ws8upMQQyD9vKg4jzwRb6V3MLctQeNTc2NaUmAyo", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Nick%20Persico"}], "title": "Director of Revenue", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Gatekeeper", "Point of Contact"]}, "emitted_at": 1670413486823} +{"stream": "contacts", "data": {"updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "display_name": "Steli Efti", "phones": [{"phone_formatted": "+1 650-517-6539", "phone": "+16505176539", "country": "US", "type": "office"}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "urls": [], "date_created": "2021-07-13T11:39:03.354000+00:00", "emails": [{"email": "sales@close.com", "type": "office"}], "date_updated": "2021-07-13T11:39:03.354000+00:00", "name": "Steli Efti", "id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "integration_links": [{"name": "LinkedIn Search", "url": "https://www.linkedin.com/search/results/people/?keywords=Steli%20Efti"}], "title": "CEO & Co-Founder", "custom.cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi": ["Decision Maker"]}, "emitted_at": 1670413486826} +{"stream": "opportunities", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "oppo_NkKuhUWfDoErNArh44hw7jkkx7sCl5bhlamtezmX7BE", "status_display_name": "Demo Completed", "user_name": "Jean Lafleur", "date_updated": "2021-07-13T11:39:04.817000+00:00", "value_formatted": "$3,000", "date_won": "2021-07-16", "date_lost": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [], "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "date_created": "2021-07-13T11:39:04.817000+00:00", "value": 300000, "annualized_value": 300000, "contact_name": null, "note": "Gob's ready to buy a $3,000 suit.", "created_by_name": "Jean Lafleur", "expected_value": 225000, "value_currency": "USD", "updated_by_name": "Jean Lafleur", "contact_id": null, "annualized_expected_value": 225000, "lead_id": "lead_p7HyK4BZKAZJH2m8AAhFpcla2E0fDa6TACgU8KWv7o2", "lead_name": "Bluth Company (Example\u00a0Lead)", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_label": "Demo Completed", "confidence": 75, "value_period": "one_time", "status_type": "active"}, "emitted_at": 1670413488117} +{"stream": "opportunities", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "oppo_jXatpqaQ3HK50yBO9vMWg2wFyHoqbCJtgbRYAMuEGor", "status_display_name": "Demo Completed", "user_name": "Jean Lafleur", "date_updated": "2021-07-13T11:39:05.061000+00:00", "value_formatted": "$500", "date_won": "2021-07-15", "date_lost": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [], "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "date_created": "2021-07-13T11:39:05.061000+00:00", "value": 50000, "annualized_value": 50000, "contact_name": null, "note": "Bruce needs new software for the Bat Cave.", "created_by_name": "Jean Lafleur", "expected_value": 37500, "value_currency": "USD", "updated_by_name": "Jean Lafleur", "contact_id": null, "annualized_expected_value": 37500, "lead_id": "lead_MH9KHM5OqPHgTyGj5liiN3LTPIyuGBqzBS4uzkTtpeN", "lead_name": "Wayne Enterprises (Example\u00a0Lead)", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_label": "Demo Completed", "confidence": 75, "value_period": "one_time", "status_type": "active"}, "emitted_at": 1670413488122} +{"stream": "opportunities", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "id": "oppo_1TfmaSLuECcdSQIBnjUOBj1gAXdyrp4SFaogvcEmtbk", "status_display_name": "Proposal Sent", "user_name": "Jean Lafleur", "date_updated": "2021-08-18T10:26:44.306000+00:00", "value_formatted": "$500", "date_won": "2021-07-15", "date_lost": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [], "status_id": "stat_AWXzFJkvkHVyJQPFulY0wM7LrQRiMEtQChGumG035bH", "date_created": "2021-07-13T11:39:04.284000+00:00", "value": 50000, "annualized_value": 50000, "contact_name": "Steli Efti", "note": "Use opportunities to track which stage of the pipeline your deals are in and the revenue associated with them.", "created_by_name": "Jean Lafleur", "expected_value": 37500, "value_currency": "USD", "updated_by_name": "Jean Lafleur", "contact_id": "cont_2ZhjI4qVESIBNDPJTeQF5avXJoMJ65TZoIelDXaswCI", "annualized_expected_value": 37500, "lead_id": "lead_87BPw5opGPqBjSpz70L28NzDyBmJZHHdc3bvVt6JRlz", "lead_name": "Close (Example\u00a0Lead)", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "status_label": "Proposal Sent", "confidence": 75, "value_period": "one_time", "status_type": "active"}, "emitted_at": 1670413488127} +{"stream": "opportunities", "data": {"user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "integration_links": [], "id": "oppo_QtfwXdJFxmOLRzd3mirP7S5vWWYTEho2uWtHYNSiOUE", "value_currency": "USD", "value": 10000, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "confidence": 50, "status_type": "active", "lead_id": "lead_aVZGHXTPH0GfOguQ9vMQBZI6PpISOEzmwp8GBMmWZ3j", "date_created": "2022-11-08T15:55:27.750000+00:00", "annualized_value": 10000, "created_by_name": "Jean Lafleur", "contact_name": "Iryna", "date_won": "2022-11-16", "expected_value": 5000, "annualized_expected_value": 5000, "note": "Test", "lead_name": "Test Lead", "status_display_name": "Demo Completed", "value_period": "one_time", "status_label": "Demo Completed", "contact_id": "cont_OH7f9TYVgcDMqiSmL6Jawba9bxOIumKXD3NYtmClWAP", "date_lost": null, "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "user_name": "Jean Lafleur", "status_id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_updated": "2022-11-08T15:55:27.750000+00:00", "updated_by_name": "Jean Lafleur", "value_formatted": "$100"}, "emitted_at": 1670413488957} +{"stream": "roles", "data": {"date_created": "0001-01-01T00:00:00", "date_updated": "0001-01-01T00:00:00", "editable": false, "id": "admin", "name": "Admin", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions": ["bulk_delete", "bulk_edit", "bulk_email", "bulk_import", "bulk_sequence_subscriptions", "call_coach_barge", "call_coach_listen", "calling", "delete_leads", "delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "export", "manage_customizations", "manage_email_sequences", "manage_group_numbers", "manage_organization", "manage_others_activities", "manage_others_opportunities", "manage_others_tasks", "manage_team_email_templates", "manage_team_smart_views", "merge_leads"]}, "emitted_at": 1670413490323} +{"stream": "roles", "data": {"date_created": "0001-01-01T00:00:00", "date_updated": "0001-01-01T00:00:00", "editable": false, "id": "restricteduser", "name": "Restricted User", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions": ["delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "calling"]}, "emitted_at": 1670413490324} +{"stream": "roles", "data": {"date_created": "0001-01-01T00:00:00", "date_updated": "0001-01-01T00:00:00", "editable": false, "id": "superuser", "name": "Super User", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions": ["bulk_delete", "bulk_edit", "bulk_email", "bulk_import", "bulk_sequence_subscriptions", "call_coach_barge", "call_coach_listen", "calling", "delete_leads", "delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "export", "manage_customizations", "manage_email_sequences", "manage_group_numbers", "manage_others_activities", "manage_others_opportunities", "manage_others_tasks", "manage_team_email_templates", "manage_team_smart_views", "merge_leads"]}, "emitted_at": 1670413490324} +{"stream": "roles", "data": {"date_created": "0001-01-01T00:00:00", "date_updated": "0001-01-01T00:00:00", "editable": false, "id": "user", "name": "User", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "permissions": ["bulk_email", "bulk_import", "bulk_sequence_subscriptions", "delete_leads", "delete_own_activities", "delete_own_opportunities", "delete_own_tasks", "manage_others_activities", "manage_others_opportunities", "manage_others_tasks", "merge_leads", "calling"]}, "emitted_at": 1670413490325} +{"stream": "lead_statuses", "data": {"id": "stat_HrZ1aYkkxRORQSxdBcNPT31HkqxkK2w2uWGiK6yjkmK", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Potential"}, "emitted_at": 1670413491791} +{"stream": "lead_statuses", "data": {"id": "stat_I73shDEVu3FGzxWmP7Jti3MC6aJEdYH4e036HF1bk7k", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Customer"}, "emitted_at": 1670413491794} +{"stream": "lead_statuses", "data": {"id": "stat_K2bWWhgZqujhdsO1FPg189wAapaKMVH7bi7FwPqjFfy", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Bad Fit"}, "emitted_at": 1670413491797} +{"stream": "lead_statuses", "data": {"id": "stat_jga2oW6LFtDEZgkR6TYMLqaQK2inzquXRM8EmHDQoZr", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Canceled"}, "emitted_at": 1670413491800} +{"stream": "lead_statuses", "data": {"id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Interested"}, "emitted_at": 1670413491803} +{"stream": "lead_statuses", "data": {"id": "stat_se20ELRSIqLXHrKhyE52KI9WkGqy1qPkUZUcg4O1OQa", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Not Interested"}, "emitted_at": 1670413491806} +{"stream": "lead_statuses", "data": {"id": "stat_y6v7svdpj3v1ZHd1GoiJFcKrUGrA0jl2Af53jfGbkN9", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Qualified"}, "emitted_at": 1670413491808} +{"stream": "opportunity_statuses", "data": {"id": "stat_CZr5826cyG8wqIg4tD6bbjaqePP4HAYOMSLgOhi1Xbf", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Lost", "type": "lost", "pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy"}, "emitted_at": 1670413493028} +{"stream": "opportunity_statuses", "data": {"id": "stat_gaqEGSVHIFzrofTfzzg5UfjyBZ1B6KERccIy2MOp8FG", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Won", "type": "won", "pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy"}, "emitted_at": 1670413493030} +{"stream": "opportunity_statuses", "data": {"id": "stat_ObYTUqjVZW0nTZXjvHhzMGyK999e42WZdIhkaNq12En", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Contract Sent", "type": "active", "pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy"}, "emitted_at": 1670413493031} +{"stream": "opportunity_statuses", "data": {"id": "stat_AWXzFJkvkHVyJQPFulY0wM7LrQRiMEtQChGumG035bH", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Proposal Sent", "type": "active", "pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy"}, "emitted_at": 1670413493033} +{"stream": "opportunity_statuses", "data": {"id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "label": "Demo Completed", "type": "active", "pipeline_id": "pipe_0IAl41rGk9OPls9CdxFpHy"}, "emitted_at": 1670413493034} +{"stream": "pipelines", "data": {"created_by": null, "date_created": "2021-07-13T11:36:04.983404", "date_updated": "2021-07-13T11:36:04.983404", "id": "pipe_0IAl41rGk9OPls9CdxFpHy", "name": "Sales", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "statuses": [{"id": "stat_pI63Ohv8ByAaIFsguWoGCOP8FPV9vL9YJ8VbxTXgSe6", "label": "Demo Completed", "type": "active"}, {"id": "stat_AWXzFJkvkHVyJQPFulY0wM7LrQRiMEtQChGumG035bH", "label": "Proposal Sent", "type": "active"}, {"id": "stat_ObYTUqjVZW0nTZXjvHhzMGyK999e42WZdIhkaNq12En", "label": "Contract Sent", "type": "active"}, {"id": "stat_gaqEGSVHIFzrofTfzzg5UfjyBZ1B6KERccIy2MOp8FG", "label": "Won", "type": "won"}, {"id": "stat_CZr5826cyG8wqIg4tD6bbjaqePP4HAYOMSLgOhi1Xbf", "label": "Lost", "type": "lost"}], "updated_by": null}, "emitted_at": 1670413494291} +{"stream": "email_templates", "data": {"attachments": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "subject": "{{ lead.display_name }} + {{ organization.name }}", "is_shared": true, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "body": "Hi {{ contact.first_name }},

I'm {{ user.first_name }} with {{ organization.name }}. We help companies in the {{ lead.custom.[\"Industry\"] }} space [INSERT YOUR PRODUCT/SERVICE]. I wanted to learn how you handle this currently at {{ lead.display_name }} and show you what we're working on.

Are you available for a quick call tomorrow afternoon?
", "name": "Email 1 - Intro", "is_archived": false, "date_created": "2021-07-13T11:39:00.497000+00:00", "id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "date_updated": "2022-08-11T18:11:08.966000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413495424} +{"stream": "email_templates", "data": {"attachments": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "subject": "{{ organization.name }} Follow-up", "is_shared": true, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "body": "Hi {{ contact.first_name }},

Friendly follow-up.

I wanted to show you how {{ organization.name }} can help you with [INSERT YOUR PRODUCT/SERVICE]. Do you have 15 minutes for a quick call this week?

- Wed @ 11AM
- Thur @ 2PM
- Fri @ 3PM
", "name": "Email 2 - Follow-up #1", "is_archived": false, "date_created": "2021-07-13T11:39:00.503000+00:00", "id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "date_updated": "2022-08-11T18:11:08.972000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413495427} +{"stream": "google_connected_accounts", "data": {"lead_suggestions_updated_at": "2022-11-08T12:13:45.711000+00:00", "default_identity": {"name": "Jean Lafleur", "email": "iryna.grankova@airbyte.io"}, "send_status": "ok", "smtp": {"use_ssl": true, "date_updated": "2022-11-08T12:13:40.319000+00:00", "host": "smtp.gmail.com", "username": "iryna.grankova@airbyte.io", "port": 465}, "available_features": ["calendar_syncing", "email_sending", "email_syncing"], "email": "iryna.grankova@airbyte.io", "latest_receive_error": null, "enabled_features": ["calendar_syncing", "email_sending", "email_syncing"], "is_imap_archive_sync_enabled": true, "synced_calendars": ["jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "iryna.grankova@airbyte.io"], "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:13:40.319000+00:00", "receive_attempts_count": 0, "available_calendars": [{"id": "jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "name": "Close Tasks: Jean Lafleur", "status": "ok", "synced": true}, {"id": "iryna.grankova@airbyte.io", "name": "iryna.grankova@airbyte.io", "status": "ok", "synced": true}], "sync_all_calendars": false, "receive_status": "ok", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "email_receive_status": "ok", "identities": [{"name": "Jean Lafleur", "email": "iryna.grankova@airbyte.io"}], "imap": {"use_ssl": true, "date_updated": "2022-11-08T12:13:40.319000+00:00", "host": "imap.gmail.com", "username": "iryna.grankova@airbyte.io", "port": 993}, "_type": "google", "calendar_receive_status": "ok", "latest_send_error": null}, "emitted_at": 1670413496664} +{"stream": "google_connected_accounts", "data": {"available_features": ["email_sending", "email_syncing"], "date_created": "2022-11-08T14:43:13.927000+00:00", "email": "integration-test@airbyte.io", "enabled_features": ["email_sending", "email_syncing"], "_type": "custom_email", "calendar_receive_status": null, "default_identity": {"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}, "email_receive_status": "error", "latest_receive_error": null, "latest_send_error": null, "receive_status": "error", "send_status": "ok", "id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "identities": [{"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}], "imap": {"use_ssl": true, "date_updated": "2022-11-08T14:43:13.927000+00:00", "host": "imap.gmail.com", "username": "iryna.grankova@globallogic.com", "port": 993}, "is_imap_archive_sync_enabled": true, "lead_suggestions_updated_at": "2022-11-08T14:43:17.844000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "receive_attempts_count": 0, "smtp": {"use_ssl": true, "date_updated": "2022-11-08T14:43:13.927000+00:00", "host": "smtp.gmail.com", "username": "iryna.grankova@globallogic.com", "port": 465}, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413496668} +{"stream": "google_connected_accounts", "data": {"lead_suggestions_updated_at": null, "default_identity": {"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}, "send_status": null, "smtp": null, "available_features": [], "email": "integration-test@airbyte.io", "latest_receive_error": null, "enabled_features": [], "is_imap_archive_sync_enabled": true, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T13:13:08.795000+00:00", "receive_attempts_count": 0, "zoom_account_plan": null, "receive_status": null, "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "id": "emailacct_pSuPSwRBjmzoTYudYJRn9ENpaR3RAaRp7K2jJ8syPsp", "email_receive_status": null, "identities": [], "imap": null, "_type": "zoom", "calendar_receive_status": null, "latest_send_error": null}, "emitted_at": 1670413496672} +{"stream": "custom_email_connected_accounts", "data": {"available_calendars": [{"id": "jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "name": "Close Tasks: Jean Lafleur", "status": "ok", "synced": true}, {"id": "iryna.grankova@airbyte.io", "name": "iryna.grankova@airbyte.io", "status": "ok", "synced": true}], "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_created": "2022-11-08T12:13:40.319000+00:00", "lead_suggestions_updated_at": "2022-11-08T12:13:45.711000+00:00", "receive_attempts_count": 0, "calendar_receive_status": "ok", "smtp": {"use_ssl": true, "date_updated": "2022-11-08T12:13:40.319000+00:00", "username": "iryna.grankova@airbyte.io", "port": 465, "host": "smtp.gmail.com"}, "sync_all_calendars": false, "imap": {"use_ssl": true, "date_updated": "2022-11-08T12:13:40.319000+00:00", "username": "iryna.grankova@airbyte.io", "port": 993, "host": "imap.gmail.com"}, "latest_send_error": null, "send_status": "ok", "default_identity": {"name": "Jean Lafleur", "email": "iryna.grankova@airbyte.io"}, "_type": "google", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "receive_status": "ok", "id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "email_receive_status": "ok", "email": "iryna.grankova@airbyte.io", "synced_calendars": ["jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "iryna.grankova@airbyte.io"], "enabled_features": ["calendar_syncing", "email_sending", "email_syncing"], "identities": [{"name": "Jean Lafleur", "email": "iryna.grankova@airbyte.io"}], "latest_receive_error": null, "available_features": ["calendar_syncing", "email_sending", "email_syncing"], "is_imap_archive_sync_enabled": true}, "emitted_at": 1670413497986} +{"stream": "custom_email_connected_accounts", "data": {"available_features": ["email_sending", "email_syncing"], "date_created": "2022-11-08T14:43:13.927000+00:00", "email": "integration-test@airbyte.io", "enabled_features": ["email_sending", "email_syncing"], "_type": "custom_email", "calendar_receive_status": null, "default_identity": {"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}, "email_receive_status": "error", "latest_receive_error": null, "latest_send_error": null, "receive_status": "error", "send_status": "ok", "id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "identities": [{"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}], "imap": {"use_ssl": true, "date_updated": "2022-11-08T14:43:13.927000+00:00", "username": "iryna.grankova@globallogic.com", "port": 993, "host": "imap.gmail.com"}, "is_imap_archive_sync_enabled": true, "lead_suggestions_updated_at": "2022-11-08T14:43:17.844000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "receive_attempts_count": 0, "smtp": {"use_ssl": true, "date_updated": "2022-11-08T14:43:13.927000+00:00", "username": "iryna.grankova@globallogic.com", "port": 465, "host": "smtp.gmail.com"}, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413497990} +{"stream": "custom_email_connected_accounts", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_created": "2022-11-08T13:13:08.795000+00:00", "lead_suggestions_updated_at": null, "receive_attempts_count": 0, "calendar_receive_status": null, "smtp": null, "imap": null, "latest_send_error": null, "send_status": null, "default_identity": {"name": "Jean Lafleur", "email": "integration-test@airbyte.io"}, "_type": "zoom", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "receive_status": null, "id": "emailacct_pSuPSwRBjmzoTYudYJRn9ENpaR3RAaRp7K2jJ8syPsp", "email_receive_status": null, "email": "integration-test@airbyte.io", "zoom_account_plan": null, "enabled_features": [], "identities": [], "latest_receive_error": null, "available_features": [], "is_imap_archive_sync_enabled": true}, "emitted_at": 1670413497993} +{"stream": "zoom_connected_accounts", "data": {"latest_send_error": null, "identities": [{"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}], "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "enabled_features": ["calendar_syncing", "email_sending", "email_syncing"], "email_receive_status": "ok", "is_imap_archive_sync_enabled": true, "smtp": {"date_updated": "2022-11-08T12:13:40.319000+00:00", "port": 465, "use_ssl": true, "username": "iryna.grankova@airbyte.io", "host": "smtp.gmail.com"}, "available_calendars": [{"id": "jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "name": "Close Tasks: Jean Lafleur", "status": "ok", "synced": true}, {"id": "iryna.grankova@airbyte.io", "name": "iryna.grankova@airbyte.io", "status": "ok", "synced": true}], "imap": {"date_updated": "2022-11-08T12:13:40.319000+00:00", "port": 993, "use_ssl": true, "username": "iryna.grankova@airbyte.io", "host": "imap.gmail.com"}, "lead_suggestions_updated_at": "2022-11-08T12:13:45.711000+00:00", "receive_status": "ok", "id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "available_features": ["calendar_syncing", "email_sending", "email_syncing"], "synced_calendars": ["jf4v33abpv80jp1r8vhdfjonm0bj0sk9@import.calendar.google.com", "iryna.grankova@airbyte.io"], "date_created": "2022-11-08T12:13:40.319000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "calendar_receive_status": "ok", "_type": "google", "sync_all_calendars": false, "email": "iryna.grankova@airbyte.io", "send_status": "ok", "latest_receive_error": null, "receive_attempts_count": 0, "default_identity": {"email": "iryna.grankova@airbyte.io", "name": "Jean Lafleur"}}, "emitted_at": 1670413499172} +{"stream": "zoom_connected_accounts", "data": {"available_features": ["email_sending", "email_syncing"], "date_created": "2022-11-08T14:43:13.927000+00:00", "email": "integration-test@airbyte.io", "enabled_features": ["email_sending", "email_syncing"], "_type": "custom_email", "calendar_receive_status": null, "default_identity": {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}, "email_receive_status": "error", "latest_receive_error": null, "latest_send_error": null, "receive_status": "error", "send_status": "ok", "id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "identities": [{"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}], "imap": {"date_updated": "2022-11-08T14:43:13.927000+00:00", "port": 993, "use_ssl": true, "username": "iryna.grankova@globallogic.com", "host": "imap.gmail.com"}, "is_imap_archive_sync_enabled": true, "lead_suggestions_updated_at": "2022-11-08T14:43:17.844000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "receive_attempts_count": 0, "smtp": {"date_updated": "2022-11-08T14:43:13.927000+00:00", "port": 465, "use_ssl": true, "username": "iryna.grankova@globallogic.com", "host": "smtp.gmail.com"}, "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413499173} +{"stream": "zoom_connected_accounts", "data": {"latest_send_error": null, "identities": [], "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "enabled_features": [], "email_receive_status": null, "is_imap_archive_sync_enabled": true, "zoom_account_plan": null, "smtp": null, "imap": null, "lead_suggestions_updated_at": null, "receive_status": null, "id": "emailacct_pSuPSwRBjmzoTYudYJRn9ENpaR3RAaRp7K2jJ8syPsp", "available_features": [], "date_created": "2022-11-08T13:13:08.795000+00:00", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "calendar_receive_status": null, "_type": "zoom", "email": "integration-test@airbyte.io", "send_status": null, "latest_receive_error": null, "receive_attempts_count": 0, "default_identity": {"email": "integration-test@airbyte.io", "name": "Jean Lafleur"}}, "emitted_at": 1670413499173} +{"stream": "email_sequences", "data": {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.184401", "date_updated": "2022-11-08T12:07:06.184405", "id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "name": "Sequence 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "schedule_id": "sched_1eL83fHJodv0OtoibuJFAw", "status": "active", "steps": [{"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.191662", "date_updated": "2022-11-08T12:07:06.191665", "delay": 0, "email_template_id": "tmpl_qbI7mmvEPJla4qdCeBygtzgZ7twup69mdEr2CEVNHIM", "id": "seqstep_5lFdCIwj4qVpdVMH3K26iQ", "required": true, "sms_template_id": null, "step_allowed_delay": null, "step_type": "email", "threading": "old_thread", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:06.191692", "date_updated": "2022-11-08T12:07:06.191693", "delay": 259200, "email_template_id": null, "id": "seqstep_4YVJ2uoVccNHYG95qvwDQw", "required": false, "sms_template_id": null, "step_allowed_delay": 3600, "step_type": "call", "threading": null, "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "timezone": "Europe/Kiev", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413501882} +{"stream": "email_sequences", "data": {"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:48.571475", "date_updated": "2022-11-08T12:07:48.571481", "id": "seq_7gEZ4ByvvLv1rI6szKolhR", "name": "Sequence 2", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "schedule_id": "sched_3MvlPuSqL0NGJyY95MBMpF", "status": "active", "steps": [{"created_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:07:48.623996", "date_updated": "2022-11-08T12:07:48.624000", "delay": 3600, "email_template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "id": "seqstep_71ELVa12hUsLg2ba3K74Yq", "required": true, "sms_template_id": null, "step_allowed_delay": null, "step_type": "email", "threading": "old_thread", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}], "timezone": "Europe/Kiev", "updated_by_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413501886} +{"stream": "dialer", "data": {"caller_id": "", "date_created": "2022-11-08T14:27:23.185019", "date_updated": "2022-11-08T14:27:23.309015", "id": "dial_5qE6KYskn4PfT6oQLTe8ez", "is_user_dependent": false, "music_preference": "tone1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "ring_mode": "more-voicemails", "source_type": "saved-search", "source_value": "save_vL2ENUTpFhqrYHf97tm61Y9Sh6QughnuMURuIH4VDCC", "status": "inactive", "target_type": "lead", "type": "power", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "users": [{"is_active": false, "state": "inactive", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}]}, "emitted_at": 1670413503121} +{"stream": "smart_views", "data": {"date_created": "2022-11-08T15:50:57.032000+00:00", "date_updated": "2022-11-08T15:50:57.032000+00:00", "id": "save_UeQpNDWG0AuXKKunEIABD0qSjHvV62EFaTHzN70B6gN", "is_shared": false, "is_user_dependent": false, "name": "Deleted", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": null, "s_query": {"query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "end"}, "on_or_after": {"range": "today", "type": "start_end_of_predefined_relative_period", "which": "start"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "results_limit": null, "sort": []}, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504430} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.802000+00:00", "date_updated": "2021-07-13T11:39:00.802000+00:00", "id": "save_vL2ENUTpFhqrYHf97tm61Y9Sh6QughnuMURuIH4VDCC", "is_shared": true, "is_user_dependent": false, "name": "\ud83d\udce3 Untouched Leads", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "times_communicated:0 notes:0 tasks:0 opportunities:0", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504433} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.745000+00:00", "date_updated": "2021-07-13T11:39:00.745000+00:00", "id": "save_dnBmv1ixCRWNZ6P13oydsxGPLLxs94SWGzvBZIEqo3x", "is_shared": true, "is_user_dependent": false, "name": "\u260e\ufe0f Leads to Call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:phone_numbers opportunities:0 calls:0 tasks:0", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504437} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.692000+00:00", "date_updated": "2021-07-13T11:39:00.692000+00:00", "id": "save_mCZ7R5jZmhaajptwcnfOWccbxS9nMYpmcpHEOohcFwQ", "is_shared": true, "is_user_dependent": false, "name": "\ud83d\udceb Leads Never Emailed", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "emails:0 email_addresses > 0", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504440} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.634000+00:00", "date_updated": "2021-07-13T11:39:00.634000+00:00", "id": "save_hSAkrBcSGylFe7dGeHjQuU9FMui5yM6v3sufsy8mkqx", "is_shared": true, "is_user_dependent": false, "name": "\ud83d\udc40 Email Opened This Week", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "email(opened:\"this week\")", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504443} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.585000+00:00", "date_updated": "2021-07-13T11:39:00.585000+00:00", "id": "save_k6EKgxijrRdpphWnvpUx67LjAAn4Rl5RqHWdtz1IQsm", "is_shared": true, "is_user_dependent": false, "name": "\u231b No Contact > 30 Days", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "last_communication_date > \"30 days ago\"", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504446} +{"stream": "smart_views", "data": {"date_created": "2021-07-13T11:39:00.526000+00:00", "date_updated": "2021-07-13T11:39:00.526000+00:00", "id": "save_JZR25dsPVlIZncKRfrxlWqwWB6nymYedCCVL7KVhLO3", "is_shared": true, "is_user_dependent": false, "name": "\ud83d\udcb8 Opportunity Follow-up", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "s_query": null, "type": "lead", "user_id": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413504448} +{"stream": "email_bulk_actions", "data": {"id": "bulkemail_bCJdPbYpJ2xfUuj8Dif3sBMHlxtbOKuEZSCdNcTgsWB", "date_created": "2022-11-08T12:58:33.566000+00:00", "date_updated": "2022-11-08T12:58:47.020000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "has:active_opportunities last_communication_date > \"7 days ago\"", "s_query": {"negate": false, "type": "match_all"}, "sort": [], "results_limit": null, "status": "done", "n_objects": 1, "n_objects_processed": 1, "n_leads": 1, "n_leads_processed": 1, "send_done_email": true, "template_id": "tmpl_Cilxd4yapDRweK6caKOTGzSHqyP9ddiEz4G0DLg0nwt", "contact_preference": "lead", "email_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "sender": "Jean Lafleur "}, "emitted_at": 1670413505751} +{"stream": "sequence_subscription_bulk_actions", "data": {"date_created": "2022-11-08T15:09:57.014000+00:00", "date_updated": "2022-11-08T15:10:17.831000+00:00", "action_type": "subscribe", "from_phone_number_id": null, "results_limit": null, "send_done_email": true, "sender_name": "Jean Lafleur", "calls_assigned_to": [], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "n_leads_processed": 11, "n_leads": 11, "id": "bulkseqsub_nB54SIHOmtafCyAri59aJc24OfcCWudvQFtIW6k7oJv", "query": "", "sequence_id": "seq_7gEZ4ByvvLv1rI6szKolhR", "contact_preference": "contact", "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "status": "done", "n_objects_processed": 11, "n_objects": 11, "sender_email": "integration-test@airbyte.io", "sort": [], "sender_account_id": "emailacct_chcWvlCbL58B28cadf8XzEjQymaAMyJW6uqGjdiqmHK", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi"}, "emitted_at": 1670413507091} +{"stream": "sequence_subscription_bulk_actions", "data": {"date_created": "2022-11-08T15:09:38.582000+00:00", "date_updated": "2022-11-08T15:09:55.730000+00:00", "action_type": "subscribe", "from_phone_number_id": null, "results_limit": null, "send_done_email": true, "sender_name": "Jean Lafleur", "calls_assigned_to": ["group_2WQ2sEM5fBJ2Ip0lWMyRLg"], "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "n_leads_processed": 11, "n_leads": 11, "id": "bulkseqsub_YrswODZaYxUAhKYKcOcIQCWRxzbUjlsIgno8viR55dw", "query": "", "sequence_id": "seq_17gkOeJEV1QPdPaOMJ9mTX", "contact_preference": "contact", "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "contact", "type": "object_type"}, {"negate": false, "queries": [], "type": "and"}], "type": "and"}, "status": "done", "n_objects_processed": 11, "n_objects": 11, "sender_email": "iryna.grankova@airbyte.io", "sort": [], "sender_account_id": "emailacct_QeGtVE7epttFYuPJqtqVqaKgW7BEq5q7jHx8M2IHxwe", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi"}, "emitted_at": 1670413507095} +{"stream": "delete_bulk_actions", "data": {"id": "bulkdelete_jfj3OxS8q9ri6uDwvr09Gwxl9Q6Oh3tgJ4cUPAaZq52", "date_created": "2022-11-08T15:49:38.627000+00:00", "date_updated": "2022-11-08T15:49:44.832000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "", "s_query": {"negate": false, "queries": [{"negate": false, "object_type": "lead", "type": "object_type"}, {"negate": false, "queries": [{"negate": false, "queries": [{"condition": {"before": {"range": "today", "which": "end", "type": "start_end_of_predefined_relative_period"}, "on_or_after": {"range": "today", "which": "start", "type": "start_end_of_predefined_relative_period"}, "type": "moment_range"}, "field": {"field_name": "date_created", "object_type": "lead", "type": "regular_field"}, "negate": false, "type": "field_condition"}], "type": "and"}], "type": "and"}], "type": "and"}, "sort": [], "results_limit": null, "status": "done", "n_objects": 3, "n_objects_processed": 3, "n_leads": 3, "n_leads_processed": 3, "send_done_email": true, "bulk_object_type": "lead"}, "emitted_at": 1670413508423} +{"stream": "edit_bulk_actions", "data": {"id": "bulkedit_GMBUd9rUAIfYnKXokMKXV1AHMQUm9yCMGXhh96xYlxr", "date_created": "2021-08-25T21:15:27.477000+00:00", "date_updated": "2021-08-25T21:15:35.868000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "*", "s_query": {"negate": false, "type": "match_all"}, "sort": [], "results_limit": null, "status": "done", "n_objects": 3, "n_objects_processed": 3, "n_leads": 3, "n_leads_processed": 3, "send_done_email": true, "type": "set_lead_status", "custom_field_name": null, "custom_field_value": null, "lead_status_id": "stat_nzPGZ5qJXdpP2GSFqzbPdyHgZWXkRfx6BjQih76ss0q"}, "emitted_at": 1670413509650} +{"stream": "edit_bulk_actions", "data": {"id": "bulkedit_mA19Kcb30egVp18LcMXP2OCTQaLsGJyWikJMXYu32kv", "date_created": "2021-08-25T21:03:43.590000+00:00", "date_updated": "2021-08-25T21:03:54.810000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "query": "*", "s_query": {"negate": false, "type": "match_all"}, "sort": [], "results_limit": null, "status": "done", "n_objects": 3, "n_objects_processed": 3, "n_leads": 3, "n_leads_processed": 3, "send_done_email": true, "type": "set_custom_field", "custom_field_name": "Lead Owner", "custom_field_value": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "lead_status_id": null}, "emitted_at": 1670413509653} +{"stream": "integration_links", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_updated": "2022-08-11T18:11:08.979000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:00.832000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "url": "https://google.com/search?q={{ lead.display_name }}", "name": "Google Search", "type": "lead", "id": "ilink_CUrmAjZi7dy3T5nodx6INqBAYMIme3HQ9In2Zm4PHI4"}, "emitted_at": 1670413510982} +{"stream": "integration_links", "data": {"organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "date_updated": "2022-08-11T18:11:08.993000+00:00", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:00.840000+00:00", "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "url": "https://www.linkedin.com/search/results/people/?keywords={{ contact.name }}", "name": "LinkedIn Search", "type": "contact", "id": "ilink_UFZJXoAlAiDsIbBMKPaK87FDp0hgjduPjRMcdjomGzS"}, "emitted_at": 1670413510985} +{"stream": "custom_activities", "data": {"api_create_only": false, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2022-11-08T12:03:27.631229", "date_updated": "2022-11-08T12:03:27.631229", "description": null, "editable_with_roles": [], "fields": [{"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test description", "editable_with_roles": [], "id": "cf_KLkKl1BRUm4o7zknJtTkvp6TMFgff1984UelnlGN9mZ", "is_shared": false, "name": "Test 1", "referenced_custom_type_id": null, "required": false, "type": "text"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": "Test activity", "editable_with_roles": [], "id": "cf_aea8B3HHCHNaoNIqzpH6HLvYqvlxCbZNZU8OkhkAuuW", "is_shared": false, "name": "Test Actvity", "referenced_custom_type_id": null, "required": false, "type": "datetime"}], "id": "actitype_4cMlNQsx560XS5dhcUpxp2", "name": "Meeting Activity 1", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413512305} +{"stream": "custom_activities", "data": {"api_create_only": false, "created_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg", "date_created": "2021-07-13T11:39:01.879565", "date_updated": "2021-07-13T11:39:01.879565", "description": null, "editable_with_roles": [], "fields": [{"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_UftGNTS2rq9XMG9hOHkALp5cgn4Xl8nZqN7gReax3lc", "is_shared": false, "name": "Contact", "referenced_custom_type_id": null, "required": false, "type": "contact"}, {"accepts_multiple_values": true, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_oYaaZ3ikZjy6qc7htLdSWJxSxEZTova9HHLLLj67cyi", "is_shared": true, "name": "Contact Role", "referenced_custom_type_id": null, "required": false, "type": "choices"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_ZuP9X9UjiQzjptNHlT7DxzRATaFil2Ysoz0aGMq0Kim", "is_shared": true, "name": "Industry", "referenced_custom_type_id": null, "required": false, "type": "choices"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_bp93vNo2vxbmM2QhQ7JvdytgcozCCGmOklTG9E8rDYa", "is_shared": false, "name": "Industry: Other (if applicable)", "referenced_custom_type_id": null, "required": false, "type": "text"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_1exVDDcGOEiIdhBhBv2VEGqnpIcJZZqiWkk4O7hbU3D", "is_shared": true, "name": "Current Vendor/Software", "referenced_custom_type_id": null, "required": false, "type": "choices"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_3W4n175LyZ3QMfr665jUS19nt2QATHyM7QaxXQC4QqA", "is_shared": false, "name": "Current Vendor: Other (if applicable)", "referenced_custom_type_id": null, "required": false, "type": "text"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_i1zuHB2hra0uMSHQuDvkx3niXapGCORwWL5t9mO6w6Q", "is_shared": false, "name": "Number of Potential Users", "referenced_custom_type_id": null, "required": false, "type": "number"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_05o22yQYHMrFh4cCYCMSQJdSpODdabCbGQ8il5Do7X4", "is_shared": true, "name": "Referral Source", "referenced_custom_type_id": null, "required": false, "type": "choices"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_WKYpud81IJKhD0uFmxm12baU0YcAuTN3nE6TzktrJoT", "is_shared": false, "name": "Referral Source: Other (if applicable)", "referenced_custom_type_id": null, "required": false, "type": "text"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_ldS8XBbJo4PxIpBYkA3XWQkwY3aGqHxJxDRV7sMTsaA", "is_shared": false, "name": "Next Steps", "referenced_custom_type_id": null, "required": false, "type": "textarea"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_jxTmWbZeP5LEVL4vokkPvTW0VPUU2UHobsphKgUB6xK", "is_shared": false, "name": "Notes", "referenced_custom_type_id": null, "required": false, "type": "textarea"}, {"accepts_multiple_values": false, "back_reference_is_visible": null, "converting_to_type": null, "description": null, "editable_with_roles": [], "id": "cf_1cL7txuLyrTH6Cpw15KtPLPT36l9eOdlJLKUdosxQLm", "is_shared": false, "name": "Qualified?", "referenced_custom_type_id": null, "required": false, "type": "choices"}], "id": "actitype_0J9YvrOw4opjiYI4aDY6wj", "name": "Qualification Call", "organization_id": "orga_ya3w9oMjeLtWe7zFGZr63Dz8ruBbjybG0EIUdUXaESi", "updated_by": "user_SOwJFVMqtgZCL6QrMDLujSXbQabQnNfOwjFX1mdOulg"}, "emitted_at": 1670413512306} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-close-com/integration_tests/invalid_config.json b/airbyte-integrations/connectors/source-close-com/integration_tests/invalid_config.json index bec0adc7a116..ae6c037ea66d 100644 --- a/airbyte-integrations/connectors/source-close-com/integration_tests/invalid_config.json +++ b/airbyte-integrations/connectors/source-close-com/integration_tests/invalid_config.json @@ -1,4 +1,4 @@ { "api_key": "api_wrong", - "start_date": "2021-01-01" + "start_date": "2021-01-01T00:00:00.000000+00:00" } diff --git a/airbyte-integrations/connectors/source-close-com/integration_tests/sample_config.json b/airbyte-integrations/connectors/source-close-com/integration_tests/sample_config.json index cf4a4484345f..faf916a81696 100644 --- a/airbyte-integrations/connectors/source-close-com/integration_tests/sample_config.json +++ b/airbyte-integrations/connectors/source-close-com/integration_tests/sample_config.json @@ -1,4 +1,4 @@ { "api_key": "api_1234567890", - "start_date": "2021-01-01" + "start_date": "2021-01-01T00:00:00.000000+00:00" } diff --git a/airbyte-integrations/connectors/source-close-com/integration_tests/sample_state.json b/airbyte-integrations/connectors/source-close-com/integration_tests/sample_state.json index 55d4000dcff0..9288753ca9a1 100644 --- a/airbyte-integrations/connectors/source-close-com/integration_tests/sample_state.json +++ b/airbyte-integrations/connectors/source-close-com/integration_tests/sample_state.json @@ -1,34 +1,34 @@ { "created_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "opportunity_status_change_activities": {}, "note_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "meeting_activities": {}, "call_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "email_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "email_thread_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "lead_status_change_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "sms_activities": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "task_completed_activities": {}, "leads": {}, "lead_tasks": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "incoming_email_tasks": { - "date_created": "2021-01-01" + "date_created": "2021-01-01T00:00:00.000000+00:00" }, "email_followup_tasks": { "date_created": "2050-07-13T11:39:03.520000+00:00" @@ -49,9 +49,9 @@ "date_created": "2050-07-13T11:39:03.520000+00:00" }, "events": { - "date_updated": "2021-01-01" + "date_updated": "2021-01-01T00:00:00.000000+00:00" }, "opportunities": { - "date_updated": "2021-01-01" + "date_updated": "2021-01-01T00:00:00.000000+00:00" } } diff --git a/airbyte-integrations/connectors/source-close-com/setup.py b/airbyte-integrations/connectors/source-close-com/setup.py index 9400772e183b..7bc6d70de471 100644 --- a/airbyte-integrations/connectors/source-close-com/setup.py +++ b/airbyte-integrations/connectors/source-close-com/setup.py @@ -5,9 +5,7 @@ from setuptools import find_packages, setup -MAIN_REQUIREMENTS = [ - "airbyte-cdk", -] +MAIN_REQUIREMENTS = ["airbyte-cdk", "pendulum", "requests"] TEST_REQUIREMENTS = [ "pytest~=6.1", diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/__init__.py b/airbyte-integrations/connectors/source-close-com/source_close_com/__init__.py index 41c5d9e0a425..dbf20b496938 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/__init__.py +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/__init__.py @@ -21,6 +21,7 @@ # SOFTWARE. -from .source import SourceCloseCom +from .datetime_slicer import CustomDatetimeStreamSlicer +from .source_lc import SourceCloseCom -__all__ = ["SourceCloseCom"] +__all__ = ["SourceCloseCom", "CustomDatetimeStreamSlicer"] diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/close_com.yaml b/airbyte-integrations/connectors/source-close-com/source_close_com/close_com.yaml new file mode 100644 index 000000000000..1f0495aea1fd --- /dev/null +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/close_com.yaml @@ -0,0 +1,515 @@ +version: "0.1.0" + +definitions: + schema_loader: + type: JsonSchema + file_path: "./source_close_com/schemas/{{ options['name'] }}.json" + selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_pointer: [ "data" ] + requester: + url_base: "https://api.close.com/api/v1/" + http_method: "GET" + authenticator: + type: BasicHttpAuthenticator + username: "{{ config['api_key'] }}" + password: "" + incremental_query_requester: + $ref: "*ref(definitions.requester)" + request_options_provider: + request_parameters: + query: "sort:updated date_updated > {{ stream_slice['start_time'] }} date_updated <= {{ stream_slice['end_time'] }}" + offset_paginator: + type: DefaultPaginator + url_base: "*ref(definitions.requester.url_base)" + page_size_option: + inject_into: "request_parameter" + field_name: "_limit" + page_token_option: + inject_into: "request_parameter" + field_name: "_skip" + pagination_strategy: + type: OffsetIncrement + page_size: "{{ options['items_per_page'] }}" + cursor_paginator: + type: DefaultPaginator + url_base: "*ref(definitions.requester.url_base)" + page_token_option: + inject_into: "request_parameter" + field_name: "_cursor" + pagination_strategy: + type: CursorPagination + cursor_value: "{{ response['cursor_next'] }}" + page_size: -1 + page_size_option: + inject_into: request_parameter + field_name: "" + stream_query_slicer: +# type: DatetimeStreamSlicer + class_name: "source_close_com.CustomDatetimeStreamSlicer" + start_datetime: + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%d" + end_datetime: + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%S.%f%z') }}" + datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z" # ISO8601 + step: "365d" + cursor_field: "date_updated" + datetime_format: "%Y-%m-%d" + + stream_slicer__cursor_date_created: +# type: DatetimeStreamSlicer + class_name: "source_close_com.CustomDatetimeStreamSlicer" + start_datetime: + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%d" + end_datetime: + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%S.%f%z') }}" + datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z" # ISO8601 + start_time_option: + field_name: "date_created__gt" + inject_into: "request_parameter" + end_time_option: + field_name: "date_created__lte" + inject_into: "request_parameter" + step: "365d" + cursor_field: "date_created" + datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z" + + stream_slicer__cursor_date_updated: +# type: DatetimeStreamSlicer + class_name: "source_close_com.CustomDatetimeStreamSlicer" + start_datetime: + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%d" + end_datetime: + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%S.%f%z') }}" + datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z" # ISO8601 + start_time_option: + field_name: "date_updated__gt" + inject_into: "request_parameter" + end_time_option: + field_name: "date_updated__lte" + inject_into: "request_parameter" + step: "365d" + cursor_field: "date_updated" + datetime_format: "%Y-%m-%dT%H:%M:%S.%f%z" + retriever: + record_selector: + $ref: "*ref(definitions.selector)" + requester: + $ref: "*ref(definitions.requester)" + paginator: + type: NoPagination + + base_stream: + retriever: + $ref: "*ref(definitions.retriever)" + schema_loader: + $ref: "*ref(definitions.schema_loader)" + primary_key: "id" + full_refresh_stream: + $ref: "*ref(definitions.base_stream)" + retriever: + $ref: "*ref(definitions.retriever)" + paginator: + $ref: "*ref(definitions.offset_paginator)" + full_refresh_cursor_stream: + $ref: "*ref(definitions.base_stream)" + retriever: + $ref: "*ref(definitions.retriever)" + paginator: + $ref: "*ref(definitions.cursor_paginator)" + incremental_stream: + $ref: "*ref(definitions.full_refresh_stream)" + retriever: + $ref: "*ref(definitions.full_refresh_stream.retriever)" + stream_slicer: + $ref: "*ref(definitions.stream_slicer__cursor_date_updated)" + requester: + $ref: "*ref(definitions.requester)" + stream_cursor_field: "date_updated" + incremental_cursor_based_stream: + $ref: "*ref(definitions.incremental_stream)" + retriever: + $ref: "*ref(definitions.incremental_stream.retriever)" + paginator: + $ref: "*ref(definitions.cursor_paginator)" + + activities_base_stream: + $ref: "*ref(definitions.incremental_stream)" + retriever: + $ref: "*ref(definitions.incremental_stream.retriever)" + stream_slicer: + $ref: "*ref(definitions.stream_slicer__cursor_date_created)" + stream_cursor_field: "date_created" + $options: + items_per_page: 100 + + tasks_base_stream: + $ref: "*ref(definitions.incremental_stream)" + retriever: + $ref: "*ref(definitions.incremental_stream.retriever)" + requester: + $ref: "*ref(definitions.requester)" + request_options_provider: + request_parameters: + _type: "{{ options['task_type'] }}" + _order_by: "date_created" + stream_slicer: + $ref: "*ref(definitions.stream_slicer__cursor_date_created)" + $options: + path: "task" + items_per_page: 1000 + stream_cursor_field: "date_created" + + connected_accounts_base_stream: + $ref: "*ref(definitions.full_refresh_stream)" + retriever: + $ref: "*ref(definitions.full_refresh_stream.retriever)" + requester: + $ref: "*ref(definitions.requester)" + request_options_provider: + request_parameters: + _type: "{{ options['connected_accounts_type'] }}" + $options: + path: "connected_account" + items_per_page: 100 + + created_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "created_activities" + path: "activity/created" + note_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "note_activities" + path: "activity/note" + email_thread_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "email_thread_activities" + path: "activity/emailthread" + email_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "email_activities" + path: "activity/email" + sms_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "sms_activities" + path: "activity/sms" + call_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "call_activities" + path: "activity/call" + meeting_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "meeting_activities" + path: "activity/meeting" + lead_status_change_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "lead_status_change_activities" + path: "activity/status_change/lead" + opportunity_status_change_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "opportunity_status_change_activities" + path: "activity/status_change/opportunity" + task_completed_activities_stream: + $ref: "*ref(definitions.activities_base_stream)" + $options: + $ref: "*ref(definitions.activities_base_stream.$options)" + name: "task_completed_activities" + path: "activity/task_completed" + + lead_custom_fields_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "lead_custom_fields" + path: "custom_field/lead" + items_per_page: 1000 + contact_custom_fields_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "contact_custom_fields" + path: "custom_field/contact" + items_per_page: 1000 + opportunity_custom_fields_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "opportunity_custom_fields" + path: "custom_field/opportunity" + items_per_page: 1000 + activity_custom_fields_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "activity_custom_fields" + path: "custom_field/activity" + items_per_page: 1000 + users_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "users" + path: "user" + items_per_page: 1000 + contacts_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "contacts" + path: "contact" + items_per_page: 100 + roles_stream: + $ref: "*ref(definitions.full_refresh_cursor_stream)" + $options: + name: "roles" + path: "role" + lead_statuses_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "lead_statuses" + path: "status/lead" + items_per_page: 100 + opportunity_statuses_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "opportunity_statuses" + path: "status/opportunity" + items_per_page: 100 + pipelines_stream: + $ref: "*ref(definitions.base_stream)" + $options: + name: "pipelines" + path: "pipeline" + email_templates_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "email_templates" + path: "email_template" + items_per_page: 100 + + events_stream: + $ref: "*ref(definitions.incremental_cursor_based_stream)" + $options: + name: "events" + path: "event" + items_per_page: 50 + leads_steam: + $ref: "*ref(definitions.incremental_stream)" + retriever: + $ref: "*ref(definitions.incremental_stream.retriever)" + stream_slicer: + $ref: "*ref(definitions.stream_query_slicer)" + requester: + $ref: "*ref(definitions.incremental_query_requester)" + $options: + name: "leads" + path: "lead" + items_per_page: 200 + opportunities_stream: + $ref: "*ref(definitions.incremental_stream)" + retriever: + $ref: "*ref(definitions.incremental_stream.retriever)" + requester: + $ref: "*ref(definitions.requester)" + request_options_provider: + request_parameters: + _order_by: "date_updated" + $options: + name: "opportunities" + path: "opportunity" + items_per_page: 250 + + lead_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "lead_tasks" + task_type: "lead" + incoming_email_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "incoming_email_tasks" + task_type: "incoming_email" + email_followup_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "email_followup_tasks" + task_type: "email_followup" + missed_call_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "missed_call_tasks" + task_type: "missed_call" + answered_detached_call_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "answered_detached_call_tasks" + task_type: "answered_detached_call" + voicemail_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "voicemail_tasks" + task_type: "voicemail" + opportunity_due_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "opportunity_due_tasks" + task_type: "opportunity_due" + incoming_sms_tasks_stream: + $ref: "*ref(definitions.tasks_base_stream)" + $options: + $ref: "*ref(definitions.tasks_base_stream.$options)" + name: "incoming_sms_tasks" + task_type: "incoming_sms" + + google_connected_accounts_stream: + $ref: "*ref(definitions.connected_accounts_base_stream)" + $options: + $ref: "*ref(definitions.connected_accounts_base_stream.$options)" + name: "google_connected_accounts" + connected_accounts_type: "google" + custom_email_connected_accounts_stream: + $ref: "*ref(definitions.connected_accounts_base_stream)" + $options: + $ref: "*ref(definitions.connected_accounts_base_stream.$options)" + name: "custom_email_connected_accounts" + connected_accounts_type: "custom_email" + zoom_connected_accounts_stream: + $ref: "*ref(definitions.connected_accounts_base_stream)" + $options: + $ref: "*ref(definitions.connected_accounts_base_stream.$options)" + name: "zoom_connected_accounts" + connected_accounts_type: "zoom" + + send_as_stream: + $ref: "*ref(definitions.base_stream)" + $options: + name: "send_as" + path: "send_as" + email_sequences_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "email_sequences" + path: "sequence" + items_per_page: 1000 + dialer_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "dialer" + path: "dialer" + items_per_page: 100 + smart_views_stream: + $ref: "*ref(definitions.full_refresh_cursor_stream)" + $options: + name: "smart_views" + path: "saved_search" +# items_per_page: 600 + email_bulk_actions_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "email_bulk_actions" + path: "bulk_action/email" + items_per_page: 100 + sequence_subscription_bulk_actions_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "sequence_subscription_bulk_actions" + path: "bulk_action/sequence_subscription" + items_per_page: 100 + delete_bulk_actions_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "delete_bulk_actions" + path: "bulk_action/delete" + items_per_page: 100 + edit_bulk_actions_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "edit_bulk_actions" + path: "bulk_action/edit" + items_per_page: 100 + integration_links_stream: + $ref: "*ref(definitions.full_refresh_stream)" + $options: + name: "integration_links" + path: "integration_link" + items_per_page: 100 + custom_activities_stream: + $ref: "*ref(definitions.base_stream)" + $options: + name: "custom_activities" + path: "custom_activity" + +streams: + - "*ref(definitions.created_activities_stream)" + - "*ref(definitions.note_activities_stream)" + - "*ref(definitions.email_thread_activities_stream)" + - "*ref(definitions.email_activities_stream)" + - "*ref(definitions.sms_activities_stream)" + - "*ref(definitions.call_activities_stream)" + - "*ref(definitions.meeting_activities_stream)" + - "*ref(definitions.lead_status_change_activities_stream)" + - "*ref(definitions.opportunity_status_change_activities_stream)" + - "*ref(definitions.task_completed_activities_stream)" + - "*ref(definitions.lead_custom_fields_stream)" + - "*ref(definitions.contact_custom_fields_stream)" + - "*ref(definitions.opportunity_custom_fields_stream)" + - "*ref(definitions.activity_custom_fields_stream)" + - "*ref(definitions.users_stream)" + - "*ref(definitions.contacts_stream)" + - "*ref(definitions.roles_stream)" + - "*ref(definitions.lead_statuses_stream)" + - "*ref(definitions.opportunity_statuses_stream)" + - "*ref(definitions.pipelines_stream)" + - "*ref(definitions.email_templates_stream)" + - "*ref(definitions.events_stream)" + - "*ref(definitions.leads_steam)" + - "*ref(definitions.opportunities_stream)" + - "*ref(definitions.lead_tasks_stream)" + - "*ref(definitions.incoming_email_tasks_stream)" + - "*ref(definitions.email_followup_tasks_stream)" + - "*ref(definitions.missed_call_tasks_stream)" + - "*ref(definitions.answered_detached_call_tasks_stream)" + - "*ref(definitions.voicemail_tasks_stream)" + - "*ref(definitions.opportunity_due_tasks_stream)" + - "*ref(definitions.incoming_sms_tasks_stream)" + - "*ref(definitions.google_connected_accounts_stream)" + - "*ref(definitions.custom_email_connected_accounts_stream)" + - "*ref(definitions.zoom_connected_accounts_stream)" + - "*ref(definitions.send_as_stream)" + - "*ref(definitions.email_sequences_stream)" + - "*ref(definitions.dialer_stream)" + - "*ref(definitions.smart_views_stream)" + - "*ref(definitions.email_bulk_actions_stream)" + - "*ref(definitions.sequence_subscription_bulk_actions_stream)" + - "*ref(definitions.delete_bulk_actions_stream)" + - "*ref(definitions.edit_bulk_actions_stream)" + - "*ref(definitions.integration_links_stream)" + - "*ref(definitions.custom_activities_stream)" + +check: + stream_names: + - "users" diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/datetime_slicer.py b/airbyte-integrations/connectors/source-close-com/source_close_com/datetime_slicer.py new file mode 100644 index 000000000000..55e4e0516d64 --- /dev/null +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/datetime_slicer.py @@ -0,0 +1,34 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +import datetime +from dataclasses import dataclass + +import pendulum +from airbyte_cdk.sources.declarative.stream_slicers import DatetimeStreamSlicer + + +@dataclass +class CustomDatetimeStreamSlicer(DatetimeStreamSlicer): + """ + This customization helps us to avoid problems when we meet different datetime formats in a single stream. + For example if a stream "S" has a `date_created` field filled with "2021-01-01T00:00:00.000000+00:00" value in record 1, + but at the same time the value of the same field is "2021-01-01T00:00:00+00:00 in record 2, + then it is not enough to specify only one format in the `datetime_format` option. + """ + + def _format_datetime(self, dt: datetime.datetime) -> str: + return pendulum.datetime( + year=dt.year, + month=dt.month, + day=dt.day, + hour=dt.hour, + minute=dt.minute, + second=dt.second, + microsecond=dt.microsecond, + tz=dt.tzinfo or self._timezone, + ).to_iso8601_string() + + def parse_date(self, date: str) -> datetime.datetime: + return pendulum.parse(date, tz=self._timezone) diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_activities.json b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_activities.json index 5bb0ef1ec9be..46983ba54199 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_activities.json +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_activities.json @@ -1,6 +1,9 @@ { "type": ["null", "object"], "properties": { + "id": { + "type": ["null", "string"] + }, "api_create_only": { "type": ["null", "boolean"] }, diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_email_connected_accounts.json b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_email_connected_accounts.json index 9c3a3387d91e..530cb58bddd6 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_email_connected_accounts.json +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/custom_email_connected_accounts.json @@ -20,7 +20,7 @@ "type": ["null", "string"] }, "imap": { - "type": ["null", "string"] + "type": ["null", "object"] } } } diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/smart_views.json b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/smart_views.json index 823e5aa50450..0baaef11b96a 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/smart_views.json +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/schemas/smart_views.json @@ -20,7 +20,7 @@ "type": ["null", "string"] }, "s_query": { - "type": ["null", "string"] + "type": ["null", "object"] }, "type": { "type": ["null", "string"] diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py b/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py new file mode 100644 index 000000000000..e35e47263acb --- /dev/null +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py @@ -0,0 +1,18 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource + +""" +This file provides the necessary constructs to interpret a provided declarative YAML configuration file into +source connector. + +WARNING: Do not modify this file. +""" + + +# Declarative Source +class SourceCloseCom(YamlDeclarativeSource): + def __init__(self): + super().__init__(**{"path_to_yaml": "close_com.yaml"}) diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/spec.json b/airbyte-integrations/connectors/source-close-com/source_close_com/spec.json index ea67ed4f237e..efd6033d5d6d 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/spec.json +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/spec.json @@ -5,7 +5,7 @@ "title": "Close.com Spec", "type": "object", "required": ["api_key"], - "additionalProperties": false, + "additionalProperties": true, "properties": { "api_key": { "type": "string", diff --git a/airbyte-integrations/connectors/source-close-com/unit_tests/unit_test.py b/airbyte-integrations/connectors/source-close-com/unit_tests/tests.py similarity index 74% rename from airbyte-integrations/connectors/source-close-com/unit_tests/unit_test.py rename to airbyte-integrations/connectors/source-close-com/unit_tests/tests.py index dddaea0060fa..51eca602da1d 100644 --- a/airbyte-integrations/connectors/source-close-com/unit_tests/unit_test.py +++ b/airbyte-integrations/connectors/source-close-com/unit_tests/tests.py @@ -3,5 +3,5 @@ # -def test_example_method(): +def test(): assert True diff --git a/airbyte-integrations/connectors/source-elasticsearch/Dockerfile b/airbyte-integrations/connectors/source-elasticsearch/Dockerfile index bb08a5f841b1..cebf561d59d1 100644 --- a/airbyte-integrations/connectors/source-elasticsearch/Dockerfile +++ b/airbyte-integrations/connectors/source-elasticsearch/Dockerfile @@ -17,5 +17,5 @@ ENV ENABLE_SENTRY true COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.version=0.1.1 LABEL io.airbyte.name=airbyte/source-elasticsearch diff --git a/airbyte-integrations/connectors/source-elasticsearch/README.md b/airbyte-integrations/connectors/source-elasticsearch/README.md index 4881e6583321..fbd9835d8656 100644 --- a/airbyte-integrations/connectors/source-elasticsearch/README.md +++ b/airbyte-integrations/connectors/source-elasticsearch/README.md @@ -52,11 +52,11 @@ Airbyte has a standard test suite that all destination connectors must pass. See All commands should be run from airbyte project root. To run unit tests: ``` -./gradlew :airbyte-integrations:connectors:sources-elasticsearch:unitTest +./gradlew :airbyte-integrations:connectors:source-elasticsearch:unitTest ``` To run acceptance and custom integration tests: ``` -./gradlew :airbyte-integrations:connectors:sources-elasticsearch:integrationTest +./gradlew :airbyte-integrations:connectors:source-elasticsearch:integrationTest ``` ## Dependency Management diff --git a/airbyte-integrations/connectors/source-elasticsearch/src/main/java/io/airbyte/integrations/source/elasticsearch/ElasticsearchConnection.java b/airbyte-integrations/connectors/source-elasticsearch/src/main/java/io/airbyte/integrations/source/elasticsearch/ElasticsearchConnection.java index e677cfa53496..e5aca6e1dba4 100644 --- a/airbyte-integrations/connectors/source-elasticsearch/src/main/java/io/airbyte/integrations/source/elasticsearch/ElasticsearchConnection.java +++ b/airbyte-integrations/connectors/source-elasticsearch/src/main/java/io/airbyte/integrations/source/elasticsearch/ElasticsearchConnection.java @@ -146,11 +146,18 @@ private RuntimeException unwrappedApiException(String message, ApiException e) { * @throws IOException throws IOException if Elasticsearch request fails */ public Map getMappings(final List indices) throws IOException { - GetMappingsRequest request = new GetMappingsRequest(); - String[] copiedIndices = indices.toArray(String[]::new); - request.indices(copiedIndices); - GetMappingsResponse getMappingResponse = client.indices().getMapping(request, RequestOptions.DEFAULT); - return getMappingResponse.mappings(); + int chunk = 15; + Map mappings = new HashMap<>(); + // Avoid too_long_frame_exception error by "batching" + // the indexes mapping calls + for(int i = 0; i < indices.size(); i += chunk){ + String[] copiedIndices = indices.subList(i, Math.min(indices.size(), i + chunk)).toArray(String[]::new); + GetMappingsRequest request = new GetMappingsRequest(); + request.indices(copiedIndices); + GetMappingsResponse getMappingResponse = client.indices().getMapping(request, RequestOptions.DEFAULT); + mappings.putAll(getMappingResponse.mappings()); + } + return mappings; } /** diff --git a/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile b/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile index 2e10dfbe324f..e1754eac30ce 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile @@ -13,5 +13,5 @@ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.76 +LABEL io.airbyte.version=0.2.78 LABEL io.airbyte.name=airbyte/source-facebook-marketing diff --git a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_insight_streams.py b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_insight_streams.py index c86108a2b0ed..d0c616166ec5 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_insight_streams.py +++ b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_insight_streams.py @@ -119,6 +119,7 @@ def read_records( ) -> Iterable[Mapping[str, Any]]: """Waits for current job to finish (slice) and yield its result""" job = stream_slice["insight_job"] + self._next_cursor_value = self._get_start_date() try: for obj in job.get_result(): yield obj.export_all_data() diff --git a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/streams.py b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/streams.py index 52da27d9bae8..2f97246b34a7 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/streams.py +++ b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/streams.py @@ -179,6 +179,7 @@ def fields(self) -> List[str]: # that specific ad account. if "funding_source_details" in properties and "MANAGE" not in self.get_task_permissions(): properties.remove("funding_source_details") + properties.remove("is_prepay_account") return properties def list_objects(self, params: Mapping[str, Any]) -> Iterable: diff --git a/airbyte-integrations/connectors/source-faker/main.py b/airbyte-integrations/connectors/source-faker/main.py index 15947dc56432..eb00656da52e 100644 --- a/airbyte-integrations/connectors/source-faker/main.py +++ b/airbyte-integrations/connectors/source-faker/main.py @@ -1,6 +1,7 @@ # # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # +# import sys diff --git a/airbyte-integrations/connectors/source-firebolt/Dockerfile b/airbyte-integrations/connectors/source-firebolt/Dockerfile index c02cb10a19f2..df0dfe531794 100644 --- a/airbyte-integrations/connectors/source-firebolt/Dockerfile +++ b/airbyte-integrations/connectors/source-firebolt/Dockerfile @@ -35,5 +35,5 @@ COPY source_firebolt ./source_firebolt ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.version=0.2.0 LABEL io.airbyte.name=airbyte/source-firebolt diff --git a/airbyte-integrations/connectors/source-firebolt/acceptance-test-config.yml b/airbyte-integrations/connectors/source-firebolt/acceptance-test-config.yml index d174d9e75b50..9d9dd2212307 100644 --- a/airbyte-integrations/connectors/source-firebolt/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-firebolt/acceptance-test-config.yml @@ -11,6 +11,9 @@ tests: status: "failed" discovery: - config_path: "secrets/config.json" + backward_compatibility_tests_config: + # 0.1.0 contains queries that overwhelm the API server on this test + disable_for_version: "0.1.0" basic_read: - config_path: "secrets/config.json" configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-firebolt/bootstrap.md b/airbyte-integrations/connectors/source-firebolt/bootstrap.md index fccc42134ac6..3635bc17e1ee 100644 --- a/airbyte-integrations/connectors/source-firebolt/bootstrap.md +++ b/airbyte-integrations/connectors/source-firebolt/bootstrap.md @@ -16,7 +16,6 @@ This connector uses [firebolt-sdk](https://pypi.org/project/firebolt-sdk/), whic ## Notes * External tables are not available as a source for performance reasons. -* Views are not available as a source due to possible complicated structure and non-obvious data types. * Only Full reads are supported for now. * Integration/Acceptance testing requires the user to have a running engine. Spinning up an engine can take a while so this ensures a faster iteration on the connector. * Pagination is not available at the moment so large enough data sets might cause out of memory errors \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-firebolt/integration_tests/__init__.py b/airbyte-integrations/connectors/source-firebolt/integration_tests/__init__.py index 46b7376756ec..1100c1c58cf5 100644 --- a/airbyte-integrations/connectors/source-firebolt/integration_tests/__init__.py +++ b/airbyte-integrations/connectors/source-firebolt/integration_tests/__init__.py @@ -1,3 +1,3 @@ # -# Copyright (c) 2021 Airbyte, Inc., all rights reserved. +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-firebolt/integration_tests/integration_test.py b/airbyte-integrations/connectors/source-firebolt/integration_tests/integration_test.py index e03a428f5794..670af98ab21f 100644 --- a/airbyte-integrations/connectors/source-firebolt/integration_tests/integration_test.py +++ b/airbyte-integrations/connectors/source-firebolt/integration_tests/integration_test.py @@ -29,17 +29,23 @@ def test_table_name() -> str: @fixture(scope="module") -def create_test_data(config: Dict[str, str], test_table_name: str) -> Generator[Connection, None, None]: +def test_view_name(test_table_name) -> str: + return f"view_{test_table_name}" + + +@fixture(scope="module") +def create_test_data(config: Dict[str, str], test_table_name: str, test_view_name: str) -> Generator[Connection, None, None]: with establish_connection(config, MagicMock()) as connection: with connection.cursor() as cursor: cursor.execute( f"CREATE DIMENSION TABLE {test_table_name} (column1 STRING NULL, column2 INT NULL, column3 DATE NULL, column4 DATETIME NULL, column5 DECIMAL(38, 31) NULL, column6 ARRAY(INT), column7 BOOLEAN NULL)" ) cursor.execute( - f"INSERT INTO {test_table_name} VALUES ('my_value',221,'2021-01-01','2021-01-01 12:00:01', Null, [1,2,3], true), ('my_value2',null,'2021-01-02','2021-01-02 12:00:02','1231232.123459999990457054844258706536', [1,2,3], null)" + f"INSERT INTO {test_table_name} VALUES ('my_value',221,'2021-01-01','2021-01-01 12:00:01', Null, [1,2,3], true), ('my_value2',null,'2021-01-02','2021-01-02 12:00:02','1231232.1234599999904570548442587065362', [1,2,3], null)" ) + cursor.execute(f"CREATE VIEW {test_view_name} AS SELECT column1, column2 FROM {test_table_name}") yield connection - cursor.execute(f"DROP TABLE {test_table_name}") + cursor.execute(f"DROP TABLE {test_table_name} CASCADE") @fixture @@ -55,7 +61,9 @@ def table_schema() -> str: "format": "datetime", "airbyte_type": "timestamp_without_timezone", }, - "column5": {"type": ["null", "number"]}, # TODO: change once Decimal hits production + # If column check fails you mignt not have the latest Firebolt version + # with Decimal data type enabled + "column5": {"type": ["null", "string"], "airbyte_type": "big_number"}, "column6": {"type": "array", "items": {"type": ["null", "integer"]}}, "column7": {"type": ["null", "integer"]}, }, @@ -69,11 +77,38 @@ def test_stream(test_table_name: str, table_schema: str) -> AirbyteStream: @fixture -def test_configured_catalogue(test_table_name: str, table_schema: str) -> ConfiguredAirbyteCatalog: +def view_schema() -> str: + schema = { + "type": "object", + "properties": { + "column1": {"type": ["null", "string"]}, + "column2": {"type": ["null", "integer"]}, + }, + } + return schema + + +@fixture +def test_view_stream(test_view_name: str, view_schema: str) -> AirbyteStream: + return AirbyteStream(name=test_view_name, json_schema=view_schema, supported_sync_modes=[SyncMode.full_refresh]) + + +@fixture +def configured_catalogue(test_table_name: str, table_schema: str) -> ConfiguredAirbyteCatalog: # Deleting one column to simulate manipulation in UI del table_schema["properties"]["column1"] append_stream = ConfiguredAirbyteStream( - stream=AirbyteStream(name=test_table_name, json_schema=table_schema), + stream=AirbyteStream(name=test_table_name, json_schema=table_schema, supported_sync_modes=[SyncMode.full_refresh]), + sync_mode=SyncMode.incremental, + destination_sync_mode=DestinationSyncMode.append, + ) + return ConfiguredAirbyteCatalog(streams=[append_stream]) + + +@fixture +def configured_view_catalogue(test_view_name: str, view_schema: str) -> ConfiguredAirbyteCatalog: + append_stream = ConfiguredAirbyteStream( + stream=AirbyteStream(name=test_view_name, json_schema=view_schema, supported_sync_modes=[SyncMode.full_refresh]), sync_mode=SyncMode.incremental, destination_sync_mode=DestinationSyncMode.append, ) @@ -109,33 +144,62 @@ def test_check_succeeds(config: Dict[str, str]): def test_discover( - config: Dict[str, str], create_test_data: Generator[Connection, None, None], test_table_name: str, test_stream: AirbyteStream + config: Dict[str, str], + create_test_data: Generator[Connection, None, None], + test_table_name: str, + test_view_name: str, + test_stream: AirbyteStream, + test_view_stream: AirbyteStream, ): source = SourceFirebolt() catalog = source.discover(MagicMock(), config) assert any(stream.name == test_table_name for stream in catalog.streams), "Test table not found" + assert any(stream.name == test_view_name for stream in catalog.streams), "Test view not found" for stream in catalog.streams: if stream.name == test_table_name: assert stream == test_stream + if stream.name == test_view_name: + assert stream == test_view_stream def test_read( config: Dict[str, str], create_test_data: Generator[Connection, None, None], test_table_name: str, - test_configured_catalogue: ConfiguredAirbyteCatalog, + configured_catalogue: ConfiguredAirbyteCatalog, ): expected_data = [ {"column2": 221, "column3": "2021-01-01", "column4": "2021-01-01T12:00:01", "column6": [1, 2, 3], "column7": 1}, { "column3": "2021-01-02", "column4": "2021-01-02T12:00:02", - "column5": 1231232.12346, # TODO: change once Decimal is in production + # If column5 check fails you mignt not have the latest Firebolt version + # with Decimal data type enabled + "column5": "1231232.1234599999904570548442587065362", "column6": [1, 2, 3], }, ] source = SourceFirebolt() - result = source.read(logger=MagicMock(), config=config, catalog=test_configured_catalogue, state={}) + result = source.read(logger=MagicMock(), config=config, catalog=configured_catalogue, state={}) data = list(result) assert all([x.record.stream == test_table_name for x in data]), "Table name is incorrect" assert [x.record.data for x in data] == expected_data, "Test data is not matching" + + +def test_view_read( + config: Dict[str, str], + create_test_data: Generator[Connection, None, None], + test_view_name: str, + configured_view_catalogue: ConfiguredAirbyteCatalog, +): + expected_data = [ + {"column1": "my_value", "column2": 221}, + { + "column1": "my_value2", + }, + ] + source = SourceFirebolt() + result = source.read(logger=MagicMock(), config=config, catalog=configured_view_catalogue, state={}) + data = list(result) + assert all([x.record.stream == test_view_name for x in data]), "Table name is incorrect" + assert [x.record.data for x in data] == expected_data, "Test data is not matching" diff --git a/airbyte-integrations/connectors/source-firebolt/setup.py b/airbyte-integrations/connectors/source-firebolt/setup.py index c2d9148fe28d..0356dfee2dc1 100644 --- a/airbyte-integrations/connectors/source-firebolt/setup.py +++ b/airbyte-integrations/connectors/source-firebolt/setup.py @@ -5,7 +5,7 @@ from setuptools import find_packages, setup -MAIN_REQUIREMENTS = ["airbyte-cdk", "firebolt-sdk>=0.8.0"] +MAIN_REQUIREMENTS = ["airbyte-cdk~=0.2", "firebolt-sdk>=0.12.0"] TEST_REQUIREMENTS = [ "pytest>=6.2.5", # 6.2.5 has python10 compatibility fixes diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/__init__.py b/airbyte-integrations/connectors/source-firebolt/source_firebolt/__init__.py index 51a0626dad03..65eb631eda39 100644 --- a/airbyte-integrations/connectors/source-firebolt/source_firebolt/__init__.py +++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/__init__.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2021 Airbyte, Inc., all rights reserved. +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. # diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/database.py b/airbyte-integrations/connectors/source-firebolt/source_firebolt/database.py index 6d133fb3cd6c..98681d0b38a4 100644 --- a/airbyte-integrations/connectors/source-firebolt/source_firebolt/database.py +++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/database.py @@ -4,7 +4,8 @@ import json -from typing import Any, Dict, List +from collections import defaultdict +from typing import Any, Dict, List, Tuple from airbyte_cdk.logger import AirbyteLogger from firebolt.async_db import Connection as AsyncConnection @@ -72,23 +73,21 @@ async def establish_async_connection(config: json, logger: AirbyteLogger) -> Asy return connection -async def get_firebolt_tables(connection: AsyncConnection) -> List[str]: +def get_table_structure(connection: Connection) -> Dict[str, List[Tuple]]: """ - Fetch a list of tables that are compatible with Airbyte. - Currently this includes Fact and Dimension tables + Get columns and their types for all the tables and views in the database. :param connection: Connection object connected to a database - :return: List of table names - """ - query = """ - SELECT - table_name - FROM - information_schema.tables - WHERE - "table_type" IN ('FACT', 'DIMENSION') + :return: Dictionary containing column list of each table """ + column_mapping = defaultdict(list) cursor = connection.cursor() - await cursor.execute(query) - return [table[0] for table in await cursor.fetchall()] + cursor.execute( + "SELECT table_name, column_name, data_type, is_nullable FROM information_schema.columns " + "WHERE table_name NOT IN (SELECT table_name FROM information_schema.tables WHERE table_type IN ('EXTERNAL', 'CATALOG'))" + ) + for t_name, c_name, c_type, nullable in cursor.fetchall(): + column_mapping[t_name].append((c_name, c_type, nullable)) + cursor.close() + return column_mapping diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/source.py b/airbyte-integrations/connectors/source-firebolt/source_firebolt/source.py index b534ffb734b0..b177b88d5a3a 100644 --- a/airbyte-integrations/connectors/source-firebolt/source_firebolt/source.py +++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/source.py @@ -3,7 +3,6 @@ # import json -from asyncio import gather, get_event_loop from typing import Dict, Generator from airbyte_cdk.logger import AirbyteLogger @@ -17,36 +16,13 @@ SyncMode, ) from airbyte_cdk.sources import Source -from firebolt.async_db import Connection as AsyncConnection -from .database import establish_async_connection, establish_connection, get_firebolt_tables +from .database import establish_connection, get_table_structure from .utils import airbyte_message_from_data, convert_type SUPPORTED_SYNC_MODES = [SyncMode.full_refresh] -async def get_table_stream(connection: AsyncConnection, table: str) -> AirbyteStream: - """ - Get AirbyteStream for a particular table with table structure defined. - - :param connection: Connection object connected to a database - - :return: AirbyteStream object containing the table structure - """ - column_mapping = {} - cursor = connection.cursor() - await cursor.execute(f"SHOW COLUMNS {table}") - for t_name, c_name, c_type, nullable in await cursor.fetchall(): - airbyte_type = convert_type(c_type, nullable) - column_mapping[c_name] = airbyte_type - cursor.close() - json_schema = { - "type": "object", - "properties": column_mapping, - } - return AirbyteStream(name=table, json_schema=json_schema, supported_sync_modes=SUPPORTED_SYNC_MODES) - - class SourceFirebolt(Source): def check(self, logger: AirbyteLogger, config: json) -> AirbyteConnectionStatus: """ @@ -87,14 +63,17 @@ def discover(self, logger: AirbyteLogger, config: json) -> AirbyteCatalog: by their names and types) """ - async def get_streams(): - async with await establish_async_connection(config, logger) as connection: - tables = await get_firebolt_tables(connection) - logger.info(f"Found {len(tables)} available tables.") - return await gather(*[get_table_stream(connection, table) for table in tables]) - - loop = get_event_loop() - streams = loop.run_until_complete(get_streams()) + with establish_connection(config, logger) as connection: + structure = get_table_structure(connection) + + streams = [] + for table, columns in structure.items(): + column_mapping = {c_name: convert_type(c_type, nullable) for c_name, c_type, nullable in columns} + json_schema = { + "type": "object", + "properties": column_mapping, + } + streams.append(AirbyteStream(name=table, json_schema=json_schema, supported_sync_modes=SUPPORTED_SYNC_MODES)) logger.info(f"Provided {len(streams)} streams to the Aribyte Catalog.") return AirbyteCatalog(streams=streams) diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/spec.json b/airbyte-integrations/connectors/source-firebolt/source_firebolt/spec.json index 48b100dab629..138056d81932 100644 --- a/airbyte-integrations/connectors/source-firebolt/source_firebolt/spec.json +++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/spec.json @@ -5,7 +5,7 @@ "title": "Firebolt Spec", "type": "object", "required": ["username", "password", "database"], - "additionalProperties": false, + "additionalProperties": true, "properties": { "username": { "type": "string", @@ -16,7 +16,8 @@ "password": { "type": "string", "title": "Password", - "description": "Firebolt password." + "description": "Firebolt password.", + "airbyte_secret": true }, "account": { "type": "string", diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/utils.py b/airbyte-integrations/connectors/source-firebolt/source_firebolt/utils.py index f5f9e832b199..e50d7ddcf365 100644 --- a/airbyte-integrations/connectors/source-firebolt/source_firebolt/utils.py +++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/utils.py @@ -52,6 +52,10 @@ def convert_type(fb_type: str, nullable: bool) -> Dict[str, Union[str, Dict]]: airbyte_type = convert_type(inner_type, nullable=True) result = {"type": "array", "items": airbyte_type} else: + # Strip complex type info e.g. DECIMAL(8,23) -> DECIMAL + fb_type = fb_type[: fb_type.find("(")] if "(" in fb_type else fb_type + # Remove NULL/NOT NULL from child type of an array e.g. ARRAY(INT NOT NULL) + fb_type = fb_type.removesuffix(" NOT NULL").removesuffix(" NULL") result = map.get(fb_type.upper(), {"type": "string"}) if nullable: result["type"] = ["null", result["type"]] diff --git a/airbyte-integrations/connectors/source-firebolt/unit_tests/test_firebolt_source.py b/airbyte-integrations/connectors/source-firebolt/unit_tests/test_firebolt_source.py index 19cf1c8d2232..ed779a235a10 100644 --- a/airbyte-integrations/connectors/source-firebolt/unit_tests/test_firebolt_source.py +++ b/airbyte-integrations/connectors/source-firebolt/unit_tests/test_firebolt_source.py @@ -4,7 +4,7 @@ from datetime import date, datetime from decimal import Decimal -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import MagicMock, patch from airbyte_cdk.models import ( AirbyteMessage, @@ -18,15 +18,8 @@ Type, ) from pytest import fixture, mark -from source_firebolt.database import parse_config -from source_firebolt.source import ( - SUPPORTED_SYNC_MODES, - SourceFirebolt, - convert_type, - establish_connection, - get_firebolt_tables, - get_table_stream, -) +from source_firebolt.database import get_table_structure, parse_config +from source_firebolt.source import SUPPORTED_SYNC_MODES, SourceFirebolt, convert_type, establish_connection from source_firebolt.utils import airbyte_message_from_data, format_fetch_result @@ -82,12 +75,12 @@ def stream2() -> AirbyteStream: @fixture def table1_structure(): - return [("table1", "col1", "STRING", 0), ("table1", "col2", "INT", 0)] + return [("col1", "STRING", 0), ("col2", "INT", 0)] @fixture def table2_structure(): - return [("table2", "col3", "ARRAY", 0), ("table2", "col4", "DECIMAL", 0)] + return [("col3", "ARRAY", 0), ("col4", "DECIMAL", 0)] @fixture @@ -95,14 +88,6 @@ def logger(): return MagicMock() -@fixture(name="mock_connection") -def async_connection_cursor_mock(): - connection = MagicMock() - cursor = AsyncMock() - connection.cursor.return_value = cursor - return connection, cursor - - def test_parse_config(config, logger): config["engine"] = "override_engine" result = parse_config(config, logger) @@ -130,6 +115,7 @@ def test_connection(mock_connection, config, config_no_engine, logger): ("INT", False, {"type": "integer"}), ("int", False, {"type": "integer"}), ("LONG", False, {"type": "integer"}), + ("DECIMAL(4,15)", False, {"type": "string", "airbyte_type": "big_number"}), ( "TIMESTAMP", False, @@ -139,7 +125,7 @@ def test_connection(mock_connection, config, config_no_engine, logger): "airbyte_type": "timestamp_without_timezone", }, ), - ("ARRAY(ARRAY(INT))", False, {"type": "array", "items": {"type": "array", "items": {"type": ["null", "integer"]}}}), + ("ARRAY(ARRAY(INT NOT NULL))", False, {"type": "array", "items": {"type": "array", "items": {"type": ["null", "integer"]}}}), ("int", True, {"type": ["null", "integer"]}), ("DUMMY", False, {"type": "string"}), ("boolean", False, {"type": "integer"}), @@ -192,22 +178,6 @@ def test_airbyte_message_from_data_no_data(): assert result is None -@mark.asyncio -async def test_get_firebolt_tables(mock_connection): - connection, cursor = mock_connection - cursor.fetchall.return_value = [("table1",), ("table2",)] - result = await get_firebolt_tables(connection) - assert result == ["table1", "table2"] - - -@mark.asyncio -async def test_get_table_stream(mock_connection, table1_structure, stream1): - connection, cursor = mock_connection - cursor.fetchall.return_value = table1_structure - result = await get_table_stream(connection, "table1") - assert result == stream1 - - @patch("source_firebolt.source.establish_connection") def test_check(mock_connection, config, logger): source = SourceFirebolt() @@ -218,21 +188,19 @@ def test_check(mock_connection, config, logger): assert status.status == Status.FAILED -@patch("source_firebolt.source.get_table_stream") -@patch("source_firebolt.source.establish_async_connection") +@patch("source_firebolt.source.get_table_structure") +@patch("source_firebolt.source.establish_connection") def test_discover( mock_establish_connection, - mock_get_stream, - mock_connection, + mock_get_structure, config, stream1, stream2, + table1_structure, + table2_structure, logger, ): - connection, cursor = mock_connection - cursor.fetchall.return_value = ["table1", "table2"] - mock_establish_connection.return_value.__aenter__.return_value = connection - mock_get_stream.side_effect = [stream1, stream2] + mock_get_structure.return_value = {"table1": table1_structure, "table2": table2_structure} source = SourceFirebolt() catalog = source.discover(logger, config) @@ -240,7 +208,6 @@ def test_discover( assert catalog.streams[1].name == "table2" assert catalog.streams[0].json_schema == stream1.json_schema assert catalog.streams[1].json_schema == stream2.json_schema - mock_establish_connection.assert_awaited_once_with(config, logger) @patch("source_firebolt.source.establish_connection") @@ -292,3 +259,14 @@ def test_read_special_types_no_state(mock_connection, config, stream2, logger): "col3": ["2019-01-01T20:12:02", "2019-02-01T20:12:02"], "col4": "1231232.123459999990457054844258706536", } + + +def test_get_table_structure(table1_structure, table2_structure): + # Query results contain table names as well + table1_query_result = [("table1",) + (item) for item in table1_structure] + table2_query_result = [("table2",) + (item) for item in table2_structure] + connection = MagicMock() + connection.cursor().fetchall.return_value = table1_query_result + table2_query_result + result = get_table_structure(connection) + assert result["table1"] == table1_structure + assert result["table2"] == table2_structure diff --git a/airbyte-integrations/connectors/source-gridly/Dockerfile b/airbyte-integrations/connectors/source-gridly/Dockerfile index f8f0fba5a280..c1f1ebe4f28e 100644 --- a/airbyte-integrations/connectors/source-gridly/Dockerfile +++ b/airbyte-integrations/connectors/source-gridly/Dockerfile @@ -34,5 +34,5 @@ COPY source_gridly ./source_gridly ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.version=0.1.1 LABEL io.airbyte.name=airbyte/source-gridly diff --git a/airbyte-integrations/connectors/source-gridly/acceptance-test-config.yml b/airbyte-integrations/connectors/source-gridly/acceptance-test-config.yml index db3e7174fe01..29f0507b7494 100644 --- a/airbyte-integrations/connectors/source-gridly/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-gridly/acceptance-test-config.yml @@ -4,6 +4,8 @@ connector_image: airbyte/source-gridly:dev tests: spec: - spec_path: "source_gridly/spec.yaml" + backward_compatibility_tests_config: + disable_for_version: "0.1.0" connection: - config_path: "secrets/config.json" status: "succeed" diff --git a/airbyte-integrations/connectors/source-gridly/source_gridly/spec.yaml b/airbyte-integrations/connectors/source-gridly/source_gridly/spec.yaml index f03e53aca457..f6bfc172d03c 100644 --- a/airbyte-integrations/connectors/source-gridly/source_gridly/spec.yaml +++ b/airbyte-integrations/connectors/source-gridly/source_gridly/spec.yaml @@ -5,6 +5,7 @@ connectionSpecification: type: object required: - api_key + - grid_id properties: api_key: type: string diff --git a/airbyte-integrations/connectors/source-jdbc/src/main/java/io/airbyte/integrations/source/jdbc/AbstractJdbcSource.java b/airbyte-integrations/connectors/source-jdbc/src/main/java/io/airbyte/integrations/source/jdbc/AbstractJdbcSource.java index 3c2461cfae31..dbde54c5cdb9 100644 --- a/airbyte-integrations/connectors/source-jdbc/src/main/java/io/airbyte/integrations/source/jdbc/AbstractJdbcSource.java +++ b/airbyte-integrations/connectors/source-jdbc/src/main/java/io/airbyte/integrations/source/jdbc/AbstractJdbcSource.java @@ -621,5 +621,4 @@ protected List identifyStreamsToSnapshot(final Configur .map(Jsons::clone) .collect(Collectors.toList()); } - } diff --git a/airbyte-integrations/connectors/source-kafka/Dockerfile b/airbyte-integrations/connectors/source-kafka/Dockerfile index 6b1e8104bae8..434bec9868ff 100644 --- a/airbyte-integrations/connectors/source-kafka/Dockerfile +++ b/airbyte-integrations/connectors/source-kafka/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-kafka COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.2.2 +LABEL io.airbyte.version=0.2.3 LABEL io.airbyte.name=airbyte/source-kafka diff --git a/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/AvroFormat.java b/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/AvroFormat.java index 2b593278c848..0f7e10db5df4 100644 --- a/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/AvroFormat.java +++ b/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/AvroFormat.java @@ -145,6 +145,12 @@ public AutoCloseableIterator read() { getTopicsToSubscribe().forEach(topic -> poll_lookup.put(topic, 0)); while (true) { final ConsumerRecords consumerRecords = consumer.poll(Duration.of(polling_time, ChronoUnit.MILLIS)); + consumerRecords.forEach(record -> { + record_count.getAndIncrement(); + recordsList.add(record); + }); + consumer.commitAsync(); + if (consumerRecords.count() == 0) { consumer.assignment().stream().map(record -> record.topic()).distinct().forEach( topic -> { @@ -160,12 +166,6 @@ public AutoCloseableIterator read() { LOGGER.info("Max record count is reached !!"); break; } - - consumerRecords.forEach(record -> { - record_count.getAndIncrement(); - recordsList.add(record); - }); - consumer.commitAsync(); } consumer.close(); final Iterator> iterator = recordsList.iterator(); diff --git a/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/JsonFormat.java b/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/JsonFormat.java index e5670b96bd69..3acf0e7e46a7 100644 --- a/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/JsonFormat.java +++ b/airbyte-integrations/connectors/source-kafka/src/main/java/io/airbyte/integrations/source/kafka/format/JsonFormat.java @@ -110,6 +110,12 @@ public AutoCloseableIterator read() { getTopicsToSubscribe().forEach(topic -> poll_lookup.put(topic, 0)); while (true) { final ConsumerRecords consumerRecords = consumer.poll(Duration.of(polling_time, ChronoUnit.MILLIS)); + consumerRecords.forEach(record -> { + record_count.getAndIncrement(); + recordsList.add(record); + }); + consumer.commitAsync(); + if (consumerRecords.count() == 0) { consumer.assignment().stream().map(record -> record.topic()).distinct().forEach( topic -> { @@ -125,12 +131,6 @@ public AutoCloseableIterator read() { LOGGER.info("Max record count is reached !!"); break; } - - consumerRecords.forEach(record -> { - record_count.getAndIncrement(); - recordsList.add(record); - }); - consumer.commitAsync(); } consumer.close(); final Iterator> iterator = recordsList.iterator(); diff --git a/airbyte-integrations/connectors/source-mailchimp/Dockerfile b/airbyte-integrations/connectors/source-mailchimp/Dockerfile index 671746b197fd..84fe47f2ab50 100644 --- a/airbyte-integrations/connectors/source-mailchimp/Dockerfile +++ b/airbyte-integrations/connectors/source-mailchimp/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.15 +LABEL io.airbyte.version=0.3.0 LABEL io.airbyte.name=airbyte/source-mailchimp diff --git a/airbyte-integrations/connectors/source-mailchimp/source_mailchimp/streams.py b/airbyte-integrations/connectors/source-mailchimp/source_mailchimp/streams.py index 8cf13347017f..af1fa6b12a4b 100644 --- a/airbyte-integrations/connectors/source-mailchimp/source_mailchimp/streams.py +++ b/airbyte-integrations/connectors/source-mailchimp/source_mailchimp/streams.py @@ -111,7 +111,7 @@ def path(self, **kwargs) -> str: class EmailActivity(IncrementalMailChimpStream): cursor_field = "timestamp" data_field = "emails" - primary_key = None + primary_key = ["timestamp", "email_id", "action"] def stream_slices(self, **kwargs): campaign_stream = Campaigns(authenticator=self.authenticator) diff --git a/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile index f432e604e8d6..c4ef1974c963 100644 --- a/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile @@ -16,6 +16,6 @@ ENV APPLICATION source-mysql-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.14 +LABEL io.airbyte.version=1.0.15 LABEL io.airbyte.name=airbyte/source-mysql-strict-encrypt diff --git a/airbyte-integrations/connectors/source-mysql/Dockerfile b/airbyte-integrations/connectors/source-mysql/Dockerfile index 803a8528b87d..cd6eada119a6 100644 --- a/airbyte-integrations/connectors/source-mysql/Dockerfile +++ b/airbyte-integrations/connectors/source-mysql/Dockerfile @@ -16,6 +16,6 @@ ENV APPLICATION source-mysql COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.14 +LABEL io.airbyte.version=1.0.15 LABEL io.airbyte.name=airbyte/source-mysql diff --git a/airbyte-integrations/connectors/source-mysql/src/main/java/io/airbyte/integrations/source/mysql/helpers/CdcConfigurationHelper.java b/airbyte-integrations/connectors/source-mysql/src/main/java/io/airbyte/integrations/source/mysql/helpers/CdcConfigurationHelper.java index cd56c7fdae65..ece36cf5b27e 100644 --- a/airbyte-integrations/connectors/source-mysql/src/main/java/io/airbyte/integrations/source/mysql/helpers/CdcConfigurationHelper.java +++ b/airbyte-integrations/connectors/source-mysql/src/main/java/io/airbyte/integrations/source/mysql/helpers/CdcConfigurationHelper.java @@ -5,8 +5,10 @@ package io.airbyte.integrations.source.mysql.helpers; import com.fasterxml.jackson.databind.JsonNode; +import io.airbyte.commons.exceptions.ConfigErrorException; import io.airbyte.commons.functional.CheckedConsumer; import io.airbyte.db.jdbc.JdbcDatabase; +import java.sql.SQLException; import java.time.ZoneId; import java.util.List; import java.util.Optional; @@ -38,12 +40,28 @@ public class CdcConfigurationHelper { * @return list of List> */ public static List> getCheckOperations() { - return List.of(getCheckOperation(LOG_BIN, "ON"), + return List.of(getMasterStatusOperation(), + getCheckOperation(LOG_BIN, "ON"), getCheckOperation(BINLOG_FORMAT, "ROW"), getCheckOperation(BINLOG_ROW_IMAGE, "FULL")); } + // Checks whether the user has REPLICATION CLIENT privilege needed to query status information about + // the binary log files, which are needed for CDC. + private static CheckedConsumer getMasterStatusOperation() { + return database -> { + try { + database.unsafeResultSetQuery( + connection -> connection.createStatement().executeQuery("SHOW MASTER STATUS"), + resultSet -> resultSet); + } catch (final SQLException e) { + throw new ConfigErrorException("Please grant REPLICATION CLIENT privilege, so that binary log files are available" + + " for CDC mode."); + } + }; + } + private static CheckedConsumer getCheckOperation(final String name, final String value) { return database -> { final List result = database.queryStrings( diff --git a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcBinlogsMySqlSourceDatatypeTest.java b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcBinlogsMySqlSourceDatatypeTest.java index b0bbe03185f5..3b5a43206a2f 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcBinlogsMySqlSourceDatatypeTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcBinlogsMySqlSourceDatatypeTest.java @@ -45,7 +45,7 @@ protected List runRead(final ConfiguredAirbyteCatalog configured } @Override - protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + protected void postSetup() throws Exception { final Database database = setupDatabase(); initTests(); for (final TestDataHolder test : testDataHolders) { diff --git a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshKeyMySqlSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshKeyMySqlSourceAcceptanceTest.java index ab028c24a72f..b2f950976e31 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshKeyMySqlSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshKeyMySqlSourceAcceptanceTest.java @@ -4,10 +4,26 @@ package io.airbyte.integrations.io.airbyte.integration_tests.sources; +import io.airbyte.commons.features.EnvVariableFeatureFlags; +import io.airbyte.integrations.standardtest.source.TestDestinationEnv; import java.nio.file.Path; +import org.junit.jupiter.api.extension.ExtendWith; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +@ExtendWith(SystemStubsExtension.class) public class SshKeyMySqlSourceAcceptanceTest extends AbstractSshMySqlSourceAcceptanceTest { + @SystemStub + private EnvironmentVariables environmentVariables; + + @Override + protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + super.setupEnvironment(environment); + } + @Override public Path getConfigFilePath() { return Path.of("secrets/ssh-key-repl-config.json"); diff --git a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java index 647f40dc90a7..e2386f69645e 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java @@ -4,10 +4,26 @@ package io.airbyte.integrations.io.airbyte.integration_tests.sources; +import io.airbyte.commons.features.EnvVariableFeatureFlags; +import io.airbyte.integrations.standardtest.source.TestDestinationEnv; import java.nio.file.Path; +import org.junit.jupiter.api.extension.ExtendWith; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +@ExtendWith(SystemStubsExtension.class) public class SshPasswordMySqlSourceAcceptanceTest extends AbstractSshMySqlSourceAcceptanceTest { + @SystemStub + private EnvironmentVariables environmentVariables; + + @Override + protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + super.setupEnvironment(environment); + } + @Override public Path getConfigFilePath() { return Path.of("secrets/ssh-pwd-repl-config.json"); diff --git a/airbyte-integrations/connectors/source-mysql/src/test/java/io/airbyte/integrations/source/mysql/CdcMysqlSourceTest.java b/airbyte-integrations/connectors/source-mysql/src/test/java/io/airbyte/integrations/source/mysql/CdcMysqlSourceTest.java index f23848336e05..9ec0e5b076cd 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test/java/io/airbyte/integrations/source/mysql/CdcMysqlSourceTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test/java/io/airbyte/integrations/source/mysql/CdcMysqlSourceTest.java @@ -32,6 +32,8 @@ import io.airbyte.integrations.base.Source; import io.airbyte.integrations.debezium.CdcSourceTest; import io.airbyte.integrations.debezium.CdcTargetPosition; +import io.airbyte.protocol.models.AirbyteConnectionStatus; +import io.airbyte.protocol.models.AirbyteConnectionStatus.Status; import io.airbyte.protocol.models.AirbyteMessage; import io.airbyte.protocol.models.AirbyteRecordMessage; import io.airbyte.protocol.models.AirbyteStateMessage; @@ -106,6 +108,10 @@ private void revokeAllPermissions() { executeQuery("REVOKE ALL PRIVILEGES, GRANT OPTION FROM " + container.getUsername() + "@'%';"); } + private void revokeReplicationClientPermission() { + executeQuery("REVOKE REPLICATION CLIENT ON *.* FROM " + container.getUsername() + "@'%';"); + } + private void grantCorrectPermissions() { executeQuery("GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO " + container.getUsername() + "@'%';"); } @@ -213,6 +219,16 @@ protected String randomTableSchema() { return MODELS_SCHEMA; } + @Test + protected void syncWithReplicationClientPrivilegeRevokedFailsCheck() throws Exception { + revokeReplicationClientPermission(); + final AirbyteConnectionStatus status = getSource().check(getConfig()); + final String expectedErrorMessage = "Please grant REPLICATION CLIENT privilege, so that binary log files are available" + + " for CDC mode."; + assertTrue(status.getStatus().equals(Status.FAILED)); + assertTrue(status.getMessage().contains(expectedErrorMessage)); + } + @Test protected void syncShouldHandlePurgedLogsGracefully() throws Exception { diff --git a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile index 64daa81e4951..c7cd569afcb9 100644 --- a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.30 +LABEL io.airbyte.version=1.0.31 LABEL io.airbyte.name=airbyte/source-postgres-strict-encrypt diff --git a/airbyte-integrations/connectors/source-postgres/Dockerfile b/airbyte-integrations/connectors/source-postgres/Dockerfile index 91b072f1a968..d209143dd0e9 100644 --- a/airbyte-integrations/connectors/source-postgres/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.30 +LABEL io.airbyte.version=1.0.31 LABEL io.airbyte.name=airbyte/source-postgres diff --git a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java index 6998dbd6a789..e57254a6e7d8 100644 --- a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java +++ b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import io.airbyte.commons.features.EnvVariableFeatureFlags; @@ -70,6 +71,7 @@ import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,6 +92,20 @@ public class PostgresSource extends AbstractJdbcSource implements public static final String SSL_KEY = "sslkey"; public static final String SSL_PASSWORD = "sslpassword"; public static final String MODE = "mode"; + public static final String NULL_CURSOR_VALUE_WITH_SCHEMA = + """ + SELECT + (EXISTS (SELECT FROM information_schema.columns WHERE table_schema = '%s' AND table_name = '%s' AND is_nullable = 'YES' AND column_name = '%s')) + AND + (EXISTS (SELECT from %s.\"%s\" where \"%s\" IS NULL LIMIT 1)) AS %s + """; + public static final String NULL_CURSOR_VALUE_NO_SCHEMA = + """ + SELECT + (EXISTS (SELECT FROM information_schema.columns WHERE table_name = '%s' AND is_nullable = 'YES' AND column_name = '%s')) + AND + (EXISTS (SELECT from \"%s\" where \"%s\" IS NULL LIMIT 1)) AS %s + """; private List schemas; private final FeatureFlags featureFlags; private static final Set INVALID_CDC_SSL_MODES = ImmutableSet.of("allow", "prefer"); @@ -468,7 +484,7 @@ public static void main(final String[] args) throws Exception { public AirbyteConnectionStatus check(final JsonNode config) throws Exception { if (PostgresUtils.isCdc(config)) { if (config.has(SSL_MODE) && config.get(SSL_MODE).has(MODE)) { - String sslModeValue = config.get(SSL_MODE).get(MODE).asText(); + final String sslModeValue = config.get(SSL_MODE).get(MODE).asText(); if (INVALID_CDC_SSL_MODES.contains(sslModeValue)) { return new AirbyteConnectionStatus() .withStatus(Status.FAILED) @@ -500,4 +516,24 @@ protected static String toSslJdbcParamInternal(final SslMode sslMode) { return result; } + @Override + protected boolean verifyCursorColumnValues(final JdbcDatabase database, final String schema, final String tableName, final String columnName) throws SQLException { + final String query; + final String resultColName = "nullValue"; + // Query: Only if cursor column allows null values, query whether it contains one + if (StringUtils.isNotBlank(schema)) { + query = String.format(NULL_CURSOR_VALUE_WITH_SCHEMA, + schema, tableName, columnName, schema, tableName, columnName, resultColName); + } else { + query = String.format(NULL_CURSOR_VALUE_NO_SCHEMA, + tableName, columnName, tableName, columnName, resultColName); + } + LOGGER.debug("null value query: {}", query); + final List jsonNodes = database.bufferedResultSetQuery(conn -> conn.createStatement().executeQuery(query), + resultSet -> JdbcUtils.getDefaultSourceOperations().rowToJson(resultSet)); + Preconditions.checkState(jsonNodes.size() == 1); + final boolean nullValExist = jsonNodes.get(0).get(resultColName.toLowerCase()).booleanValue(); // For some reason value in node is lowercase + LOGGER.debug("null value exist: {}", nullValExist); + return !nullValExist; + } } diff --git a/airbyte-integrations/connectors/source-postgres/src/main/resources/spec.json b/airbyte-integrations/connectors/source-postgres/src/main/resources/spec.json index 31c5acf4a36b..9e5a16a33181 100644 --- a/airbyte-integrations/connectors/source-postgres/src/main/resources/spec.json +++ b/airbyte-integrations/connectors/source-postgres/src/main/resources/spec.json @@ -247,7 +247,7 @@ "title": "Plugin", "description": "A logical decoding plugin installed on the PostgreSQL server. The `pgoutput` plugin is used by default. If the replication table contains a lot of big jsonb values it is recommended to use `wal2json` plugin. Read more about selecting replication plugins.", "enum": ["pgoutput", "wal2json"], - "const": "pgoutput", + "default": "pgoutput", "order": 2 }, "replication_slot": { diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractPostgresSourceSSLCertificateAcceptanceTest.java b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractPostgresSourceSSLCertificateAcceptanceTest.java index 2d14210e4c76..b41842a02ccc 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractPostgresSourceSSLCertificateAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractPostgresSourceSSLCertificateAcceptanceTest.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.json.Jsons; import io.airbyte.db.Database; import io.airbyte.db.PostgresUtils; @@ -29,15 +30,22 @@ import java.util.List; import org.jooq.DSLContext; import org.jooq.SQLDialect; +import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +@ExtendWith(SystemStubsExtension.class) public abstract class AbstractPostgresSourceSSLCertificateAcceptanceTest extends SourceAcceptanceTest { - private static final String STREAM_NAME = "public.id_and_name"; - private static final String STREAM_NAME2 = "public.starships"; - private static final String STREAM_NAME_MATERIALIZED_VIEW = "public.testview"; - + private static final String STREAM_NAME = "id_and_name"; + private static final String STREAM_NAME2 = "starships"; + private static final String STREAM_NAME_MATERIALIZED_VIEW = "testview"; + private static final String SCHEMA_NAME = "public"; + @SystemStub + private EnvironmentVariables environmentVariables; private PostgreSQLContainer container; private JsonNode config; protected static final String PASSWORD = "Passw0rd"; @@ -45,6 +53,8 @@ public abstract class AbstractPostgresSourceSSLCertificateAcceptanceTest extends @Override protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + container = new PostgreSQLContainer<>(DockerImageName.parse("postgres:bullseye") .asCompatibleSubstituteFor("postgres")); container.start(); @@ -116,28 +126,31 @@ protected ConfiguredAirbyteCatalog getConfiguredCatalog() { .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME, + STREAM_NAME, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME2, + STREAM_NAME2, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME_MATERIALIZED_VIEW, + STREAM_NAME_MATERIALIZED_VIEW, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))))); + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))))); } @Override diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshPostgresSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshPostgresSourceAcceptanceTest.java index 58e596e07965..72f42eae6232 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshPostgresSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshPostgresSourceAcceptanceTest.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.functional.CheckedFunction; import io.airbyte.commons.json.Jsons; import io.airbyte.db.Database; @@ -28,13 +29,21 @@ import java.util.HashMap; import java.util.List; import org.jooq.SQLDialect; +import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.containers.Network; import org.testcontainers.containers.PostgreSQLContainer; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +@ExtendWith(SystemStubsExtension.class) public abstract class AbstractSshPostgresSourceAcceptanceTest extends SourceAcceptanceTest { - private static final String STREAM_NAME = "public.id_and_name"; - private static final String STREAM_NAME2 = "public.starships"; + private static final String STREAM_NAME = "id_and_name"; + private static final String STREAM_NAME2 = "starships"; + private static final String SCHEMA_NAME = "public"; + @SystemStub + private EnvironmentVariables environmentVariables; private static final Network network = Network.newNetwork(); private static JsonNode config; private final SshBastionContainer bastion = new SshBastionContainer(); @@ -74,6 +83,7 @@ private static Database getDatabaseFromConfig(final JsonNode config) { // requiring data to already be in place. @Override protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); startTestContainers(); config = bastion.getTunnelConfig(getTunnelMethod(), bastion.getBasicDbConfigBuider(db, List.of("public"))); populateDatabaseTestData(); @@ -118,19 +128,21 @@ protected ConfiguredAirbyteCatalog getConfiguredCatalog() { .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME, + STREAM_NAME, SCHEMA_NAME, Field.of("id", JsonSchemaType.INTEGER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME2, + STREAM_NAME2, SCHEMA_NAME, Field.of("id", JsonSchemaType.INTEGER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))))); + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))))); } @Override diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcWalLogsPostgresSourceDatatypeTest.java b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcWalLogsPostgresSourceDatatypeTest.java index 9630b047dc1a..857f0ec84061 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcWalLogsPostgresSourceDatatypeTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/CdcWalLogsPostgresSourceDatatypeTest.java @@ -42,7 +42,7 @@ protected List runRead(final ConfiguredAirbyteCatalog configured } @Override - protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + protected void postSetup() throws Exception { final Database database = setupDatabase(); initTests(); for (final TestDataHolder test : testDataHolders) { diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceAcceptanceTest.java index 09c1adf3a56b..f710fa3d3301 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceAcceptanceTest.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.json.Jsons; import io.airbyte.db.Database; import io.airbyte.db.factory.DSLContextFactory; @@ -35,13 +36,20 @@ import org.jooq.DSLContext; import org.jooq.SQLDialect; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.containers.PostgreSQLContainer; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +@ExtendWith(SystemStubsExtension.class) public class PostgresSourceAcceptanceTest extends SourceAcceptanceTest { - - private static final String STREAM_NAME = "public.id_and_name"; - private static final String STREAM_NAME2 = "public.starships"; - private static final String STREAM_NAME_MATERIALIZED_VIEW = "public.testview"; + private static final String STREAM_NAME = "id_and_name"; + private static final String STREAM_NAME2 = "starships"; + private static final String STREAM_NAME_MATERIALIZED_VIEW = "testview"; + private static final String SCHEMA_NAME = "public"; + @SystemStub + private EnvironmentVariables environmentVariables; public static final String LIMIT_PERMISSION_SCHEMA = "limit_perm_schema"; public static final String LIMIT_PERMISSION_ROLE = "limit_perm_role"; public static final String LIMIT_PERMISSION_ROLE_PASSWORD = "test"; @@ -53,11 +61,13 @@ public class PostgresSourceAcceptanceTest extends SourceAcceptanceTest { @Override protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + container = new PostgreSQLContainer<>("postgres:13-alpine"); container.start(); - String username = container.getUsername(); - String password = container.getPassword(); - List schemas = List.of("public"); + final String username = container.getUsername(); + final String password = container.getPassword(); + final List schemas = List.of("public"); config = getConfig(username, password, schemas); try (final DSLContext dslContext = DSLContextFactory.create( config.get(JdbcUtils.USERNAME_KEY).asText(), @@ -82,7 +92,7 @@ protected void setupEnvironment(final TestDestinationEnv environment) throws Exc } } - private JsonNode getConfig(String username, String password, List schemas) { + private JsonNode getConfig(final String username, final String password, final List schemas) { final JsonNode replicationMethod = Jsons.jsonNode(ImmutableMap.builder() .put("method", "Standard") .build()); @@ -159,19 +169,19 @@ public void testDiscoverWithRevokingSchemaPermissions() throws Exception { config = getConfig(LIMIT_PERMISSION_ROLE, LIMIT_PERMISSION_ROLE_PASSWORD, List.of(LIMIT_PERMISSION_SCHEMA)); runDiscover(); - AirbyteCatalog lastPersistedCatalogSecond = getLastPersistedCatalog(); + final AirbyteCatalog lastPersistedCatalogSecond = getLastPersistedCatalog(); final String assertionMessageWithoutPermission = "Expected no streams after discover for user without schema permissions"; assertTrue(lastPersistedCatalogSecond.getStreams().isEmpty(), assertionMessageWithoutPermission); } - private void revokeSchemaPermissions(Database database) throws SQLException { + private void revokeSchemaPermissions(final Database database) throws SQLException { database.query(ctx -> { ctx.fetch(String.format("REVOKE USAGE ON schema %s FROM %s;", LIMIT_PERMISSION_SCHEMA, LIMIT_PERMISSION_ROLE)); return null; }); } - private void prepareEnvForUserWithoutPermissions(Database database) throws SQLException { + private void prepareEnvForUserWithoutPermissions(final Database database) throws SQLException { database.query(ctx -> { ctx.fetch(String.format("CREATE ROLE %s WITH LOGIN PASSWORD '%s';", LIMIT_PERMISSION_ROLE, LIMIT_PERMISSION_ROLE_PASSWORD)); ctx.fetch(String.format("CREATE SCHEMA %s;", LIMIT_PERMISSION_SCHEMA)); @@ -191,28 +201,31 @@ private ConfiguredAirbyteCatalog getCommonConfigCatalog() { .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME, + STREAM_NAME, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME2, + STREAM_NAME2, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME_MATERIALIZED_VIEW, + STREAM_NAME_MATERIALIZED_VIEW, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))))); + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))))); } private ConfiguredAirbyteCatalog getLimitPermissionConfiguredCatalog() { @@ -222,7 +235,7 @@ private ConfiguredAirbyteCatalog getLimitPermissionConfiguredCatalog() { .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - LIMIT_PERMISSION_SCHEMA + "." + "id_and_name", + "id_and_name", LIMIT_PERMISSION_SCHEMA, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))))); diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceStrictEncryptAcceptanceTest.java b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceStrictEncryptAcceptanceTest.java index ff22ae68c049..bc83ed375cd1 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceStrictEncryptAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceStrictEncryptAcceptanceTest.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.json.Jsons; import io.airbyte.commons.resources.MoreResources; import io.airbyte.db.Database; @@ -28,23 +29,28 @@ import io.airbyte.protocol.models.JsonSchemaType; import io.airbyte.protocol.models.SyncMode; import java.util.HashMap; +import java.util.List; import org.jooq.DSLContext; import org.jooq.SQLDialect; -import org.junitpioneer.jupiter.SetEnvironmentVariable; +import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; /** * This class is copied from source-postgres-strict-encrypt. The original file can be deleted * completely once the migration of multi-variant connector is done. */ -@SetEnvironmentVariable(key = "DEPLOYMENT_MODE", - value = "CLOUD") +@ExtendWith(SystemStubsExtension.class) public class PostgresSourceStrictEncryptAcceptanceTest extends SourceAcceptanceTest { - private static final String STREAM_NAME = "public.id_and_name"; - private static final String STREAM_NAME2 = "public.starships"; - + private static final String STREAM_NAME = "id_and_name"; + private static final String STREAM_NAME2 = "starships"; + private static final String SCHEMA_NAME = "public"; + @SystemStub + private EnvironmentVariables environmentVariables; private PostgreSQLContainer container; private JsonNode config; @@ -53,6 +59,8 @@ public class PostgresSourceStrictEncryptAcceptanceTest extends SourceAcceptanceT @Override protected void setupEnvironment(final TestDestinationEnv environment) throws Exception { + environmentVariables.set("DEPLOYMENT_MODE", "CLOUD"); + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); container = new PostgreSQLContainer<>(DockerImageName.parse("postgres:bullseye") .asCompatibleSubstituteFor("postgres")); container.start(); @@ -109,7 +117,7 @@ protected String getImageName() { @Override protected ConnectorSpecification getSpec() throws Exception { - return SshHelpers.injectSshIntoSpec(Jsons.deserialize(MoreResources.readResource("expected_spec.json"), ConnectorSpecification.class)); + return SshHelpers.injectSshIntoSpec(Jsons.deserialize(MoreResources.readResource("expected_strict_encrypt_spec.json"), ConnectorSpecification.class)); } @Override @@ -125,19 +133,21 @@ protected ConfiguredAirbyteCatalog getConfiguredCatalog() { .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME, + STREAM_NAME, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))), + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))), new ConfiguredAirbyteStream() .withSyncMode(SyncMode.INCREMENTAL) .withCursorField(Lists.newArrayList("id")) .withDestinationSyncMode(DestinationSyncMode.APPEND) .withStream(CatalogHelpers.createAirbyteStream( - STREAM_NAME2, + STREAM_NAME2, SCHEMA_NAME, Field.of("id", JsonSchemaType.NUMBER), Field.of("name", JsonSchemaType.STRING)) - .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL))))); + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))))); } @Override diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_spec.json b/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_spec.json index 8b0fa6875170..7ee9abfc9e98 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_spec.json +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_spec.json @@ -247,7 +247,7 @@ "title": "Plugin", "description": "A logical decoding plugin installed on the PostgreSQL server. The `pgoutput` plugin is used by default. If the replication table contains a lot of big jsonb values it is recommended to use `wal2json` plugin. Read more about selecting replication plugins.", "enum": ["pgoutput", "wal2json"], - "const": "pgoutput", + "default": "pgoutput", "order": 2 }, "replication_slot": { diff --git a/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_strict_encrypt_spec.json b/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_strict_encrypt_spec.json new file mode 100644 index 000000000000..78f0de73bf00 --- /dev/null +++ b/airbyte-integrations/connectors/source-postgres/src/test-integration/resources/expected_strict_encrypt_spec.json @@ -0,0 +1,377 @@ +{ + "documentationUrl": "https://docs.airbyte.com/integrations/sources/postgres", + "connectionSpecification": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Postgres Source Spec", + "type": "object", + "required": ["host", "port", "database", "username"], + "properties": { + "host": { + "title": "Host", + "description": "Hostname of the database.", + "type": "string", + "order": 0 + }, + "port": { + "title": "Port", + "description": "Port of the database.", + "type": "integer", + "minimum": 0, + "maximum": 65536, + "default": 5432, + "examples": ["5432"], + "order": 1 + }, + "database": { + "title": "Database Name", + "description": "Name of the database.", + "type": "string", + "order": 2 + }, + "schemas": { + "title": "Schemas", + "description": "The list of schemas (case sensitive) to sync from. Defaults to public.", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "uniqueItems": true, + "default": ["public"], + "order": 3 + }, + "username": { + "title": "Username", + "description": "Username to access the database.", + "type": "string", + "order": 4 + }, + "password": { + "title": "Password", + "description": "Password associated with the username.", + "type": "string", + "airbyte_secret": true, + "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 '&'. (Eg. key1=value1&key2=value2&key3=value3). For more information read about JDBC URL parameters.", + "title": "JDBC URL Parameters (Advanced)", + "type": "string", + "order": 6 + }, + "ssl_mode": { + "title": "SSL Modes", + "description": "SSL connection modes. \n
  • disable - Disables encryption of communication between Airbyte and source database
  • \n
  • allow - Enables encryption only when required by the source database
  • \n
  • prefer - allows unencrypted connection only if the source database does not support encryption
  • \n
  • require - Always require encryption. If the source database server does not support encryption, connection will fail
  • \n
  • verify-ca - Always require encryption and verifies that the source database server has a valid SSL certificate
  • \n
  • verify-full - This is the most secure mode. Always require encryption and verifies the identity of the source database server
\n Read more in the docs.", + "type": "object", + "order": 7, + "oneOf": [ + { + "title": "allow", + "additionalProperties": true, + "description": "Allow SSL mode.", + "required": ["mode"], + "properties": { + "mode": { + "type": "string", + "const": "allow", + "order": 0 + } + } + }, + { + "title": "prefer", + "additionalProperties": true, + "description": "Prefer SSL mode.", + "required": ["mode"], + "properties": { + "mode": { + "type": "string", + "const": "prefer", + "order": 0 + } + } + }, + { + "title": "require", + "additionalProperties": true, + "description": "Require SSL mode.", + "required": ["mode"], + "properties": { + "mode": { + "type": "string", + "const": "require", + "order": 0 + } + } + }, + { + "title": "verify-ca", + "additionalProperties": true, + "description": "Verify-ca SSL mode.", + "required": ["mode", "ca_certificate"], + "properties": { + "mode": { + "type": "string", + "const": "verify-ca", + "order": 0 + }, + "ca_certificate": { + "type": "string", + "title": "CA certificate", + "description": "CA certificate", + "airbyte_secret": true, + "multiline": true, + "order": 1 + }, + "client_certificate": { + "type": "string", + "title": "Client Certificate", + "description": "Client certificate", + "airbyte_secret": true, + "multiline": true, + "order": 2 + }, + "client_key": { + "type": "string", + "title": "Client Key", + "description": "Client key", + "airbyte_secret": true, + "multiline": true, + "order": 3 + }, + "client_key_password": { + "type": "string", + "title": "Client key password", + "description": "Password for keystorage. If you do not add it - the password will be generated automatically.", + "airbyte_secret": true, + "order": 4 + } + } + }, + { + "title": "verify-full", + "additionalProperties": true, + "description": "Verify-full SSL mode.", + "required": ["mode", "ca_certificate"], + "properties": { + "mode": { + "type": "string", + "const": "verify-full", + "order": 0 + }, + "ca_certificate": { + "type": "string", + "title": "CA Certificate", + "description": "CA certificate", + "airbyte_secret": true, + "multiline": true, + "order": 1 + }, + "client_certificate": { + "type": "string", + "title": "Client Certificate", + "description": "Client certificate", + "airbyte_secret": true, + "multiline": true, + "order": 2 + }, + "client_key": { + "type": "string", + "title": "Client Key", + "description": "Client key", + "airbyte_secret": true, + "multiline": true, + "order": 3 + }, + "client_key_password": { + "type": "string", + "title": "Client key password", + "description": "Password for keystorage. If you do not add it - the password will be generated automatically.", + "airbyte_secret": true, + "order": 4 + } + } + } + ] + }, + "replication_method": { + "type": "object", + "title": "Replication Method", + "description": "Replication method for extracting data from the database.", + "order": 8, + "oneOf": [ + { + "title": "Standard", + "description": "Standard replication requires no setup on the DB side but will not be able to represent deletions incrementally.", + "required": ["method"], + "properties": { + "method": { + "type": "string", + "const": "Standard", + "order": 0 + } + } + }, + { + "title": "Logical Replication (CDC)", + "description": "Logical replication uses the Postgres write-ahead log (WAL) to detect inserts, updates, and deletes. This needs to be configured on the source database itself. Only available on Postgres 10 and above. Read the docs.", + "required": ["method", "replication_slot", "publication"], + "properties": { + "method": { + "type": "string", + "const": "CDC", + "order": 1 + }, + "plugin": { + "type": "string", + "title": "Plugin", + "description": "A logical decoding plugin installed on the PostgreSQL server. The `pgoutput` plugin is used by default. If the replication table contains a lot of big jsonb values it is recommended to use `wal2json` plugin. Read more about selecting replication plugins.", + "enum": ["pgoutput", "wal2json"], + "default": "pgoutput", + "order": 2 + }, + "replication_slot": { + "type": "string", + "title": "Replication Slot", + "description": "A plugin logical replication slot. Read about replication slots.", + "order": 3 + }, + "publication": { + "type": "string", + "title": "Publication", + "description": "A Postgres publication used for consuming changes. Read about publications and replication identities.", + "order": 4 + }, + "initial_waiting_seconds": { + "type": "integer", + "title": "Initial Waiting Time in Seconds (Advanced)", + "description": "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time.", + "default": 300, + "order": 5, + "min": 120, + "max": 1200 + } + } + } + ] + }, + "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 + } + } + } + ] + } + } + }, + "supportsNormalization": false, + "supportsDBT": false, + "supported_destination_sync_modes": [] +} diff --git a/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java b/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java index 6676e203ce5d..8faef1fa162b 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java @@ -500,7 +500,7 @@ public void tableWithInvalidCursorShouldThrowException() throws Exception { final Throwable throwable = catchThrowable(() -> MoreIterators.toSet(new PostgresSource().read(config, configuredAirbyteCatalog, null))); assertThat(throwable).isInstanceOf(ConfigErrorException.class) .hasMessageContaining( - "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering as a cursor. {tableName='public.test_table', cursorColumnName='id', cursorSqlType=OTHER}"); + "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering with no null values as a cursor. {tableName='public.test_table', cursorColumnName='id', cursorSqlType=OTHER, cause=Unsupported cursor type}"); } finally { db.stop(); } @@ -544,4 +544,91 @@ private JsonNode buildConfigEscapingNeeded() { JdbcUtils.SSL_KEY, "false")); } + @Test + public void tableWithNullValueCursorShouldThrowException() throws SQLException { + try (final PostgreSQLContainer db = new PostgreSQLContainer<>("postgres:13-alpine")) { + db.start(); + final JsonNode config = getConfig(db); + try (final DSLContext dslContext = getDslContext(config)) { + final Database database = new Database(dslContext); + final ConfiguredAirbyteStream table = createTableWithNullValueCursor(database); + final ConfiguredAirbyteCatalog catalog = new ConfiguredAirbyteCatalog().withStreams(Collections.singletonList(table)); + + final Throwable throwable = catchThrowable(() -> MoreIterators.toSet(new PostgresSource().read(config, catalog, null))); + assertThat(throwable).isInstanceOf(ConfigErrorException.class) + .hasMessageContaining( + "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering with no null values as a cursor. {tableName='public.test_table_null_cursor', cursorColumnName='id', cursorSqlType=INTEGER, cause=Cursor column contains NULL value}"); + + } finally { + db.stop(); + } + } + } + + private ConfiguredAirbyteStream createTableWithNullValueCursor(final Database database) throws SQLException { + database.query(ctx -> { + ctx.fetch("CREATE TABLE IF NOT EXISTS public.test_table_null_cursor(id INTEGER NULL)"); + ctx.fetch("INSERT INTO public.test_table_null_cursor(id) VALUES (1), (2), (NULL)"); + return null; + }); + + return new ConfiguredAirbyteStream().withSyncMode(SyncMode.INCREMENTAL) + .withCursorField(Lists.newArrayList("id")) + .withDestinationSyncMode(DestinationSyncMode.APPEND) + .withSyncMode(SyncMode.INCREMENTAL) + .withStream(CatalogHelpers.createAirbyteStream( + "test_table_null_cursor", + "public", + Field.of("id", JsonSchemaType.STRING)) + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))); + + } + + @Test + public void viewWithNullValueCursorShouldThrowException() throws SQLException { + try (final PostgreSQLContainer db = new PostgreSQLContainer<>("postgres:13-alpine")) { + db.start(); + final JsonNode config = getConfig(db); + try (final DSLContext dslContext = getDslContext(config)) { + final Database database = new Database(dslContext); + final ConfiguredAirbyteStream table = createViewWithNullValueCursor(database); + final ConfiguredAirbyteCatalog catalog = new ConfiguredAirbyteCatalog().withStreams(Collections.singletonList(table)); + + final Throwable throwable = catchThrowable(() -> MoreIterators.toSet(new PostgresSource().read(config, catalog, null))); + assertThat(throwable).isInstanceOf(ConfigErrorException.class) + .hasMessageContaining( + "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering with no null values as a cursor. {tableName='public.test_view_null_cursor', cursorColumnName='id', cursorSqlType=INTEGER, cause=Cursor column contains NULL value}"); + + } finally { + db.stop(); + } + } + } + + private ConfiguredAirbyteStream createViewWithNullValueCursor(final Database database) throws SQLException { + database.query(ctx -> { + ctx.fetch("CREATE TABLE IF NOT EXISTS public.test_table_null_cursor(id INTEGER NULL)"); + ctx.fetch(""" + CREATE VIEW test_view_null_cursor(id) as + SELECT test_table_null_cursor.id + FROM test_table_null_cursor + """); + ctx.fetch("INSERT INTO public.test_table_null_cursor(id) VALUES (1), (2), (NULL)"); + return null; + }); + + return new ConfiguredAirbyteStream().withSyncMode(SyncMode.INCREMENTAL) + .withCursorField(Lists.newArrayList("id")) + .withDestinationSyncMode(DestinationSyncMode.APPEND) + .withSyncMode(SyncMode.INCREMENTAL) + .withStream(CatalogHelpers.createAirbyteStream( + "test_view_null_cursor", + "public", + Field.of("id", JsonSchemaType.STRING)) + .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) + .withSourceDefinedPrimaryKey(List.of(List.of("id")))); + + } + } diff --git a/airbyte-integrations/connectors/source-postgres/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/source-postgres/src/test/resources/expected_spec.json index 596d49c26e02..78f0de73bf00 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test/resources/expected_spec.json +++ b/airbyte-integrations/connectors/source-postgres/src/test/resources/expected_spec.json @@ -227,7 +227,7 @@ "title": "Plugin", "description": "A logical decoding plugin installed on the PostgreSQL server. The `pgoutput` plugin is used by default. If the replication table contains a lot of big jsonb values it is recommended to use `wal2json` plugin. Read more about selecting replication plugins.", "enum": ["pgoutput", "wal2json"], - "const": "pgoutput", + "default": "pgoutput", "order": 2 }, "replication_slot": { diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/Dockerfile b/airbyte-integrations/connectors/source-rd-station-marketing/Dockerfile index 327eabb2010a..94dfec89b0f1 100644 --- a/airbyte-integrations/connectors/source-rd-station-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-rd-station-marketing/Dockerfile @@ -34,5 +34,5 @@ COPY source_rd_station_marketing ./source_rd_station_marketing ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.version=0.1.1 LABEL io.airbyte.name=airbyte/source-rd-station-marketing diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/streams.py b/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/streams.py index 25bca0799280..97b82b251d02 100755 --- a/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/streams.py +++ b/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/streams.py @@ -94,10 +94,6 @@ class AnalyticsConversions(IncrementalRDStationMarketingStream): cursor_field = "asset_updated_at" primary_key = "asset_id" - def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: - records = response.json().get(self.data_field)[0].get(self.data_field) - yield from records - class AnalyticsEmails(IncrementalRDStationMarketingStream): """ diff --git a/airbyte-integrations/connectors/source-relational-db/build.gradle b/airbyte-integrations/connectors/source-relational-db/build.gradle index 58cc47dfd17a..f23d855019db 100644 --- a/airbyte-integrations/connectors/source-relational-db/build.gradle +++ b/airbyte-integrations/connectors/source-relational-db/build.gradle @@ -20,6 +20,8 @@ dependencies { testImplementation libs.postgresql testImplementation libs.connectors.testcontainers.postgresql + testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.0.1' + implementation files(project(':airbyte-integrations:bases:base-java').airbyteDocker.outputs) } diff --git a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java index 009855b86606..2df3f4b6620f 100644 --- a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java +++ b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java @@ -159,7 +159,7 @@ public AutoCloseableIterator read(final JsonNode config, Function .identity())); - validateCursorFieldForIncrementalTables(fullyQualifiedTableNameToInfo, catalog); + validateCursorFieldForIncrementalTables(fullyQualifiedTableNameToInfo, catalog, database); final List> incrementalIterators = getIncrementalIterators(database, catalog, fullyQualifiedTableNameToInfo, stateManager, @@ -182,7 +182,7 @@ public AutoCloseableIterator read(final JsonNode config, private void validateCursorFieldForIncrementalTables( final Map>> tableNameToTable, - final ConfiguredAirbyteCatalog catalog) { + final ConfiguredAirbyteCatalog catalog, final Database database) throws SQLException { final List tablesWithInvalidCursor = new ArrayList<>(); for (final ConfiguredAirbyteStream airbyteStream : catalog.getStreams()) { final AirbyteStream stream = airbyteStream.getStream(); @@ -211,7 +211,15 @@ private void validateCursorFieldForIncrementalTables( if (!isCursorType(cursorType)) { tablesWithInvalidCursor.add( new InvalidCursorInfo(fullyQualifiedTableName, cursorField.get(), - cursorType.toString())); + cursorType.toString(), "Unsupported cursor type")); + continue; + } + + if (!verifyCursorColumnValues(database, stream.getNamespace(), stream.getName(), cursorField.get())) { + tablesWithInvalidCursor.add( + new InvalidCursorInfo(fullyQualifiedTableName, cursorField.get(), + cursorType.toString(), "Cursor column contains NULL value")); + continue; } } @@ -221,6 +229,16 @@ private void validateCursorFieldForIncrementalTables( } } + /** + * Verify that cursor column allows syncing to go through. + * @param database database + * @return true if syncing can go through. false otherwise + * @throws SQLException exception + */ + protected boolean verifyCursorColumnValues(final Database database, final String schema, final String tableName, final String columnName) throws SQLException { + /* no-op */ + return true; + } private List>> discoverWithoutSystemTables( final Database database) throws Exception { diff --git a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/InvalidCursorInfoUtil.java b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/InvalidCursorInfoUtil.java index 42d4b9dedbec..538ca3a7dc9c 100644 --- a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/InvalidCursorInfoUtil.java +++ b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/InvalidCursorInfoUtil.java @@ -10,12 +10,12 @@ public class InvalidCursorInfoUtil { public static String getInvalidCursorConfigMessage(final List tablesWithInvalidCursor) { - return "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering as a cursor. " + return "The following tables have invalid columns selected as cursor, please select a column with a well-defined ordering with no null values as a cursor. " + tablesWithInvalidCursor.stream().map(InvalidCursorInfo::toString) .collect(Collectors.joining(",")); } - public record InvalidCursorInfo(String tableName, String cursorColumnName, String cursorSqlType) { + public record InvalidCursorInfo(String tableName, String cursorColumnName, String cursorSqlType, String cause) { @Override public String toString() { @@ -23,6 +23,7 @@ public String toString() { "tableName='" + tableName + '\'' + ", cursorColumnName='" + cursorColumnName + '\'' + ", cursorSqlType=" + cursorSqlType + + ", cause=" + cause + '}'; } diff --git a/airbyte-integrations/connectors/source-relational-db/src/test/java/io/airbyte/integrations/source/relationaldb/AbstractDbSourceTest.java b/airbyte-integrations/connectors/source-relational-db/src/test/java/io/airbyte/integrations/source/relationaldb/AbstractDbSourceTest.java index a85f40799780..1bf9c01aef6a 100644 --- a/airbyte-integrations/connectors/source-relational-db/src/test/java/io/airbyte/integrations/source/relationaldb/AbstractDbSourceTest.java +++ b/airbyte-integrations/connectors/source-relational-db/src/test/java/io/airbyte/integrations/source/relationaldb/AbstractDbSourceTest.java @@ -15,16 +15,22 @@ import io.airbyte.protocol.models.AirbyteStateMessage; import io.airbyte.protocol.models.AirbyteStateMessage.AirbyteStateType; import java.io.IOException; -import java.lang.reflect.Field; import java.util.List; -import java.util.Map; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; /** * Test suite for the {@link AbstractDbSource} class. */ +@ExtendWith(SystemStubsExtension.class) public class AbstractDbSourceTest { + @SystemStub + private EnvironmentVariables environmentVariables; + @Test void testDeserializationOfLegacyState() throws IOException { final AbstractDbSource dbSource = spy(AbstractDbSource.class); @@ -40,7 +46,7 @@ void testDeserializationOfLegacyState() throws IOException { @Test void testDeserializationOfGlobalState() throws IOException { - setEnv(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); final AbstractDbSource dbSource = spy(AbstractDbSource.class); final JsonNode config = mock(JsonNode.class); @@ -54,7 +60,7 @@ void testDeserializationOfGlobalState() throws IOException { @Test void testDeserializationOfStreamState() throws IOException { - setEnv(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); + environmentVariables.set(EnvVariableFeatureFlags.USE_STREAM_CAPABLE_STATE, "true"); final AbstractDbSource dbSource = spy(AbstractDbSource.class); final JsonNode config = mock(JsonNode.class); @@ -76,17 +82,4 @@ void testDeserializationOfNullState() throws IOException { assertEquals(dbSource.getSupportedStateType(config), result.get(0).getType()); } - public static void setEnv(final String key, final String value) { - try { - final Map env = System.getenv(); - final Class cl = env.getClass(); - final Field field = cl.getDeclaredField("m"); - field.setAccessible(true); - final Map writableEnv = (Map) field.get(env); - writableEnv.put(key, value); - } catch (final Exception e) { - throw new IllegalStateException("Failed to set environment variable", e); - } - } - } diff --git a/airbyte-integrations/connectors/source-rki-covid/README.md b/airbyte-integrations/connectors/source-rki-covid/README.md index 833f6bc05c89..e15247de91c8 100644 --- a/airbyte-integrations/connectors/source-rki-covid/README.md +++ b/airbyte-integrations/connectors/source-rki-covid/README.md @@ -15,6 +15,14 @@ Germany: 6. /germany/history/recovered/:days 7. /germany/history/frozen-incidence/:days 8. /germany/history/hospitalization/:days + 9. /germany/states + 10. /germany/states/age-groups + 11. /germany/states/history/cases/:days + 12. /germany/states/history/incidence/:days + 13. /germany/states/history/frozen-incidence/:days + 14. /germany/states/history/deaths/:days + 15. /germany/states/history/recovered/:days + 16. /germany/states/history/hospitalization/:days ``` ### Prerequisites diff --git a/airbyte-integrations/connectors/source-rki-covid/acceptance-test-config.yml b/airbyte-integrations/connectors/source-rki-covid/acceptance-test-config.yml index 749d5d300264..e357e54ef0e9 100644 --- a/airbyte-integrations/connectors/source-rki-covid/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-rki-covid/acceptance-test-config.yml @@ -12,7 +12,7 @@ tests: basic_read: - config_path: "secrets/config.json" configured_catalog_path: "integration_tests/configured_catalog.json" - empty_streams: [ "germany", "germany_age_groups", "german_history_frozen_incidence"] + empty_streams: [ "germany", "germany_age_groups", "german_history_frozen_incidence", "germany_states_age_groups"] # TODO uncomment this block to specify that the tests should assert the connector outputs the records provided in the input file a file # expect_records: # path: "integration_tests/expected_records.txt" diff --git a/airbyte-integrations/connectors/source-rki-covid/bootstrap.md b/airbyte-integrations/connectors/source-rki-covid/bootstrap.md index 5061ac55ce92..de01a9368897 100644 --- a/airbyte-integrations/connectors/source-rki-covid/bootstrap.md +++ b/airbyte-integrations/connectors/source-rki-covid/bootstrap.md @@ -15,7 +15,19 @@ For production, every developer application can view multiple streams. * [Provides frozen incidence in Germany over days.](https://api.corona-zahlen.org/germany/germany/history/frozen-incidence/:days) \(Incremental\) * [Provides hospitalization rate in Germany over days.](https://api.corona-zahlen.org/germany/germany/history/hospitalization/:days) \(Incremental\) +## Cases In States Of Germany Covid api stream +The basic entry stream is 'GermanyStates'. All other streams are extended version of base stream and passing parameters also result in sliced data. +For production, every developer application can view multiple streams. +## Endpoints +* [Provides covid cases and other information in Germany.](https://api.corona-zahlen.org/state) \(Non-Incremental\ Entry-Stream) +* [Provides covid cases and other information in Germany, group by age.](https://api.corona-zahlen.org/states/age-groupss) \(Non-Incremental\) +* [Provides cases in Germany based on days.](https://api.corona-zahlen.org/germany/states/history/cases/:days) \(Non-Incremental\) +* [Provides incidence rate of covid in Germany based on days.](https://api.corona-zahlen.org/germany/states/history/incidence/:days) \(Non-Incremental\) +* [Provides death rate in Germany over days](https://api.corona-zahlen.org/germany/states/history/deaths/:days) \(Non-Incremental\) +* [Provides recovery rate in Germany over days.](https://api.corona-zahlen.org/germany/states/history/recovered/:days) \(Non-Incremental\) +* [Provides frozen incidence in Germany over days.](https://api.corona-zahlen.org/germany/states/history/frozen-incidence/:days) \(Non-Incremental\) +* [Provides hospitalization rate in Germany over days.](https://api.corona-zahlen.org/germany/states/history/hospitalization/:days) \(Non-Incremental\) Incremental streams have required parameter start-date. Without passing start-date as parameter full-refresh occurs. As cursor field this connector uses "date". \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-rki-covid/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-rki-covid/integration_tests/abnormal_state.json index f78d22b27ce4..83b08aa2c4aa 100644 --- a/airbyte-integrations/connectors/source-rki-covid/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-rki-covid/integration_tests/abnormal_state.json @@ -16,5 +16,29 @@ }, "german_history_frozen_incidence": { "date": "2024-01-01T00:00:00.000Z" + }, + "germany_states": { + "date": "2024-01-01T00:00:00.000Z" + }, + "germany_states_age_groups": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_cases": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_incidence": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_frozen_incidence": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_deaths": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_recovered": { + "date": "2024-01-01T00:00:00.000Z" + }, + "states_history_hospitalization": { + "date": "2024-01-01T00:00:00.000Z" } } diff --git a/airbyte-integrations/connectors/source-rki-covid/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-rki-covid/integration_tests/configured_catalog.json index de447b2a146b..907efe859cbe 100644 --- a/airbyte-integrations/connectors/source-rki-covid/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-rki-covid/integration_tests/configured_catalog.json @@ -1,5 +1,99 @@ { "streams": [ + { + "stream": { + "name": "germany", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "cases": { "type": "integer" }, + "deaths": { "type": "integer" }, + "recovered": { "type": "integer" }, + "weekIncidence": { "type": "number" }, + "casesPer100k": { "type": "number" }, + "casesPerWeek": { "type": "integer" }, + "delta": { + "type": "object", + "properties": { + "cases": { "type": "integer" }, + "deaths": { "type": "integer" }, + "recovered": { "type": "integer" } + }, + "required": ["cases", "deaths", "recovered"] + }, + "r": { + "type": "object", + "properties": { + "value": { "type": "number" }, + "rValue4Days": { + "type": "object", + "properties": { + "value": { "type": "number" }, + "date": { "type": "string" } + }, + "required": ["date", "value"] + }, + "rValue7Days": { + "type": "object", + "properties": { + "value": { "type": "number" }, + "date": { "type": "string" } + }, + "required": ["date", "value"] + }, + "lastUpdate": { "type": "string" } + }, + "required": ["lastUpdate", "rValue4Days", "rValue7Days", "value"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { "type": "integer" }, + "incidence7Days": { "type": "number" }, + "date": { "type": "string" }, + "lastUpdate": { "type": "string" } + }, + "required": ["cases7Days", "date", "incidence7Days", "lastUpdate"] + }, + "meta": { + "type": "object", + "properties": { + "source": { "type": "string" }, + "contact": { "type": "string" }, + "info": { "type": "string" }, + "lastUpdate": { "type": "string" }, + "lastCheckedForUpdate": { "type": "string" } + }, + "required": [ + "contact", + "info", + "lastCheckedForUpdate", + "lastUpdate", + "source" + ] + } + }, + "required": [ + "cases", + "casesPer100k", + "casesPerWeek", + "deaths", + "delta", + "hospitalization", + "meta", + "r", + "recovered", + "weekIncidence" + ] + }, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup", + "cursor_field": ["meta", "lastUpdate"], + "primary_key": [["hospitalization"]] + }, { "stream": { "name": "germany_age_groups", @@ -7,7 +101,7 @@ "supported_sync_modes": ["full_refresh"] }, "sync_mode": "full_refresh", - "destination_sync_mode": "overwrite" + "destination_sync_mode": "append_dedup" }, { "stream": { @@ -76,6 +170,692 @@ }, "sync_mode": "full_refresh", "destination_sync_mode": "overwrite" + }, + { + "stream": { + "name": "germany_states", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "id": { + "type": ["integer", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "population": { + "type": ["integer", "null"] + }, + "cases": { + "type": ["integer", "null"] + }, + "deaths": { + "type": ["integer", "null"] + }, + "casesPerWeek": { + "type": ["integer", "null"] + }, + "deathsPerWeek": { + "type": ["integer", "null"] + }, + "recovered": { + "type": ["integer", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + }, + "weekIncidence": { + "type": ["number", "null"] + }, + "casesPer100k": { + "type": ["number", "null"] + }, + "delta": { + "type": "object", + "properties": { + "cases": { + "type": ["integer", "null"] + }, + "deaths": { + "type": ["integer", "null"] + }, + "recovered": { + "type": ["integer", "null"] + }, + "weekIncidence": { + "type": ["number", "null"] + } + }, + "required": ["cases", "deaths", "recovered", "weekIncidence"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["integer", "null"] + }, + "incidence7Days": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "lastUpdate": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days", "lastUpdate"] + } + }, + "required": [ + "abbreviation", + "cases", + "casesPer100k", + "casesPerWeek", + "deaths", + "deathsPerWeek", + "delta", + "hospitalization", + "id", + "name", + "population", + "recovered", + "weekIncidence" + ] + }, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "germany_states_age_groups", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "abbreviation": { + "type": "string" + }, + "A00-A04": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": "string" + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A05-A14": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": "string" + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A15-A34": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A35-A59": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A60-A79": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A80+": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + } + }, + "required": [ + "data", + "A00-A04", + "A05-A14", + "A15-A34", + "A35-A59", + "A60-A79", + "A80+" + ] + }, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_cases", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "cases": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "cases", "date", "name"] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_incidence", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "weekIncidence": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "name", "weekIncidence"] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_frozen_incidence", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "weekIncidence": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "dataSource": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": [ + "abbreviation", + "dataSource", + "date", + "name", + "weekIncidence" + ] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_deaths", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "deaths": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "deaths", "name"] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_recovered", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "recovered": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "name", "recovered"] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" + }, + { + "stream": { + "name": "states_history_hospitalization", + "json_schema": { + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "cases7Days": { + "type": "integer" + }, + "incidence7Days": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "fixedCases7Days": { + "type": ["integer", "null"] + }, + "updatedCases7Days": { + "type": ["integer", "null"] + }, + "adjustedLowerCases7Days": { + "type": ["integer", "null"] + }, + "adjustedCases7Days": { + "type": ["integer", "null"] + }, + "adjustedUpperCases7Days": { + "type": ["integer", "null"] + }, + "fixedIncidence7Days": { + "type": ["number", "null"] + }, + "updatedIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedLowerIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedUpperIncidence7Days": { + "type": ["number", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": [ + "abbreviation", + "adjustedCases7Days", + "adjustedIncidence7Days", + "adjustedLowerCases7Days", + "adjustedLowerIncidence7Days", + "adjustedUpperCases7Days", + "adjustedUpperIncidence7Days", + "cases7Days", + "date", + "fixedCases7Days", + "fixedIncidence7Days", + "incidence7Days", + "name", + "updatedCases7Days", + "updatedIncidence7Days" + ] + }, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "default_cursor_field": ["date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append_dedup" } ] } diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states.json new file mode 100644 index 000000000000..bc3db07daf69 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states.json @@ -0,0 +1,90 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "id": { + "type": ["integer", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "population": { + "type": ["integer", "null"] + }, + "cases": { + "type": ["integer", "null"] + }, + "deaths": { + "type": ["integer", "null"] + }, + "casesPerWeek": { + "type": ["integer", "null"] + }, + "deathsPerWeek": { + "type": ["integer", "null"] + }, + "recovered": { + "type": ["integer", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + }, + "weekIncidence": { + "type": ["number", "null"] + }, + "casesPer100k": { + "type": ["number", "null"] + }, + "delta": { + "type": "object", + "properties": { + "cases": { + "type": ["integer", "null"] + }, + "deaths": { + "type": ["integer", "null"] + }, + "recovered": { + "type": ["integer", "null"] + }, + "weekIncidence": { + "type": ["number", "null"] + } + }, + "required": ["cases", "deaths", "recovered", "weekIncidence"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["integer", "null"] + }, + "incidence7Days": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "lastUpdate": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days", "lastUpdate"] + } + }, + "required": [ + "abbreviation", + "cases", + "casesPer100k", + "casesPerWeek", + "deaths", + "deathsPerWeek", + "delta", + "hospitalization", + "id", + "name", + "population", + "recovered", + "weekIncidence" + ] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states_age_groups.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states_age_groups.json new file mode 100644 index 000000000000..3650c6f15f2f --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/germany_states_age_groups.json @@ -0,0 +1,340 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "abbreviation": { + "type": "string" + }, + "A00-A04": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": "string" + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A05-A14": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": "string" + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A15-A34": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A35-A59": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A60-A79": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + }, + "A80+": { + "type": "object", + "properties": { + "casesMale": { + "type": ["number", "integer"] + }, + "casesFemale": { + "type": ["number", "integer"] + }, + "deathsMale": { + "type": ["number", "integer"] + }, + "deathsFemale": { + "type": ["number", "integer"] + }, + "casesMalePer100k": { + "type": ["number", "integer"] + }, + "casesFemalePer100k": { + "type": ["number", "integer"] + }, + "deathsMalePer100k": { + "type": ["number", "integer"] + }, + "deathsFemalePer100k": { + "type": ["number", "integer"] + }, + "hospitalization": { + "type": "object", + "properties": { + "cases7Days": { + "type": ["number", "integer"] + }, + "incidence7Days": { + "type": ["number", "integer"] + }, + "date": { + "type": ["string", "null"] + } + }, + "required": ["cases7Days", "date", "incidence7Days"] + } + }, + "required": [ + "casesFemale", + "casesFemalePer100k", + "casesMale", + "casesMalePer100k", + "deathsFemale", + "deathsFemalePer100k", + "deathsMale", + "deathsMalePer100k", + "hospitalization" + ] + } + }, + "required": ["A00-A04", "A05-A14", "A15-A34", "A35-A59", "A60-A79", "A80+"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_cases.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_cases.json new file mode 100644 index 000000000000..4fa287a2d6f2 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_cases.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "cases": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "cases", "date", "name"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_deaths.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_deaths.json new file mode 100644 index 000000000000..acc8238e1bac --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_deaths.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "deaths": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "deaths", "name"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_frozen_incidence.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_frozen_incidence.json new file mode 100644 index 000000000000..39b24add5b17 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_frozen_incidence.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "weekIncidence": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "dataSource": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "dataSource", "date", "name", "weekIncidence"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_hospitalization.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_hospitalization.json new file mode 100644 index 000000000000..4231538dcab9 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_hospitalization.json @@ -0,0 +1,68 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "cases7Days": { + "type": "integer" + }, + "incidence7Days": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "fixedCases7Days": { + "type": ["integer", "null"] + }, + "updatedCases7Days": { + "type": ["integer", "null"] + }, + "adjustedLowerCases7Days": { + "type": ["integer", "null"] + }, + "adjustedCases7Days": { + "type": ["integer", "null"] + }, + "adjustedUpperCases7Days": { + "type": ["integer", "null"] + }, + "fixedIncidence7Days": { + "type": ["number", "null"] + }, + "updatedIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedLowerIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedIncidence7Days": { + "type": ["number", "null"] + }, + "adjustedUpperIncidence7Days": { + "type": ["number", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": [ + "abbreviation", + "adjustedCases7Days", + "adjustedIncidence7Days", + "adjustedLowerCases7Days", + "adjustedLowerIncidence7Days", + "adjustedUpperCases7Days", + "adjustedUpperIncidence7Days", + "cases7Days", + "date", + "fixedCases7Days", + "fixedIncidence7Days", + "incidence7Days", + "name", + "updatedCases7Days", + "updatedIncidence7Days" + ] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_incidence.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_incidence.json new file mode 100644 index 000000000000..9c9d40c0adc3 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_incidence.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "weekIncidence": { + "type": ["number", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "name", "weekIncidence"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_recovered.json b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_recovered.json new file mode 100644 index 000000000000..e827c9588fb8 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/schemas/states_history_recovered.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "recovered": { + "type": ["integer", "null"] + }, + "date": { + "type": ["string", "null"] + }, + "name": { + "type": ["string", "null"] + }, + "abbreviation": { + "type": ["string", "null"] + } + }, + "required": ["abbreviation", "date", "name", "recovered"] +} diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/source.py b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/source.py index 32b3bd9567f2..0ae6e028a156 100644 --- a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/source.py +++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/source.py @@ -50,6 +50,24 @@ def path( return "germany/" +# class that contains main source states | full-refresh +class GermanyStates(RkiCovidStream): + """Docs: https://api.corona-zahlen.org/states""" + + primary_key = None + + def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: + if response.json(): + for key, value in response.json().get("data").items(): + yield value + return [{}] + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + return "states/" + + # class that contains source age-groups in germany. | full-refresh class GermanyAgeGroups(RkiCovidStream): """Docs: https://api.corona-zahlen.org/germany/age-groups""" @@ -65,6 +83,27 @@ def path( return "germany/age-groups" +# class that contains main source states | full-refresh +class GermanyStatesAgeGroups(RkiCovidStream): + """Docs: https://api.corona-zahlen.org/states/age-groups""" + + primary_key = None + + def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: + if response.json(): + for key, value in response.json().get("data").items(): + record = {"abbreviation": key} + for grp, data in value.items(): + record.update({grp: data}) + yield record + return [{}] + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + return "states/age-groups" + + # Basic incremental stream class IncrementalRkiCovidStream(RkiCovidStream, ABC): @@ -395,6 +434,161 @@ def path( return "germany/history/hospitalization/" +# STATES FULL-REFRESH. +# source: states/history/cases/:days | FULL-REFRESH +class ByStateRkiCovidStream(RkiCovidStream, ABC): + def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: + if response.json().get("data"): + for key, value in response.json().get("data").items(): + for record in value.get("history"): + record.update({"name": value.get("name"), "abbreviation": key}) + yield record + return [{}] + + +class StatesHistoryCases(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/cases/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/cases/" + str(self.date_to_int(self.start_date)) + return "states/history/cases/" + + +# source: states/history/incidence/:days | FULL-REFRESH +class StatesHistoryIncidence(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/incidence/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/incidence/" + str(self.date_to_int(self.start_date)) + return "states/history/incidence/" + + +# source: states/history/frozen-incidence/:days | FULL-REFRESH +class StatesHistoryFrozenIncidence(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/frozen-incidence/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/frozen-incidence/" + str(self.date_to_int(self.start_date)) + return "states/history/frozen-incidence/" + + +# source: states/history/deaths/:days | FULL-REFRESH +class StatesHistoryDeaths(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/deaths/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/deaths/" + str(self.date_to_int(self.start_date)) + return "states/history/deaths/" + + +# source: states/history/recovered/:days | FULL-REFRESH +class StatesHistoryRecovered(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/recovered/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/recovered/" + str(self.date_to_int(self.start_date)) + return "states/history/recovered/" + + +# source: states/history/hospitalization/:days | FULL-REFRESH +class StatesHistoryHospitalization(ByStateRkiCovidStream): + """Docs: https://api.corona-zahlen.org/germany/states/history/hospitalization/:days""" + + primary_key = None + + def __init__(self, config, **kwargs): + super().__init__(**kwargs) + self.start_date = config.get("start_date") + + def date_to_int(self, start_date) -> int: + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return 1 + return diff.days + + def path( + self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None + ) -> str: + if self.start_date: + return "states/history/hospitalization/" + str(self.date_to_int(self.start_date)) + return "states/history/hospitalization/" + + # Source class SourceRkiCovid(AbstractSource): def check_connection(self, logger, config) -> Tuple[bool, any]: @@ -417,8 +611,8 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: """ :param config: A Mapping of the user input configuration as defined in the connector spec. """ - - return [ + # Streams For Germany + streams = [ Germany(), GermanyAgeGroups(), GermanyHistoryCases(config=config), @@ -428,3 +622,19 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: GermanHistoryFrozenIncidence(config=config), GermanHistoryHospitalization(config=config), ] + + # Streams For States Of Germany + streams.extend( + [ + GermanyStates(), + GermanyStatesAgeGroups(), + StatesHistoryCases(config=config), + StatesHistoryIncidence(config=config), + StatesHistoryFrozenIncidence(config=config), + StatesHistoryDeaths(config=config), + StatesHistoryRecovered(config=config), + StatesHistoryHospitalization(config=config), + ] + ) + + return streams diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_source.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_source.py index 94366f8c7416..1ee26991a664 100644 --- a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_source.py @@ -17,5 +17,5 @@ def test_streams(mocker): source = SourceRkiCovid() config_mock = MagicMock() streams = source.streams(config_mock) - expected_streams_number = 8 + expected_streams_number = 16 assert len(streams) == expected_streams_number diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorycases.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorycases.py new file mode 100644 index 000000000000..496adbf86277 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorycases.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryCases + + +@fixture +def patch_states_history_cases(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryCases, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_cases): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryCases(config) + expected_stream_path = "states/history/cases/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorydeaths.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorydeaths.py new file mode 100644 index 000000000000..045470947978 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistorydeaths.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryDeaths + + +@fixture +def patch_states_history_deaths(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryDeaths, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_deaths): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryDeaths(config) + expected_stream_path = "states/history/deaths/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryfrozenincidence.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryfrozenincidence.py new file mode 100644 index 000000000000..14864a8607ba --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryfrozenincidence.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryFrozenIncidence + + +@fixture +def patch_states_history_frozenincidence(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryFrozenIncidence, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_frozenincidence): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryFrozenIncidence(config) + expected_stream_path = "states/history/frozen-incidence/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryhospitalization.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryhospitalization.py new file mode 100644 index 000000000000..642191304c9b --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryhospitalization.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryHospitalization + + +@fixture +def patch_states_history_hospitalization(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryHospitalization, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_hospitalization): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryHospitalization(config) + expected_stream_path = "states/history/hospitalization/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryincidence.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryincidence.py new file mode 100644 index 000000000000..74f0b1b783fa --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryincidence.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryIncidence + + +@fixture +def patch_states_history_incidence(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryIncidence, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_incidence): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryIncidence(config) + expected_stream_path = "states/history/incidence/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryrecovered.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryrecovered.py new file mode 100644 index 000000000000..c8c2e13b176d --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stateshistoryrecovered.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime + +from pytest import fixture +from source_rki_covid.source import StatesHistoryRecovered + + +@fixture +def patch_states_history_recovered(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(StatesHistoryRecovered, "primary_key", None) + + +def check_diff(start_date): + diff = datetime.now() - datetime.strptime(start_date, "%Y-%m-%d") + if diff.days <= 0: + return str(1) + return str(diff.days) + + +def test_parse_with_cases(patch_states_history_recovered): + config = {"start_date": "2022-04-27"} + stream = StatesHistoryRecovered(config) + expected_stream_path = "states/history/recovered/" + check_diff(config.get("start_date")) + assert stream.path() == expected_stream_path diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stream_germany_states.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stream_germany_states.py new file mode 100644 index 000000000000..88e8caf2e738 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_stream_germany_states.py @@ -0,0 +1,18 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +import pytest +from source_rki_covid.source import GermanyStates + + +@pytest.fixture +def patch_germany_states_class(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(GermanyStates, "primary_key", None) + + +def test_path(patch_germany_states_class): + stream = GermanyStates() + expected_params = {"path": "states/"} + assert stream.path() == expected_params.get("path") diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams.py index d25f2936639f..17d9951cfd90 100644 --- a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams.py @@ -31,15 +31,6 @@ def test_next_page_token(patch_base_class): assert stream.next_page_token(**inputs) == expected_token -# def test_parse_response(patch_base_class): -# stream = RkiCovidStream() -# # TODO: replace this with your input parameters -# inputs = {"response": MagicMock()} -# # TODO: replace this with your expected parced object -# expected_parsed_object = {} -# assert next(stream.parse_response(**inputs)) == expected_parsed_object - - def test_request_headers(patch_base_class): stream = RkiCovidStream() inputs = {"stream_slice": None, "stream_state": None, "next_page_token": None} diff --git a/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams_states_agegroup.py b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams_states_agegroup.py new file mode 100644 index 000000000000..d0d606214076 --- /dev/null +++ b/airbyte-integrations/connectors/source-rki-covid/unit_tests/test_streams_states_agegroup.py @@ -0,0 +1,18 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +import pytest +from source_rki_covid.source import GermanyStatesAgeGroups + + +@pytest.fixture +def patch_states_age_group(mocker): + # Mock abstract methods to enable instantiating abstract class + mocker.patch.object(GermanyStatesAgeGroups, "primary_key", None) + + +def test_path(patch_states_age_group): + stream = GermanyStatesAgeGroups() + expected_params = {"path": "states/age-groups"} + assert stream.path() == expected_params.get("path") diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-config.yml b/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-config.yml new file mode 100644 index 000000000000..82c16f279777 --- /dev/null +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-config.yml @@ -0,0 +1,8 @@ +# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) +# for more information about how to configure these tests +connector_image: airbyte/source-scaffold-java-jdbc:dev +acceptance_tests: + spec: + tests: + - spec_path: "src/test-integration/resources/expected_spec.json" + config_path: "src/test-integration/resources/dummy_config.json" diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-docker.sh b/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-docker.sh new file mode 100644 index 000000000000..c416fd144055 --- /dev/null +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/acceptance-test-docker.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + +# Build latest connector image +docker build . -t $(cat acceptance-test-config.yml | grep "connector_image" | head -n 1 | cut -d: -f2-) + +# Pull latest acctest image +docker pull airbyte/source-acceptance-test:latest + +# Run +docker run --rm -it \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /tmp:/tmp \ + -v $(pwd):/test_input \ + airbyte/source-acceptance-test \ + --acceptance-test-config /test_input diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/build.gradle b/airbyte-integrations/connectors/source-scaffold-java-jdbc/build.gradle index 5e3d7e61e46f..5c9872a1fe69 100644 --- a/airbyte-integrations/connectors/source-scaffold-java-jdbc/build.gradle +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/build.gradle @@ -2,6 +2,7 @@ plugins { id 'application' id 'airbyte-docker' id 'airbyte-integration-test-java' + id 'airbyte-source-acceptance-test' } application { diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/integration_tests/acceptance.py b/airbyte-integrations/connectors/source-scaffold-java-jdbc/integration_tests/acceptance.py new file mode 100644 index 000000000000..1302b2f57e10 --- /dev/null +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/integration_tests/acceptance.py @@ -0,0 +1,16 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +import pytest + +pytest_plugins = ("source_acceptance_test.plugin",) + + +@pytest.fixture(scope="session", autouse=True) +def connector_setup(): + """This fixture is a placeholder for external resources that acceptance test might require.""" + # TODO: setup test dependencies if needed. otherwise remove the TODO comments + yield + # TODO: clean up test dependencies diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/dummy_config.json b/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/dummy_config.json new file mode 100644 index 000000000000..483d12bc3cd1 --- /dev/null +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/dummy_config.json @@ -0,0 +1,7 @@ +{ + "host": "default", + "port": 5555, + "database": "default", + "username": "default", + "replication_method": "STANDARD" +} diff --git a/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/expected_spec.json b/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/expected_spec.json new file mode 100644 index 000000000000..7bbd3bb22e22 --- /dev/null +++ b/airbyte-integrations/connectors/source-scaffold-java-jdbc/src/test-integration/resources/expected_spec.json @@ -0,0 +1,61 @@ +{ + "documentationUrl": "https://docs.airbyte.com/integrations/sources/scaffold_java_jdbc", + "connectionSpecification": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ScaffoldJavaJdbc Source Spec", + "type": "object", + "required": ["host", "port", "database", "username", "replication_method"], + "properties": { + "host": { + "title": "Host", + "description": "Hostname of the database.", + "type": "string", + "order": 0 + }, + "port": { + "title": "Port", + "description": "Port of the database.", + "type": "integer", + "minimum": 0, + "maximum": 65536, + "default": 3306, + "examples": ["3306"], + "order": 1 + }, + "database": { + "title": "Database", + "description": "Name of the database.", + "type": "string", + "order": 2 + }, + "username": { + "title": "Username", + "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 + }, + "jdbc_url_params": { + "title": "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)", + "type": "string", + "order": 5 + }, + "replication_method": { + "title": "Replication method", + "description": "Replication method to use for extracting data from the database. STANDARD replication requires no setup on the DB side but will not be able to represent deletions incrementally. CDC uses the Binlog to detect inserts, updates, and deletes. This needs to be configured on the source database itself.", + "type": "string", + "order": 6, + "default": "STANDARD", + "enum": ["STANDARD", "CDC"] + } + } + }, + "supported_destination_sync_modes": [] +} diff --git a/airbyte-integrations/connectors/source-snowflake/acceptance-test-config.yml b/airbyte-integrations/connectors/source-snowflake/acceptance-test-config.yml index d359de152b5e..5547d866ac94 100644 --- a/airbyte-integrations/connectors/source-snowflake/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-snowflake/acceptance-test-config.yml @@ -1,7 +1,29 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-snowflake:dev -tests: +acceptance_tests: spec: - - spec_path: "src/test-integration/resources/expected_spec.json" - config_path: "secrets/config.json" + tests: + - spec_path: "src/test-integration/resources/expected_spec.json" + config_path: "secrets/config.json" + connection: + tests: + - config_path: "secrets/config.json" + status: "succeed" + discovery: + tests: + - config_path: "secrets/config.json" + basic_read: + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + expect_records: + path: "integration_tests/expected_records.json" + full_refresh: + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + incremental: + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog_inc.json" \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/README.md b/airbyte-integrations/connectors/source-snowflake/integration_tests/README.md new file mode 100644 index 000000000000..96aa5492669b --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/README.md @@ -0,0 +1,3 @@ +# Seeding the dataset +You can find the SQL scripts in this folder if you need to create or fix the SAT dataset. +For more instructions and information about valid scripts, please check this [doc](https://docs.google.com/document/d/1k5TvxaNhKdr44aJIHWWtLk14Tzd2gbNX-J8YNoTj8u0/edit#heading=h.ls9oiedt9wyy). diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog.json new file mode 100644 index 000000000000..2bcf98da2bcf --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog.json @@ -0,0 +1,19 @@ +{ + "streams": [ + { + "stream": { + "name": "SAT_BASIC_DATASET", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": null, + "default_cursor_field": null, + "source_defined_primary_key": [["ID"]], + "namespace": null + }, + "sync_mode": "full_refresh", + "cursor_field": null, + "destination_sync_mode": "append", + "primary_key": null + } + ] +} diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog_inc.json b/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog_inc.json new file mode 100644 index 000000000000..52816ea6df67 --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/configured_catalog_inc.json @@ -0,0 +1,16 @@ +{ + "streams": [ + { + "stream": { + "name": "SAT_BASIC_DATASET", + "json_schema": {}, + "supported_sync_modes": ["incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["ID"] + }, + "sync_mode": "incremental", + "cursor_field": ["ID"], + "destination_sync_mode": "append" + } + ] +} diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/expected_records.json b/airbyte-integrations/connectors/source-snowflake/integration_tests/expected_records.json new file mode 100644 index 000000000000..bb63fbe99f5a --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/expected_records.json @@ -0,0 +1,7 @@ +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 1, "TEST_COLUMN_1" : 99999999999999999999999999999999999999, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : -9007199254740990.0, "TEST_COLUMN_12" : 1e-307, "TEST_COLUMN_14" : "\u0442\u0435\u0441\u0442", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-!-", "TEST_COLUMN_17" : "a", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : true, "TEST_COLUMN_2" : 9223372036854775807, "TEST_COLUMN_20" : "0001-01-01", "TEST_COLUMN_21" : "0001-01-01T00:00:00.000000", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123000", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123000Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123000", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123000Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : 99999999999999999999999999999999999999, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n -122.35,\n 37.55\n ],\n \"type\": \"Point\"\n}", "TEST_COLUMN_4" : 99999999999999999999999999999999999999, "TEST_COLUMN_5" : 9223372036854775807, "TEST_COLUMN_6" : 9223372036854775807, "TEST_COLUMN_7" : 9223372036854775807, "TEST_COLUMN_8" : 9223372036854775807, "TEST_COLUMN_9" : 9223372036854775807 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 2, "TEST_COLUMN_1" : -99999999999999999999999999999999999999, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "\u26a1 test \ufffd\ufffd", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "\u30b9", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : true, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.000000", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : -99999999999999999999999999999999999999, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 3, "TEST_COLUMN_1" : 9223372036854775807, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "!", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : false, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.123456", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : 9223372036854775807, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 4, "TEST_COLUMN_1" : -9223372036854775808, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "\u0457", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : false, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.123456", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : -9223372036854775808, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 5, "TEST_COLUMN_1" : -9223372036854775808, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "\u0457", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : true, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.123456", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : -9223372036854775808, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 6, "TEST_COLUMN_1" : -9223372036854775808, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "\u0457", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : false, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.123456", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : -9223372036854775808, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} +{ "stream" : "SAT_BASIC_DATASET", "data" : { "ID" : 7, "TEST_COLUMN_1" : -9223372036854775808, "TEST_COLUMN_10" : 10.12345, "TEST_COLUMN_11" : 9007199254740990.0, "TEST_COLUMN_12" : 1e+308, "TEST_COLUMN_14" : "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", "TEST_COLUMN_15" : "\u30c6\u30b9\u30c8", "TEST_COLUMN_16" : "-%-", "TEST_COLUMN_17" : "\u0457", "TEST_COLUMN_18" : "SEVMUA==", "TEST_COLUMN_19" : false, "TEST_COLUMN_2" : -9223372036854775808, "TEST_COLUMN_20" : "9999-12-31", "TEST_COLUMN_21" : "9999-12-31T23:59:59.123456", "TEST_COLUMN_23" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_24" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_25" : "2018-03-22T12:00:00.123456", "TEST_COLUMN_26" : "2018-03-22T07:00:00.123456Z", "TEST_COLUMN_27" : "{\n \"key1\": \"value1\",\n \"key2\": \"value2\"\n}", "TEST_COLUMN_28" : "[\n 1,\n 2,\n 3\n]", "TEST_COLUMN_29" : "{\n \"outer_key1\": {\n \"inner_key1A\": \"1a\",\n \"inner_key1B\": \"1b\"\n },\n \"outer_key2\": {\n \"inner_key2\": 2\n }\n}", "TEST_COLUMN_3" : -9223372036854775808, "TEST_COLUMN_30" : "{\n \"coordinates\": [\n [\n -124.2,\n 42\n ],\n [\n -120.01,\n 41.99\n ]\n ],\n \"type\": \"LineString\"\n}", "TEST_COLUMN_4" : -99999999999999999999999999999999999999, "TEST_COLUMN_5" : -9223372036854775808, "TEST_COLUMN_6" : -9223372036854775808, "TEST_COLUMN_7" : -9223372036854775808, "TEST_COLUMN_8" : -9223372036854775808, "TEST_COLUMN_9" : -9223372036854775808 }, "emitted_at" : 1670334357227} diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_basic_dataset.sql b/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_basic_dataset.sql new file mode 100644 index 000000000000..0dcbc56151c0 --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_basic_dataset.sql @@ -0,0 +1,45 @@ +create schema sat_test_dataset; + +-- Uncomment the line below if you need to recreate the table. +-- DROP TABLE sat_test_dataset.sat_basic_dataset; + +CREATE TABLE sat_test_dataset.sat_basic_dataset +( + ID INTEGER PRIMARY KEY, + TEST_COLUMN_1 NUMBER, + TEST_COLUMN_10 NUMBER(10,5), + TEST_COLUMN_11 DOUBLE, + TEST_COLUMN_12 FLOAT, + TEST_COLUMN_14 VARCHAR, + TEST_COLUMN_15 STRING, + TEST_COLUMN_16 TEXT, + TEST_COLUMN_17 CHAR, + TEST_COLUMN_18 BINARY, + TEST_COLUMN_19 BOOLEAN, + TEST_COLUMN_2 DECIMAL, + TEST_COLUMN_20 DATE, + TEST_COLUMN_21 DATETIME, + TEST_COLUMN_23 TIMESTAMP, + TEST_COLUMN_24 TIMESTAMP_LTZ, + TEST_COLUMN_25 TIMESTAMP_NTZ, + TEST_COLUMN_26 TIMESTAMP_TZ, + TEST_COLUMN_27 VARIANT, + TEST_COLUMN_28 ARRAY, + TEST_COLUMN_29 OBJECT, + TEST_COLUMN_3 NUMERIC, + TEST_COLUMN_30 GEOGRAPHY, + TEST_COLUMN_4 BIGINT, + TEST_COLUMN_5 INT, + TEST_COLUMN_6 BIGINT, + TEST_COLUMN_7 SMALLINT, + TEST_COLUMN_8 TINYINT, + TEST_COLUMN_9 BYTEINT +); + +INSERT INTO sat_test_dataset.sat_basic_dataset select 1, 99999999999999999999999999999999999999, 10.12345, -9007199254740991, 10e-308, 'тест', 'テスト', '-!-', 'a', to_binary('HELP', 'UTF-8'), 'true', 9223372036854775807, '0001-01-01', '0001-01-01 00:00:00', '2018-03-22 12:00:00.123', '2018-03-22 12:00:00.123 +05:00', '2018-03-22 12:00:00.123 +05:00', '2018-03-22 12:00:00.123 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), 99999999999999999999999999999999999999, 'POINT(-122.35 37.55)', 99999999999999999999999999999999999999, 9223372036854775807, 9223372036854775807, 9223372036854775807, 9223372036854775807, 9223372036854775807; +INSERT INTO sat_test_dataset.sat_basic_dataset select 2, -99999999999999999999999999999999999999, 10.12345, 9007199254740991, 10e+307, '⚡ test ��', 'テスト', '-\x25-', 'ス', to_binary('HELP', 'UTF-8'), 5, -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -99999999999999999999999999999999999999, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_basic_dataset select 3, 9223372036854775807, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', '!', to_binary('HELP', 'UTF-8'), 'false', -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), 9223372036854775807, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_basic_dataset select 4, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), 0, -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_basic_dataset select 5, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('y'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_basic_dataset select 6, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('n'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_basic_dataset select 7, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('n'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_full_dataset.sql b/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_full_dataset.sql new file mode 100644 index 000000000000..3726271d9d98 --- /dev/null +++ b/airbyte-integrations/connectors/source-snowflake/integration_tests/sat_full_dataset.sql @@ -0,0 +1,46 @@ +create schema sat_test_dataset; + +-- Uncomment the line below if you need to recreate the table. +-- DROP TABLE sat_test_dataset.sat_full_dataset; + +CREATE TABLE sat_test_dataset.sat_full_dataset +( + ID INTEGER PRIMARY KEY, + TEST_COLUMN_1 NUMBER, + TEST_COLUMN_10 NUMBER(10,5), + TEST_COLUMN_11 DOUBLE, + TEST_COLUMN_12 FLOAT, + TEST_COLUMN_14 VARCHAR, + TEST_COLUMN_15 STRING, + TEST_COLUMN_16 TEXT, + TEST_COLUMN_17 CHAR, + TEST_COLUMN_18 BINARY, + TEST_COLUMN_19 BOOLEAN, + TEST_COLUMN_2 DECIMAL, + TEST_COLUMN_20 DATE, + TEST_COLUMN_21 DATETIME, + TEST_COLUMN_22 TIME, + TEST_COLUMN_23 TIMESTAMP, + TEST_COLUMN_24 TIMESTAMP_LTZ, + TEST_COLUMN_25 TIMESTAMP_NTZ, + TEST_COLUMN_26 TIMESTAMP_TZ, + TEST_COLUMN_27 VARIANT, + TEST_COLUMN_28 ARRAY, + TEST_COLUMN_29 OBJECT, + TEST_COLUMN_3 NUMERIC, + TEST_COLUMN_30 GEOGRAPHY, + TEST_COLUMN_4 BIGINT, + TEST_COLUMN_5 INT, + TEST_COLUMN_6 BIGINT, + TEST_COLUMN_7 SMALLINT, + TEST_COLUMN_8 TINYINT, + TEST_COLUMN_9 BYTEINT +); + +INSERT INTO sat_test_dataset.sat_full_dataset select 1, 99999999999999999999999999999999999999, 10.12345, -9007199254740991, 10e-308, 'тест', 'テスト', '-!-', 'a', to_binary('HELP', 'UTF-8'), 'true', 9223372036854775807, '0001-01-01', '0001-01-01 00:00:00', '00:00:00', '2018-03-22 12:00:00.123', '2018-03-22 12:00:00.123 +05:00', '2018-03-22 12:00:00.123 +05:00', '2018-03-22 12:00:00.123 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), 99999999999999999999999999999999999999, 'POINT(-122.35 37.55)', 99999999999999999999999999999999999999, 9223372036854775807, 9223372036854775807, 9223372036854775807, 9223372036854775807, 9223372036854775807; +INSERT INTO sat_test_dataset.sat_full_dataset select 2, -99999999999999999999999999999999999999, 10.12345, 9007199254740991, 10e+307, '⚡ test ��', 'テスト', '-\x25-', 'ス', to_binary('HELP', 'UTF-8'), 5, -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59', '1:59 PM', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -99999999999999999999999999999999999999, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_full_dataset select 3, 9223372036854775807, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', '!', to_binary('HELP', 'UTF-8'), 'false', -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), 9223372036854775807, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_full_dataset select 4, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), 0, -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_full_dataset select 5, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('y'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_full_dataset select 6, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('n'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; +INSERT INTO sat_test_dataset.sat_full_dataset select 7, -9223372036854775808, 10.12345, 9007199254740991, 10e+307, '!"#$%&\'()*+,-./:;<=>?\@[\]^_\`{|}~', 'テスト', '-\x25-', 'ї', to_binary('HELP', 'UTF-8'), TO_BOOLEAN('n'), -9223372036854775808, '9999-12-31', '9999-12-31 23:59:59.123456', '23:59:59.123456', '2018-03-22 12:00:00.123456', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', '2018-03-22 12:00:00.123456 +05:00', parse_json(' { "key1": "value1", "key2": "value2" } '), array_construct(1, 2, 3), parse_json(' { "outer_key1": { "inner_key1A": "1a", "inner_key1B": "1b" }, "outer_key2": { "inner_key2": 2 } } '), -9223372036854775808, 'LINESTRING(-124.20 42.00, -120.01 41.99)', -99999999999999999999999999999999999999, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808, -9223372036854775808; \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-snowflake/src/main/java/io.airbyte.integrations.source.snowflake/SnowflakeSourceOperations.java b/airbyte-integrations/connectors/source-snowflake/src/main/java/io.airbyte.integrations.source.snowflake/SnowflakeSourceOperations.java index f1791b157c07..48043913662a 100644 --- a/airbyte-integrations/connectors/source-snowflake/src/main/java/io.airbyte.integrations.source.snowflake/SnowflakeSourceOperations.java +++ b/airbyte-integrations/connectors/source-snowflake/src/main/java/io.airbyte.integrations.source.snowflake/SnowflakeSourceOperations.java @@ -93,44 +93,17 @@ public JsonSchemaType getJsonType(final JDBCType jdbcType) { }; } - /** - * The only difference between this method and the one in {@link JdbcSourceOperations} is that the - * TIMESTAMP_WITH_TIMEZONE columns are also converted using the putTimestamp method. This is - * necessary after the JDBC upgrade from 3.13.9 to 3.13.22. This change may need to be added to - * {@link JdbcSourceOperations#setJsonField} in the future. - *

- * See issue: https://github.com/airbytehq/airbyte/issues/16838. - */ @Override public void setJsonField(final ResultSet resultSet, final int colIndex, final ObjectNode json) throws SQLException { - final int columnTypeInt = resultSet.getMetaData().getColumnType(colIndex); final String columnName = resultSet.getMetaData().getColumnName(colIndex); final String columnTypeName = resultSet.getMetaData().getColumnTypeName(colIndex).toLowerCase(); - final JDBCType columnType = safeGetJdbcType(columnTypeInt); // TIMESTAMPLTZ data type detected as JDBCType.TIMESTAMP which is not correct if ("TIMESTAMPLTZ".equalsIgnoreCase(columnTypeName)) { putTimestampWithTimezone(json, columnName, resultSet, colIndex); return; } - // https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html - switch (columnType) { - case BIT, BOOLEAN -> putBoolean(json, columnName, resultSet, colIndex); - case TINYINT, SMALLINT -> putShortInt(json, columnName, resultSet, colIndex); - case INTEGER -> putInteger(json, columnName, resultSet, colIndex); - case BIGINT -> putBigInt(json, columnName, resultSet, colIndex); - case FLOAT, DOUBLE -> putDouble(json, columnName, resultSet, colIndex); - case REAL -> putFloat(json, columnName, resultSet, colIndex); - case NUMERIC, DECIMAL -> putBigDecimal(json, columnName, resultSet, colIndex); - case CHAR, VARCHAR, LONGVARCHAR -> putString(json, columnName, resultSet, colIndex); - case DATE -> putDate(json, columnName, resultSet, colIndex); - case TIME -> putTime(json, columnName, resultSet, colIndex); - case TIMESTAMP -> putTimestamp(json, columnName, resultSet, colIndex); - case TIMESTAMP_WITH_TIMEZONE -> putTimestampWithTimezone(json, columnName, resultSet, colIndex); - case BLOB, BINARY, VARBINARY, LONGVARBINARY -> putBinary(json, columnName, resultSet, colIndex); - case ARRAY -> putArray(json, columnName, resultSet, colIndex); - default -> putDefault(json, columnName, resultSet, colIndex); - } + super.setJsonField(resultSet, colIndex, json); } @Override @@ -140,25 +113,25 @@ protected void setDate(final PreparedStatement preparedStatement, final int para } @Override - protected void putTimestampWithTimezone(ObjectNode node, String columnName, ResultSet resultSet, int index) throws SQLException { + protected void putTimestampWithTimezone(final ObjectNode node, final String columnName, final ResultSet resultSet, final int index) throws SQLException { final Timestamp timestamp = resultSet.getTimestamp(index); node.put(columnName, DateTimeConverter.convertToTimestampWithTimezone(timestamp)); } @Override - protected void putTimestamp(ObjectNode node, String columnName, ResultSet resultSet, int index) throws SQLException { + protected void putTimestamp(final ObjectNode node, final String columnName, final ResultSet resultSet, final int index) throws SQLException { final Timestamp timestamp = resultSet.getTimestamp(index); node.put(columnName, DateTimeConverter.convertToTimestamp(timestamp)); } @Override - protected void putDate(ObjectNode node, String columnName, ResultSet resultSet, int index) throws SQLException { + protected void putDate(final ObjectNode node, final String columnName, final ResultSet resultSet, final int index) throws SQLException { final Date date = resultSet.getDate(index); node.put(columnName, DateTimeConverter.convertToDate(date)); } @Override - protected void putTime(ObjectNode node, String columnName, ResultSet resultSet, int index) throws SQLException { + protected void putTime(final ObjectNode node, final String columnName, final ResultSet resultSet, final int index) throws SQLException { // resultSet.getTime() will lose nanoseconds precision final LocalTime localTime = resultSet.getTimestamp(index).toLocalDateTime().toLocalTime(); node.put(columnName, DateTimeConverter.convertToTime(localTime)); diff --git a/airbyte-json-validation/src/main/java/io/airbyte/validation/json/JsonSchemaValidator.java b/airbyte-json-validation/src/main/java/io/airbyte/validation/json/JsonSchemaValidator.java index 5c9507bee977..04fb601221d9 100644 --- a/airbyte-json-validation/src/main/java/io/airbyte/validation/json/JsonSchemaValidator.java +++ b/airbyte-json-validation/src/main/java/io/airbyte/validation/json/JsonSchemaValidator.java @@ -5,19 +5,14 @@ package io.airbyte.validation.json; import com.fasterxml.jackson.databind.JsonNode; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import com.networknt.schema.JsonMetaSchema; -import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.SchemaValidatorsConfig; import com.networknt.schema.SpecVersion; -import com.networknt.schema.ValidationContext; import com.networknt.schema.ValidationMessage; import io.airbyte.commons.string.Strings; import java.io.File; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -30,37 +25,13 @@ public class JsonSchemaValidator { private static final Logger LOGGER = LoggerFactory.getLogger(JsonSchemaValidator.class); - // This URI just needs to point at any path in the same directory as /app/WellKnownTypes.json - // It's required for the JsonSchema#validate method to resolve $ref correctly. - private static final URI DEFAULT_BASE_URI; - - static { - try { - DEFAULT_BASE_URI = new URI("file:///app/nonexistent_file.json"); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } + private final SchemaValidatorsConfig schemaValidatorsConfig; private final JsonSchemaFactory jsonSchemaFactory; - private final URI baseUri; public JsonSchemaValidator() { - this(DEFAULT_BASE_URI); - } - - /** - * The public constructor hardcodes a URL with access to WellKnownTypes.json. This method allows - * tests to override that URI - * - * Required to resolve $ref schemas using WellKnownTypes.json - * - * @param baseUri The base URI for schema resolution - */ - @VisibleForTesting - protected JsonSchemaValidator(URI baseUri) { + this.schemaValidatorsConfig = new SchemaValidatorsConfig(); this.jsonSchemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V7); - this.baseUri = baseUri; } public Set validate(final JsonNode schemaJson, final JsonNode objectJson) { @@ -89,38 +60,8 @@ private Set validateInternal(final JsonNode schemaJson, final Preconditions.checkNotNull(schemaJson); Preconditions.checkNotNull(objectJson); - // Default to draft-07, but have handling for the other metaschemas that networknt supports - JsonMetaSchema metaschema; - JsonNode metaschemaNode = schemaJson.get("$schema"); - if (metaschemaNode == null || metaschemaNode.asText() == null || metaschemaNode.asText().isEmpty()) { - metaschema = JsonMetaSchema.getV7(); - } else { - String metaschemaString = metaschemaNode.asText(); - // We're not using "http://....".equals(), because we want to avoid weirdness with https, etc. - if (metaschemaString.contains("json-schema.org/draft-04")) { - metaschema = JsonMetaSchema.getV4(); - } else if (metaschemaString.contains("json-schema.org/draft-06")) { - metaschema = JsonMetaSchema.getV6(); - } else if (metaschemaString.contains("json-schema.org/draft/2019-09")) { - metaschema = JsonMetaSchema.getV201909(); - } else if (metaschemaString.contains("json-schema.org/draft/2020-12")) { - metaschema = JsonMetaSchema.getV202012(); - } else { - metaschema = JsonMetaSchema.getV7(); - } - } - - ValidationContext context = new ValidationContext( - jsonSchemaFactory.getUriFactory(), - null, - metaschema, - jsonSchemaFactory, - null); - JsonSchema schema = new JsonSchema( - context, - baseUri, - schemaJson); - return schema.validate(objectJson); + return jsonSchemaFactory.getSchema(schemaJson, schemaValidatorsConfig) + .validate(objectJson); } public boolean test(final JsonNode schemaJson, final JsonNode objectJson) { diff --git a/airbyte-json-validation/src/test/java/io/airbyte/validation/json/JsonSchemaValidatorTest.java b/airbyte-json-validation/src/test/java/io/airbyte/validation/json/JsonSchemaValidatorTest.java index a1a0b511e40c..6dcf3c554b29 100644 --- a/airbyte-json-validation/src/test/java/io/airbyte/validation/json/JsonSchemaValidatorTest.java +++ b/airbyte-json-validation/src/test/java/io/airbyte/validation/json/JsonSchemaValidatorTest.java @@ -5,7 +5,6 @@ package io.airbyte.validation.json; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -16,10 +15,7 @@ import io.airbyte.commons.json.Jsons; import java.io.File; import java.io.IOException; -import java.net.URI; import java.nio.file.Files; -import java.util.Set; -import lombok.SneakyThrows; import org.junit.jupiter.api.Test; class JsonSchemaValidatorTest { @@ -106,39 +102,4 @@ void test() throws IOException { assertNull(JsonSchemaValidator.getSchema(schemaFile, "NonExistentObject")); } - @SneakyThrows - @Test - void testResolveReferences() throws IOException { - String referencableSchemas = """ - { - "definitions": { - "ref1": {"type": "string"}, - "ref2": {"type": "boolean"} - } - } - """; - final File schemaFile = IOs.writeFile(Files.createTempDirectory("test"), "WellKnownTypes.json", referencableSchemas).toFile(); - JsonSchemaValidator jsonSchemaValidator = - new JsonSchemaValidator(new URI("file://" + schemaFile.getParentFile().getAbsolutePath() + "/foo.json")); - - Set validationResult = jsonSchemaValidator.validate( - Jsons.deserialize(""" - { - "type": "object", - "properties": { - "prop1": {"$ref": "WellKnownTypes.json#/definitions/ref1"}, - "prop2": {"$ref": "WellKnownTypes.json#/definitions/ref2"} - } - } - """), - Jsons.deserialize(""" - { - "prop1": "foo", - "prop2": "false" - } - """)); - - assertEquals(Set.of("$.prop2: string found, boolean expected"), validationResult); - } - } diff --git a/airbyte-metrics/reporter/Dockerfile b/airbyte-metrics/reporter/Dockerfile index 511a74ef5db9..1ca29e48ca4d 100644 --- a/airbyte-metrics/reporter/Dockerfile +++ b/airbyte-metrics/reporter/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS metrics-reporter -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-metrics-reporter ENV VERSION ${VERSION} diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobCreator.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobCreator.java index 82d108dcce52..408953197783 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobCreator.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobCreator.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.commons.version.Version; -import io.airbyte.config.ActorDefinitionResourceRequirements; import io.airbyte.config.DestinationConnection; import io.airbyte.config.JobConfig; import io.airbyte.config.JobConfig.ConfigType; @@ -16,6 +15,8 @@ import io.airbyte.config.ResetSourceConfiguration; import io.airbyte.config.ResourceRequirements; import io.airbyte.config.SourceConnection; +import io.airbyte.config.StandardDestinationDefinition; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.State; @@ -58,8 +59,8 @@ public Optional createSyncJob(final SourceConnection source, final Version destinationProtocolVersion, final List standardSyncOperations, @Nullable final JsonNode webhookOperationConfigs, - @Nullable final ActorDefinitionResourceRequirements sourceResourceReqs, - @Nullable final ActorDefinitionResourceRequirements destinationResourceReqs) + final StandardSourceDefinition sourceDefinition, + final StandardDestinationDefinition destinationDefinition) throws IOException { // reusing this isn't going to quite work. @@ -68,12 +69,12 @@ public Optional createSyncJob(final SourceConnection source, workerResourceRequirements); final ResourceRequirements mergedSrcResourceReq = ResourceRequirementsUtils.getResourceRequirements( standardSync.getResourceRequirements(), - sourceResourceReqs, + sourceDefinition.getResourceRequirements(), workerResourceRequirements, JobType.SYNC); final ResourceRequirements mergedDstResourceReq = ResourceRequirementsUtils.getResourceRequirements( standardSync.getResourceRequirements(), - destinationResourceReqs, + destinationDefinition.getResourceRequirements(), workerResourceRequirements, JobType.SYNC); @@ -93,7 +94,9 @@ public Optional createSyncJob(final SourceConnection source, .withState(null) .withResourceRequirements(mergedOrchestratorResourceReq) .withSourceResourceRequirements(mergedSrcResourceReq) - .withDestinationResourceRequirements(mergedDstResourceReq); + .withDestinationResourceRequirements(mergedDstResourceReq) + .withIsSourceCustomConnector(sourceDefinition.getCustom()) + .withIsDestinationCustomConnector(destinationDefinition.getCustom()); getCurrentConnectionState(standardSync.getConnectionId()).ifPresent(jobSyncConfig::withState); @@ -108,6 +111,7 @@ public Optional createResetConnectionJob(final DestinationConnection desti final StandardSync standardSync, final String destinationDockerImage, final Version destinationProtocolVersion, + final boolean isDestinationCustomConnector, final List standardSyncOperations, final List streamsToReset) throws IOException { @@ -141,7 +145,9 @@ public Optional createResetConnectionJob(final DestinationConnection desti .withResourceRequirements(ResourceRequirementsUtils.getResourceRequirements( standardSync.getResourceRequirements(), workerResourceRequirements)) - .withResetSourceConfiguration(new ResetSourceConfiguration().withStreamsToReset(streamsToReset)); + .withResetSourceConfiguration(new ResetSourceConfiguration().withStreamsToReset(streamsToReset)) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(isDestinationCustomConnector); getCurrentConnectionState(standardSync.getConnectionId()).ifPresent(resetConnectionConfig::withState); diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobPersistence.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobPersistence.java index 369e7463cf98..cd39b41e59f1 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobPersistence.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/DefaultJobPersistence.java @@ -348,7 +348,9 @@ public void writeOutput(final long jobId, final int attemptNumber, final JobOutp .execute(); final Long attemptId = getAttemptId(jobId, attemptNumber, ctx); - writeSyncStats(now, syncStats, attemptId, ctx); + if (syncStats != null) { + writeSyncStats(now, syncStats, attemptId, ctx); + } if (normalizationSummary != null) { ctx.insertInto(NORMALIZATION_SUMMARIES) diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobCreator.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobCreator.java index 687d795dc3f4..92d285e699a8 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobCreator.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobCreator.java @@ -6,9 +6,10 @@ import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.commons.version.Version; -import io.airbyte.config.ActorDefinitionResourceRequirements; import io.airbyte.config.DestinationConnection; import io.airbyte.config.SourceConnection; +import io.airbyte.config.StandardDestinationDefinition; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSyncOperation; import io.airbyte.protocol.models.StreamDescriptor; @@ -38,8 +39,8 @@ Optional createSyncJob(SourceConnection source, Version destinationProtocolVersion, List standardSyncOperations, @Nullable JsonNode webhookOperationConfigs, - @Nullable ActorDefinitionResourceRequirements sourceResourceReqs, - @Nullable ActorDefinitionResourceRequirements destinationResourceReqs) + StandardSourceDefinition sourceDefinition, + StandardDestinationDefinition destinationDefinition) throws IOException; /** @@ -55,6 +56,7 @@ Optional createResetConnectionJob(DestinationConnection destination, StandardSync standardSync, String destinationDockerImage, Version destinationProtocolVersion, + boolean isCustom, List standardSyncOperations, List streamsToReset) throws IOException; diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobNotifier.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobNotifier.java index b2b9a3eae1ef..53555bb5d297 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobNotifier.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/JobNotifier.java @@ -88,11 +88,11 @@ private void notifyJob(final String reason, try { final Builder notificationMetadata = ImmutableMap.builder(); notificationMetadata.put("connection_id", connectionId); - if (notification.getNotificationType().equals(NotificationType.SLACK) && + if (NotificationType.SLACK.equals(notification.getNotificationType()) && notification.getSlackConfiguration().getWebhook().contains("hooks.slack.com")) { // flag as slack if the webhook URL is also pointing to slack notificationMetadata.put("notification_type", NotificationType.SLACK); - } else if (notification.getNotificationType().equals(NotificationType.CUSTOMERIO)) { + } else if (NotificationType.CUSTOMERIO.equals(notification.getNotificationType())) { notificationMetadata.put("notification_type", NotificationType.CUSTOMERIO); } else { // Slack Notification type could be "hacked" and re-used for custom webhooks @@ -103,23 +103,23 @@ private void notifyJob(final String reason, action, MoreMaps.merge(jobMetadata, sourceMetadata, destinationMetadata, notificationMetadata.build())); - if (FAILURE_NOTIFICATION == action) { + if (FAILURE_NOTIFICATION.equalsIgnoreCase(action)) { if (!notificationClient.notifyJobFailure(sourceConnector, destinationConnector, jobDescription, logUrl, job.getId())) { LOGGER.warn("Failed to successfully notify failure: {}", notification); } break; - } else if (SUCCESS_NOTIFICATION == action) { + } else if (SUCCESS_NOTIFICATION.equalsIgnoreCase(action)) { if (!notificationClient.notifyJobSuccess(sourceConnector, destinationConnector, jobDescription, logUrl, job.getId())) { LOGGER.warn("Failed to successfully notify success: {}", notification); } break; - } else if (CONNECTION_DISABLED_NOTIFICATION == action) { + } else if (CONNECTION_DISABLED_NOTIFICATION.equalsIgnoreCase(action)) { if (!notificationClient.notifyConnectionDisabled(workspace.getEmail(), sourceConnector, destinationConnector, jobDescription, workspaceId, connectionId)) { LOGGER.warn("Failed to successfully notify auto-disable connection: {}", notification); } break; - } else if (CONNECTION_DISABLED_WARNING_NOTIFICATION == action) { + } else if (CONNECTION_DISABLED_WARNING_NOTIFICATION.equalsIgnoreCase(action)) { if (!notificationClient.notifyConnectionDisableWarning(workspace.getEmail(), sourceConnector, destinationConnector, jobDescription, workspaceId, connectionId)) { LOGGER.warn("Failed to successfully notify auto-disable connection warning: {}", notification); diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/errorreporter/JobErrorReporter.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/errorreporter/JobErrorReporter.java index 64d9996bf3d3..b0a0aff5540f 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/errorreporter/JobErrorReporter.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/errorreporter/JobErrorReporter.java @@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableSet; import edu.umd.cs.findbugs.annotations.Nullable; +import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.lang.Exceptions; import io.airbyte.commons.map.MoreMaps; import io.airbyte.config.AttemptFailureSummary; @@ -55,24 +56,18 @@ public class JobErrorReporter { private final ConfigRepository configRepository; private final DeploymentMode deploymentMode; private final String airbyteVersion; - private final String normalizationImage; - private final String normalizationVersion; private final WebUrlHelper webUrlHelper; private final JobErrorReportingClient jobErrorReportingClient; public JobErrorReporter(final ConfigRepository configRepository, final DeploymentMode deploymentMode, final String airbyteVersion, - final String normalizationImage, - final String normalizationVersion, final WebUrlHelper webUrlHelper, final JobErrorReportingClient jobErrorReportingClient) { this.configRepository = configRepository; this.deploymentMode = deploymentMode; this.airbyteVersion = airbyteVersion; - this.normalizationImage = normalizationImage; - this.normalizationVersion = normalizationVersion; this.webUrlHelper = webUrlHelper; this.jobErrorReportingClient = jobErrorReportingClient; } @@ -119,10 +114,11 @@ public void reportSyncJobFailure(final UUID connectionId, final AttemptFailureSu // the destination) final Map metadata = MoreMaps.merge( commonMetadata, - getNormalizationMetadata(), + getNormalizationMetadata(destinationDefinition.getNormalizationRepository()), prefixConnectorMetadataKeys(getSourceMetadata(sourceDefinition), "source"), getDestinationMetadata(destinationDefinition)); - final String dockerImage = String.format("%s:%s", normalizationImage, normalizationVersion); + final String dockerImage = DockerUtils.getTaggedImageName(destinationDefinition.getNormalizationRepository(), + destinationDefinition.getNormalizationTag()); reportJobFailureReason(workspace, failureReason, dockerImage, metadata); } @@ -229,7 +225,7 @@ private Map getSourceMetadata(final StandardSourceDefinition sou Map.entry(CONNECTOR_RELEASE_STAGE_META_KEY, sourceDefinition.getReleaseStage().value())); } - private Map getNormalizationMetadata() { + private Map getNormalizationMetadata(String normalizationImage) { return Map.ofEntries( Map.entry(NORMALIZATION_REPOSITORY_META_KEY, normalizationImage)); } diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactory.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactory.java index b83d8f3497dc..116114e061cc 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactory.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactory.java @@ -8,7 +8,6 @@ import com.google.common.collect.Lists; import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.version.Version; -import io.airbyte.config.ActorDefinitionResourceRequirements; import io.airbyte.config.DestinationConnection; import io.airbyte.config.SourceConnection; import io.airbyte.config.StandardDestinationDefinition; @@ -78,13 +77,10 @@ public Long create(final UUID connectionId) { standardSyncOperations.add(standardSyncOperation); } - ActorDefinitionResourceRequirements sourceResourceRequirements = sourceDefinition.getResourceRequirements(); - ActorDefinitionResourceRequirements destinationResourceRequirements = destinationDefinition.getResourceRequirements(); - // for OSS users, make it possible to ignore default actor-level resource requirements if (!connectorSpecificResourceDefaultsEnabled) { - sourceResourceRequirements = null; - destinationResourceRequirements = null; + sourceDefinition.setResourceRequirements(null); + destinationDefinition.setResourceRequirements(null); } return jobCreator.createSyncJob( @@ -97,8 +93,8 @@ public Long create(final UUID connectionId) { new Version(destinationDefinition.getProtocolVersion()), standardSyncOperations, workspace.getWebhookOperationConfigs(), - sourceResourceRequirements, - destinationResourceRequirements) + sourceDefinition, + destinationDefinition) .orElseThrow(() -> new IllegalStateException("We shouldn't be trying to create a new sync job if there is one running already.")); } catch (final IOException | JsonValidationException | ConfigNotFoundException e) { diff --git a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/DefaultJobCreatorTest.java b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/DefaultJobCreatorTest.java index 8fedbae6cd4b..1804f3226a67 100644 --- a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/DefaultJobCreatorTest.java +++ b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/DefaultJobCreatorTest.java @@ -29,6 +29,8 @@ import io.airbyte.config.ResetSourceConfiguration; import io.airbyte.config.ResourceRequirements; import io.airbyte.config.SourceConnection; +import io.airbyte.config.StandardDestinationDefinition; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.StandardSyncOperation.OperatorType; @@ -69,6 +71,9 @@ class DefaultJobCreatorTest { private static final DestinationConnection DESTINATION_CONNECTION; private static final StandardSync STANDARD_SYNC; private static final StandardSyncOperation STANDARD_SYNC_OPERATION; + + private static final StandardSourceDefinition STANDARD_SOURCE_DEFINITION; + private static final StandardDestinationDefinition STANDARD_DESTINATION_DEFINITION; private static final long JOB_ID = 12L; private JobPersistence jobPersistence; @@ -149,6 +154,9 @@ class DefaultJobCreatorTest { PERSISTED_WEBHOOK_CONFIGS = Jsons.deserialize( String.format("{\"webhookConfigs\": [{\"id\": \"%s\", \"name\": \"%s\", \"authToken\": {\"_secret\": \"a-secret_v1\"}}]}", WEBHOOK_CONFIG_ID, WEBHOOK_NAME)); + + STANDARD_SOURCE_DEFINITION = new StandardSourceDefinition().withCustom(false); + STANDARD_DESTINATION_DEFINITION = new StandardDestinationDefinition().withCustom(false); } @BeforeEach @@ -180,7 +188,9 @@ void testCreateSyncJob() throws IOException { .withResourceRequirements(workerResourceRequirements) .withSourceResourceRequirements(workerResourceRequirements) .withDestinationResourceRequirements(workerResourceRequirements) - .withWebhookOperationConfigs(PERSISTED_WEBHOOK_CONFIGS); + .withWebhookOperationConfigs(PERSISTED_WEBHOOK_CONFIGS) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig jobConfig = new JobConfig() .withConfigType(JobConfig.ConfigType.SYNC) @@ -199,8 +209,8 @@ void testCreateSyncJob() throws IOException { DESTINATION_PROTOCOL_VERSION, List.of(STANDARD_SYNC_OPERATION), PERSISTED_WEBHOOK_CONFIGS, - null, - null).orElseThrow(); + STANDARD_SOURCE_DEFINITION, + STANDARD_DESTINATION_DEFINITION).orElseThrow(); assertEquals(JOB_ID, jobId); } @@ -237,8 +247,7 @@ void testCreateSyncJobEnsureNoQueuing() throws IOException { DESTINATION_PROTOCOL_VERSION, List.of(STANDARD_SYNC_OPERATION), null, - null, - null).isEmpty()); + STANDARD_SOURCE_DEFINITION, STANDARD_DESTINATION_DEFINITION).isEmpty()); } @Test @@ -253,8 +262,7 @@ void testCreateSyncJobDefaultWorkerResourceReqs() throws IOException { DESTINATION_PROTOCOL_VERSION, List.of(STANDARD_SYNC_OPERATION), null, - null, - null); + STANDARD_SOURCE_DEFINITION, STANDARD_DESTINATION_DEFINITION); final JobSyncConfig expectedJobSyncConfig = new JobSyncConfig() .withNamespaceDefinition(STANDARD_SYNC.getNamespaceDefinition()) @@ -270,7 +278,9 @@ void testCreateSyncJobDefaultWorkerResourceReqs() throws IOException { .withOperationSequence(List.of(STANDARD_SYNC_OPERATION)) .withResourceRequirements(workerResourceRequirements) .withSourceResourceRequirements(workerResourceRequirements) - .withDestinationResourceRequirements(workerResourceRequirements); + .withDestinationResourceRequirements(workerResourceRequirements) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig expectedJobConfig = new JobConfig() .withConfigType(JobConfig.ConfigType.SYNC) @@ -300,8 +310,7 @@ void testCreateSyncJobConnectionResourceReqs() throws IOException { DESTINATION_PROTOCOL_VERSION, List.of(STANDARD_SYNC_OPERATION), null, - null, - null); + STANDARD_SOURCE_DEFINITION, STANDARD_DESTINATION_DEFINITION); final JobSyncConfig expectedJobSyncConfig = new JobSyncConfig() .withNamespaceDefinition(STANDARD_SYNC.getNamespaceDefinition()) @@ -317,7 +326,9 @@ void testCreateSyncJobConnectionResourceReqs() throws IOException { .withOperationSequence(List.of(STANDARD_SYNC_OPERATION)) .withResourceRequirements(standardSyncResourceRequirements) .withSourceResourceRequirements(standardSyncResourceRequirements) - .withDestinationResourceRequirements(standardSyncResourceRequirements); + .withDestinationResourceRequirements(standardSyncResourceRequirements) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig expectedJobConfig = new JobConfig() .withConfigType(JobConfig.ConfigType.SYNC) @@ -351,9 +362,9 @@ void testCreateSyncJobSourceAndDestinationResourceReqs() throws IOException { DESTINATION_PROTOCOL_VERSION, List.of(STANDARD_SYNC_OPERATION), null, - new ActorDefinitionResourceRequirements().withDefault(sourceResourceRequirements), - new ActorDefinitionResourceRequirements().withJobSpecific(List.of( - new JobTypeResourceLimit().withJobType(JobType.SYNC).withResourceRequirements(destResourceRequirements)))); + new StandardSourceDefinition().withResourceRequirements(new ActorDefinitionResourceRequirements().withDefault(sourceResourceRequirements)), + new StandardDestinationDefinition().withResourceRequirements(new ActorDefinitionResourceRequirements().withJobSpecific(List.of( + new JobTypeResourceLimit().withJobType(JobType.SYNC).withResourceRequirements(destResourceRequirements))))); final JobSyncConfig expectedJobSyncConfig = new JobSyncConfig() .withNamespaceDefinition(STANDARD_SYNC.getNamespaceDefinition()) @@ -369,7 +380,9 @@ void testCreateSyncJobSourceAndDestinationResourceReqs() throws IOException { .withOperationSequence(List.of(STANDARD_SYNC_OPERATION)) .withResourceRequirements(workerResourceRequirements) .withSourceResourceRequirements(sourceResourceRequirements) - .withDestinationResourceRequirements(destResourceRequirements); + .withDestinationResourceRequirements(destResourceRequirements) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig expectedJobConfig = new JobConfig() .withConfigType(JobConfig.ConfigType.SYNC) @@ -413,7 +426,9 @@ void testCreateResetConnectionJob() throws IOException { .withOperationSequence(List.of(STANDARD_SYNC_OPERATION)) .withResourceRequirements(workerResourceRequirements) .withResetSourceConfiguration(new ResetSourceConfiguration().withStreamsToReset(streamsToReset)) - .withState(connectionState); + .withState(connectionState) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig jobConfig = new JobConfig() .withConfigType(ConfigType.RESET_CONNECTION) @@ -427,6 +442,7 @@ void testCreateResetConnectionJob() throws IOException { STANDARD_SYNC, DESTINATION_IMAGE_NAME, DESTINATION_PROTOCOL_VERSION, + false, List.of(STANDARD_SYNC_OPERATION), streamsToReset); @@ -468,7 +484,9 @@ void testCreateResetConnectionJobEnsureNoQueuing() throws IOException { .withOperationSequence(List.of(STANDARD_SYNC_OPERATION)) .withResourceRequirements(workerResourceRequirements) .withResetSourceConfiguration(new ResetSourceConfiguration().withStreamsToReset(streamsToReset)) - .withState(connectionState); + .withState(connectionState) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobConfig jobConfig = new JobConfig() .withConfigType(ConfigType.RESET_CONNECTION) @@ -482,6 +500,7 @@ void testCreateResetConnectionJobEnsureNoQueuing() throws IOException { STANDARD_SYNC, DESTINATION_IMAGE_NAME, DESTINATION_PROTOCOL_VERSION, + false, List.of(STANDARD_SYNC_OPERATION), streamsToReset); diff --git a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/errorreporter/JobErrorReporterTest.java b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/errorreporter/JobErrorReporterTest.java index ae97e8fbeedb..6f71d8f98aa4 100644 --- a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/errorreporter/JobErrorReporterTest.java +++ b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/errorreporter/JobErrorReporterTest.java @@ -38,7 +38,7 @@ class JobErrorReporterTest { private static final DeploymentMode DEPLOYMENT_MODE = DeploymentMode.OSS; private static final String AIRBYTE_VERSION = "0.1.40"; private static final String NORMALIZATION_IMAGE = "airbyte/normalization"; - private static final String NORMALIZATION_VERSION = "0.2.18"; + private static final String NORMALIZATION_VERSION = "0.2.24"; private static final UUID SOURCE_DEFINITION_ID = UUID.randomUUID(); private static final String SOURCE_DEFINITION_NAME = "stripe"; private static final String SOURCE_DOCKER_REPOSITORY = "airbyte/source-stripe"; @@ -85,7 +85,7 @@ void setup() { jobErrorReportingClient = mock(JobErrorReportingClient.class); webUrlHelper = mock(WebUrlHelper.class); jobErrorReporter = new JobErrorReporter( - configRepository, DEPLOYMENT_MODE, AIRBYTE_VERSION, NORMALIZATION_IMAGE, NORMALIZATION_VERSION, webUrlHelper, jobErrorReportingClient); + configRepository, DEPLOYMENT_MODE, AIRBYTE_VERSION, webUrlHelper, jobErrorReportingClient); Mockito.when(webUrlHelper.getConnectionUrl(WORKSPACE_ID, CONNECTION_ID)).thenReturn(CONNECTION_URL); Mockito.when(webUrlHelper.getWorkspaceUrl(WORKSPACE_ID)).thenReturn(WORKSPACE_URL); @@ -138,6 +138,8 @@ void testReportSyncJobFailure() { .withDockerRepository(DESTINATION_DOCKER_REPOSITORY) .withReleaseStage(DESTINATION_RELEASE_STAGE) .withDestinationDefinitionId(DESTINATION_DEFINITION_ID) + .withNormalizationRepository(NORMALIZATION_IMAGE) + .withNormalizationTag(NORMALIZATION_VERSION) .withName(DESTINATION_DEFINITION_NAME)); final StandardWorkspace mWorkspace = Mockito.mock(StandardWorkspace.class); diff --git a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactoryTest.java b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactoryTest.java index dc2cfdc9285d..120f9e4b984f 100644 --- a/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactoryTest.java +++ b/airbyte-persistence/job-persistence/src/test/java/io/airbyte/persistence/job/factory/DefaultSyncJobFactoryTest.java @@ -63,6 +63,7 @@ void createSyncJobFromConnectionId() throws JsonValidationException, ConfigNotFo final SourceConnection sourceConnection = new SourceConnection().withSourceDefinitionId(sourceDefinitionId); final DestinationConnection destinationConnection = new DestinationConnection().withDestinationDefinitionId(destinationDefinitionId); + final String srcDockerRepo = "srcrepo"; final String srcDockerTag = "tag"; final String srcDockerImage = DockerUtils.getTaggedImageName(srcDockerRepo, srcDockerTag); @@ -72,6 +73,12 @@ void createSyncJobFromConnectionId() throws JsonValidationException, ConfigNotFo final String dstDockerTag = "tag"; final String dstDockerImage = DockerUtils.getTaggedImageName(dstDockerRepo, dstDockerTag); final Version dstProtocolVersion = new Version("0.3.2"); + final StandardSourceDefinition standardSourceDefinition = + new StandardSourceDefinition().withSourceDefinitionId(sourceDefinitionId).withDockerRepository(srcDockerRepo) + .withDockerImageTag(srcDockerTag).withProtocolVersion(srcProtocolVersion.serialize()); + final StandardDestinationDefinition standardDestinationDefinition = + new StandardDestinationDefinition().withDestinationDefinitionId(destinationDefinitionId).withDockerRepository(dstDockerRepo) + .withDockerImageTag(dstDockerTag).withProtocolVersion(dstProtocolVersion.serialize()); when(configRepository.getStandardSync(connectionId)).thenReturn(standardSync); when(configRepository.getSourceConnection(sourceId)).thenReturn(sourceConnection); @@ -80,15 +87,13 @@ void createSyncJobFromConnectionId() throws JsonValidationException, ConfigNotFo when( jobCreator.createSyncJob(sourceConnection, destinationConnection, standardSync, srcDockerImage, srcProtocolVersion, dstDockerImage, dstProtocolVersion, operations, - persistedWebhookConfigs, null, null)) + persistedWebhookConfigs, standardSourceDefinition, standardDestinationDefinition)) .thenReturn(Optional.of(jobId)); when(configRepository.getStandardSourceDefinition(sourceDefinitionId)) - .thenReturn(new StandardSourceDefinition().withSourceDefinitionId(sourceDefinitionId).withDockerRepository(srcDockerRepo) - .withDockerImageTag(srcDockerTag).withProtocolVersion(srcProtocolVersion.serialize())); + .thenReturn(standardSourceDefinition); when(configRepository.getStandardDestinationDefinition(destinationDefinitionId)) - .thenReturn(new StandardDestinationDefinition().withDestinationDefinitionId(destinationDefinitionId).withDockerRepository(dstDockerRepo) - .withDockerImageTag(dstDockerTag).withProtocolVersion(dstProtocolVersion.serialize())); + .thenReturn(standardDestinationDefinition); when(configRepository.getStandardWorkspaceNoSecrets(any(), eq(true))).thenReturn( new StandardWorkspace().withWebhookOperationConfigs(persistedWebhookConfigs)); @@ -100,7 +105,7 @@ void createSyncJobFromConnectionId() throws JsonValidationException, ConfigNotFo verify(jobCreator) .createSyncJob(sourceConnection, destinationConnection, standardSync, srcDockerImage, srcProtocolVersion, dstDockerImage, dstProtocolVersion, operations, persistedWebhookConfigs, - null, null); + standardSourceDefinition, standardDestinationDefinition); } } diff --git a/airbyte-proxy/Dockerfile b/airbyte-proxy/Dockerfile index f55c0dc6dc59..ce527eec1cb9 100644 --- a/airbyte-proxy/Dockerfile +++ b/airbyte-proxy/Dockerfile @@ -2,7 +2,7 @@ FROM nginx:latest -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-proxy ENV VERSION ${VERSION} diff --git a/airbyte-server/Dockerfile b/airbyte-server/Dockerfile index c52c9345ed40..1265f5d3c9e4 100644 --- a/airbyte-server/Dockerfile +++ b/airbyte-server/Dockerfile @@ -3,7 +3,7 @@ FROM ${JDK_IMAGE} AS server EXPOSE 8000 -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-server ENV VERSION ${VERSION} diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java index f4f3fd9eaf31..8ff60b662a0f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java @@ -51,7 +51,6 @@ import io.airbyte.server.errors.UncaughtExceptionMapper; import io.airbyte.server.handlers.AttemptHandler; import io.airbyte.server.handlers.ConnectionsHandler; -import io.airbyte.server.handlers.DbMigrationHandler; import io.airbyte.server.handlers.DestinationDefinitionsHandler; import io.airbyte.server.handlers.DestinationHandler; import io.airbyte.server.handlers.HealthCheckHandler; @@ -72,7 +71,6 @@ import io.airbyte.server.scheduler.TemporalEventRunner; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.workers.helper.ConnectionHelper; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; import io.temporal.serviceclient.WorkflowServiceStubs; import java.net.http.HttpClient; import java.util.Map; @@ -223,8 +221,6 @@ public static ServerRunnable getServer(final ServerFactory apiFactory, configRepository, configs.getDeploymentMode(), configs.getAirbyteVersionOrWarning(), - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME, - NormalizationRunnerFactory.NORMALIZATION_VERSION, webUrlHelper, jobErrorReportingClient); @@ -292,8 +288,6 @@ public static ServerRunnable getServer(final ServerFactory apiFactory, connectionsHandler, envVariableFeatureFlags); - final DbMigrationHandler dbMigrationHandler = new DbMigrationHandler(configsDatabase, configsFlyway, jobsDatabase, jobsFlyway); - final DestinationDefinitionsHandler destinationDefinitionsHandler = new DestinationDefinitionsHandler(configRepository, syncSchedulerClient, destinationHandler); @@ -371,7 +365,6 @@ public static ServerRunnable getServer(final ServerFactory apiFactory, jobsFlyway, attemptHandler, connectionsHandler, - dbMigrationHandler, destinationDefinitionsHandler, destinationHandler, healthCheckHandler, @@ -406,9 +399,9 @@ public static void main(final String[] args) { // Ensure that the database resources are closed on application shutdown CloseableShutdownHook.registerRuntimeShutdownHook(configsDataSource, jobsDataSource, configsDslContext, jobsDslContext); - final Flyway configsFlyway = FlywayFactory.create(configsDataSource, DbMigrationHandler.class.getSimpleName(), + final Flyway configsFlyway = FlywayFactory.create(configsDataSource, ServerApp.class.getSimpleName(), ConfigsDatabaseMigrator.DB_IDENTIFIER, ConfigsDatabaseMigrator.MIGRATION_FILE_LOCATION); - final Flyway jobsFlyway = FlywayFactory.create(jobsDataSource, DbMigrationHandler.class.getSimpleName(), JobsDatabaseMigrator.DB_IDENTIFIER, + final Flyway jobsFlyway = FlywayFactory.create(jobsDataSource, ServerApp.class.getSimpleName(), JobsDatabaseMigrator.DB_IDENTIFIER, JobsDatabaseMigrator.MIGRATION_FILE_LOCATION); getServer(new ServerFactory.Api(), configs, configsDslContext, configsFlyway, jobsDslContext, jobsFlyway).start(); diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java index cd861f698dc6..6eb0c95f3934 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java @@ -15,7 +15,6 @@ import io.airbyte.persistence.job.JobPersistence; import io.airbyte.server.apis.AttemptApiController; import io.airbyte.server.apis.ConnectionApiController; -import io.airbyte.server.apis.DbMigrationApiController; import io.airbyte.server.apis.DestinationApiController; import io.airbyte.server.apis.DestinationDefinitionApiController; import io.airbyte.server.apis.DestinationDefinitionSpecificationApiController; @@ -36,7 +35,6 @@ import io.airbyte.server.apis.WorkspaceApiController; import io.airbyte.server.apis.binders.AttemptApiBinder; import io.airbyte.server.apis.binders.ConnectionApiBinder; -import io.airbyte.server.apis.binders.DbMigrationBinder; import io.airbyte.server.apis.binders.DestinationApiBinder; import io.airbyte.server.apis.binders.DestinationDefinitionApiBinder; import io.airbyte.server.apis.binders.DestinationDefinitionSpecificationApiBinder; @@ -57,7 +55,6 @@ import io.airbyte.server.apis.binders.WorkspaceApiBinder; import io.airbyte.server.apis.factories.AttemptApiFactory; import io.airbyte.server.apis.factories.ConnectionApiFactory; -import io.airbyte.server.apis.factories.DbMigrationApiFactory; import io.airbyte.server.apis.factories.DestinationApiFactory; import io.airbyte.server.apis.factories.DestinationDefinitionApiFactory; import io.airbyte.server.apis.factories.DestinationDefinitionSpecificationApiFactory; @@ -78,7 +75,6 @@ import io.airbyte.server.apis.factories.WorkspaceApiFactory; import io.airbyte.server.handlers.AttemptHandler; import io.airbyte.server.handlers.ConnectionsHandler; -import io.airbyte.server.handlers.DbMigrationHandler; import io.airbyte.server.handlers.DestinationDefinitionsHandler; import io.airbyte.server.handlers.DestinationHandler; import io.airbyte.server.handlers.HealthCheckHandler; @@ -123,7 +119,6 @@ ServerRunnable create(final SynchronousSchedulerClient synchronousSchedulerClien final Flyway jobsFlyway, final AttemptHandler attemptHandler, final ConnectionsHandler connectionsHandler, - final DbMigrationHandler dbMigrationHandler, final DestinationDefinitionsHandler destinationDefinitionsHandler, final DestinationHandler destinationApiHandler, final HealthCheckHandler healthCheckHandler, @@ -161,7 +156,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul final Flyway jobsFlyway, final AttemptHandler attemptHandler, final ConnectionsHandler connectionsHandler, - final DbMigrationHandler dbMigrationHandler, final DestinationDefinitionsHandler destinationDefinitionsHandler, final DestinationHandler destinationApiHandler, final HealthCheckHandler healthCheckHandler, @@ -187,8 +181,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul schedulerHandler, mdc); - DbMigrationApiFactory.setValues(dbMigrationHandler, mdc); - DestinationApiFactory.setValues(destinationApiHandler, schedulerHandler, mdc); DestinationDefinitionApiFactory.setValues(destinationDefinitionsHandler); @@ -229,7 +221,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul final Set> componentClasses = Set.of( AttemptApiController.class, ConnectionApiController.class, - DbMigrationApiController.class, DestinationApiController.class, DestinationDefinitionApiController.class, DestinationDefinitionSpecificationApiController.class, @@ -253,7 +244,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul new CorsFilter(), new AttemptApiBinder(), new ConnectionApiBinder(), - new DbMigrationBinder(), new DestinationApiBinder(), new DestinationDefinitionApiBinder(), new DestinationDefinitionSpecificationApiBinder(), diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DbMigrationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DbMigrationApiController.java deleted file mode 100644 index 202b1c4da554..000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DbMigrationApiController.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis; - -import io.airbyte.api.generated.DbMigrationApi; -import io.airbyte.api.model.generated.DbMigrationExecutionRead; -import io.airbyte.api.model.generated.DbMigrationReadList; -import io.airbyte.api.model.generated.DbMigrationRequestBody; -import io.airbyte.server.handlers.DbMigrationHandler; -import javax.ws.rs.Path; - -@Path("/v1/db_migrations") -public class DbMigrationApiController implements DbMigrationApi { - - private final DbMigrationHandler dbMigrationHandler; - - public DbMigrationApiController(final DbMigrationHandler dbMigrationHandler) { - this.dbMigrationHandler = dbMigrationHandler; - } - - @Override - public DbMigrationExecutionRead executeMigrations(final DbMigrationRequestBody dbMigrationRequestBody) { - return ApiHelper.execute(() -> dbMigrationHandler.migrate(dbMigrationRequestBody)); - } - - @Override - public DbMigrationReadList listMigrations(final DbMigrationRequestBody dbMigrationRequestBody) { - return ApiHelper.execute(() -> dbMigrationHandler.list(dbMigrationRequestBody)); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java index f5916639534d..d2325703298d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java @@ -6,8 +6,6 @@ import io.airbyte.api.generated.DestinationDefinitionApi; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; -import io.airbyte.api.model.generated.CustomDestinationDefinitionUpdate; -import io.airbyte.api.model.generated.DestinationDefinitionCreate; import io.airbyte.api.model.generated.DestinationDefinitionIdRequestBody; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionRead; @@ -31,21 +29,6 @@ public DestinationDefinitionRead createCustomDestinationDefinition(final CustomD return ApiHelper.execute(() -> destinationDefinitionsHandler.createCustomDestinationDefinition(customDestinationDefinitionCreate)); } - // TODO: Deprecate this route in favor of createCustomDestinationDefinition - // since all connector definitions created through the API are custom - @Override - public DestinationDefinitionRead createDestinationDefinition(final DestinationDefinitionCreate destinationDefinitionCreate) { - return ApiHelper.execute(() -> destinationDefinitionsHandler.createPrivateDestinationDefinition(destinationDefinitionCreate)); - } - - @Override - public void deleteCustomDestinationDefinition(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) { - ApiHelper.execute(() -> { - destinationDefinitionsHandler.deleteCustomDestinationDefinition(destinationDefinitionIdWithWorkspaceId); - return null; - }); - } - @Override public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) { ApiHelper.execute(() -> { @@ -98,11 +81,6 @@ public void revokeDestinationDefinitionFromWorkspace(final DestinationDefinition }); } - @Override - public DestinationDefinitionRead updateCustomDestinationDefinition(final CustomDestinationDefinitionUpdate customDestinationDefinitionUpdate) { - return ApiHelper.execute(() -> destinationDefinitionsHandler.updateCustomDestinationDefinition(customDestinationDefinitionUpdate)); - } - @Override public DestinationDefinitionRead updateDestinationDefinition(final DestinationDefinitionUpdate destinationDefinitionUpdate) { return ApiHelper.execute(() -> destinationDefinitionsHandler.updateDestinationDefinition(destinationDefinitionUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java index c47ab1fac43e..8820b6287e4f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java @@ -6,10 +6,8 @@ import io.airbyte.api.generated.SourceDefinitionApi; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; -import io.airbyte.api.model.generated.CustomSourceDefinitionUpdate; import io.airbyte.api.model.generated.PrivateSourceDefinitionRead; import io.airbyte.api.model.generated.PrivateSourceDefinitionReadList; -import io.airbyte.api.model.generated.SourceDefinitionCreate; import io.airbyte.api.model.generated.SourceDefinitionIdRequestBody; import io.airbyte.api.model.generated.SourceDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.SourceDefinitionRead; @@ -31,21 +29,6 @@ public SourceDefinitionRead createCustomSourceDefinition(final CustomSourceDefin return ApiHelper.execute(() -> sourceDefinitionsHandler.createCustomSourceDefinition(customSourceDefinitionCreate)); } - // TODO: Deprecate this route in favor of createCustomSourceDefinition - // since all connector definitions created through the API are custom - @Override - public SourceDefinitionRead createSourceDefinition(final SourceDefinitionCreate sourceDefinitionCreate) { - return ApiHelper.execute(() -> sourceDefinitionsHandler.createPrivateSourceDefinition(sourceDefinitionCreate)); - } - - @Override - public void deleteCustomSourceDefinition(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { - ApiHelper.execute(() -> { - sourceDefinitionsHandler.deleteCustomSourceDefinition(sourceDefinitionIdWithWorkspaceId); - return null; - }); - } - @Override public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) { ApiHelper.execute(() -> { @@ -97,11 +80,6 @@ public void revokeSourceDefinitionFromWorkspace(final SourceDefinitionIdWithWork }); } - @Override - public SourceDefinitionRead updateCustomSourceDefinition(final CustomSourceDefinitionUpdate customSourceDefinitionUpdate) { - return ApiHelper.execute(() -> sourceDefinitionsHandler.updateCustomSourceDefinition(customSourceDefinitionUpdate)); - } - @Override public SourceDefinitionRead updateSourceDefinition(final SourceDefinitionUpdate sourceDefinitionUpdate) { return ApiHelper.execute(() -> sourceDefinitionsHandler.updateSourceDefinition(sourceDefinitionUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DbMigrationBinder.java b/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DbMigrationBinder.java deleted file mode 100644 index 78471be218d4..000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DbMigrationBinder.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis.binders; - -import io.airbyte.server.apis.DbMigrationApiController; -import io.airbyte.server.apis.factories.DbMigrationApiFactory; -import org.glassfish.hk2.utilities.binding.AbstractBinder; -import org.glassfish.jersey.process.internal.RequestScoped; - -public class DbMigrationBinder extends AbstractBinder { - - @Override - protected void configure() { - bindFactory(DbMigrationApiFactory.class) - .to(DbMigrationApiController.class) - .in(RequestScoped.class); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DbMigrationApiFactory.java b/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DbMigrationApiFactory.java deleted file mode 100644 index ee4430f48e94..000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DbMigrationApiFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis.factories; - -import io.airbyte.server.apis.DbMigrationApiController; -import io.airbyte.server.handlers.DbMigrationHandler; -import java.util.Map; -import org.glassfish.hk2.api.Factory; -import org.slf4j.MDC; - -public class DbMigrationApiFactory implements Factory { - - private static DbMigrationHandler dbMigrationHandler; - private static Map mdc; - - public static void setValues(final DbMigrationHandler dbMigrationHandler, final Map mdc) { - DbMigrationApiFactory.dbMigrationHandler = dbMigrationHandler; - DbMigrationApiFactory.mdc = mdc; - } - - @Override - public DbMigrationApiController provide() { - MDC.setContextMap(DbMigrationApiFactory.mdc); - - return new DbMigrationApiController(dbMigrationHandler); - } - - @Override - public void dispose(final DbMigrationApiController instance) { - /* no op */ - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/DbMigrationHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/DbMigrationHandler.java deleted file mode 100644 index 4691deeeca27..000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/DbMigrationHandler.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.handlers; - -import io.airbyte.api.model.generated.DbMigrationExecutionRead; -import io.airbyte.api.model.generated.DbMigrationRead; -import io.airbyte.api.model.generated.DbMigrationReadList; -import io.airbyte.api.model.generated.DbMigrationRequestBody; -import io.airbyte.api.model.generated.DbMigrationState; -import io.airbyte.db.Database; -import io.airbyte.db.instance.DatabaseMigrator; -import io.airbyte.db.instance.configs.ConfigsDatabaseMigrator; -import io.airbyte.db.instance.jobs.JobsDatabaseMigrator; -import java.util.stream.Collectors; -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.MigrationInfo; -import org.flywaydb.core.api.output.MigrateOutput; -import org.flywaydb.core.api.output.MigrateResult; - -public class DbMigrationHandler { - - private final DatabaseMigrator configDbMigrator; - private final DatabaseMigrator jobDbMigrator; - - public DbMigrationHandler(final Database configsDatabase, final Flyway configsFlyway, final Database jobsDatabase, final Flyway jobsFlyway) { - this.configDbMigrator = new ConfigsDatabaseMigrator(configsDatabase, configsFlyway); - this.jobDbMigrator = new JobsDatabaseMigrator(jobsDatabase, jobsFlyway); - } - - public DbMigrationReadList list(final DbMigrationRequestBody request) { - final DatabaseMigrator migrator = getMigrator(request.getDatabase()); - return new DbMigrationReadList() - .migrations(migrator.list().stream().map(DbMigrationHandler::toMigrationRead).collect(Collectors.toList())); - } - - public DbMigrationExecutionRead migrate(final DbMigrationRequestBody request) { - final DatabaseMigrator migrator = getMigrator(request.getDatabase()); - final MigrateResult result = migrator.migrate(); - return new DbMigrationExecutionRead() - .initialVersion(result.initialSchemaVersion) - .targetVersion(result.targetSchemaVersion) - .executedMigrations(result.migrations.stream().map(DbMigrationHandler::toMigrationRead).collect(Collectors.toList())); - } - - private DatabaseMigrator getMigrator(final String database) { - if ("configs".equalsIgnoreCase(database)) { - return configDbMigrator; - } else if ("jobs".equalsIgnoreCase(database)) { - return jobDbMigrator; - } - throw new IllegalArgumentException("Unexpected database: " + database); - } - - private static DbMigrationRead toMigrationRead(final MigrationInfo info) { - return new DbMigrationRead() - .migrationType(info.getType().name()) - .migrationVersion(info.getVersion().toString()) - .migrationDescription(info.getDescription()) - .migrationState(DbMigrationState.fromValue(info.getState().name())) - .migratedBy(info.getInstalledBy()) - .migratedAt(info.getInstalledOn() == null ? null : info.getInstalledOn().getTime()) - .migrationScript(info.getScript()); - } - - private static DbMigrationRead toMigrationRead(final MigrateOutput output) { - return new DbMigrationRead() - .migrationType(String.format("%s %s", output.type, output.category)) - .migrationVersion(output.version) - .migrationDescription(output.description) - .migrationScript(output.filepath); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java index 0a995f4ba717..d70742f887f8 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java @@ -8,7 +8,6 @@ import com.google.common.annotations.VisibleForTesting; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; -import io.airbyte.api.model.generated.CustomDestinationDefinitionUpdate; import io.airbyte.api.model.generated.DestinationDefinitionCreate; import io.airbyte.api.model.generated.DestinationDefinitionIdRequestBody; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; @@ -184,20 +183,6 @@ public DestinationDefinitionRead getDestinationDefinitionForWorkspace( return getDestinationDefinition(new DestinationDefinitionIdRequestBody().destinationDefinitionId(definitionId)); } - public DestinationDefinitionRead createPrivateDestinationDefinition(final DestinationDefinitionCreate destinationDefCreate) - throws JsonValidationException, IOException { - final StandardDestinationDefinition destinationDefinition = destinationDefinitionFromCreate(destinationDefCreate) - .withPublic(false) - .withCustom(false); - if (!protocolVersionRange.isSupported(new Version(destinationDefinition.getProtocolVersion()))) { - throw new UnsupportedProtocolVersionException(destinationDefinition.getProtocolVersion(), protocolVersionRange.min(), - protocolVersionRange.max()); - } - configRepository.writeStandardDestinationDefinition(destinationDefinition); - - return buildDestinationDefinitionRead(destinationDefinition); - } - public DestinationDefinitionRead createCustomDestinationDefinition(final CustomDestinationDefinitionCreate customDestinationDefinitionCreate) throws IOException { final StandardDestinationDefinition destinationDefinition = destinationDefinitionFromCreate( @@ -216,7 +201,9 @@ public DestinationDefinitionRead createCustomDestinationDefinition(final CustomD private StandardDestinationDefinition destinationDefinitionFromCreate(final DestinationDefinitionCreate destinationDefCreate) throws IOException { final ConnectorSpecification spec = getSpecForImage( destinationDefCreate.getDockerRepository(), - destinationDefCreate.getDockerImageTag()); + destinationDefCreate.getDockerImageTag(), + // Only custom connectors can be created via handlers. + true); final Version airbyteProtocolVersion = AirbyteProtocolVersion.getWithDefault(spec.getProtocolVersion()); @@ -246,7 +233,7 @@ public DestinationDefinitionRead updateDestinationDefinition(final DestinationDe final boolean specNeedsUpdate = !currentDestination.getDockerImageTag().equals(destinationDefinitionUpdate.getDockerImageTag()) || destinationDefinitionUpdate.getDockerImageTag().equals(DEV_IMAGE_TAG); final ConnectorSpecification spec = specNeedsUpdate - ? getSpecForImage(currentDestination.getDockerRepository(), destinationDefinitionUpdate.getDockerImageTag()) + ? getSpecForImage(currentDestination.getDockerRepository(), destinationDefinitionUpdate.getDockerImageTag(), currentDestination.getCustom()) : currentDestination.getSpec(); final ActorDefinitionResourceRequirements updatedResourceReqs = destinationDefinitionUpdate.getResourceRequirements() != null ? ApiPojoConverters.actorDefResourceReqsToInternal(destinationDefinitionUpdate.getResourceRequirements()) @@ -267,6 +254,7 @@ public DestinationDefinitionRead updateDestinationDefinition(final DestinationDe .withNormalizationRepository(currentDestination.getNormalizationRepository()) .withNormalizationTag(currentDestination.getNormalizationTag()) .withSupportsDbt(currentDestination.getSupportsDbt()) + .withIntegrationType(currentDestination.getIntegrationType()) .withSpec(spec) .withProtocolVersion(airbyteProtocolVersion.serialize()) .withTombstone(currentDestination.getTombstone()) @@ -281,16 +269,6 @@ public DestinationDefinitionRead updateDestinationDefinition(final DestinationDe return buildDestinationDefinitionRead(newDestination); } - public DestinationDefinitionRead updateCustomDestinationDefinition(final CustomDestinationDefinitionUpdate customDestinationDefinitionUpdate) - throws IOException, JsonValidationException, ConfigNotFoundException { - final UUID definitionId = customDestinationDefinitionUpdate.getDestinationDefinition().getDestinationDefinitionId(); - final UUID workspaceId = customDestinationDefinitionUpdate.getWorkspaceId(); - if (!configRepository.workspaceCanUseCustomDefinition(definitionId, workspaceId)) { - throw new IdNotFoundKnownException("Cannot find the requested definition with given id for this workspace", definitionId.toString()); - } - return updateDestinationDefinition(customDestinationDefinitionUpdate.getDestinationDefinition()); - } - public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) throws JsonValidationException, ConfigNotFoundException, IOException { // "delete" all destinations associated with the destination definition as well. This will cascade @@ -309,19 +287,9 @@ public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody configRepository.writeStandardDestinationDefinition(persistedDestinationDefinition); } - public void deleteCustomDestinationDefinition(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) - throws IOException, JsonValidationException, ConfigNotFoundException { - final UUID definitionId = destinationDefinitionIdWithWorkspaceId.getDestinationDefinitionId(); - final UUID workspaceId = destinationDefinitionIdWithWorkspaceId.getWorkspaceId(); - if (!configRepository.workspaceCanUseCustomDefinition(definitionId, workspaceId)) { - throw new IdNotFoundKnownException("Cannot find the requested definition with given id for this workspace", definitionId.toString()); - } - deleteDestinationDefinition(new DestinationDefinitionIdRequestBody().destinationDefinitionId(definitionId)); - } - - private ConnectorSpecification getSpecForImage(final String dockerRepository, final String imageTag) throws IOException { + private ConnectorSpecification getSpecForImage(final String dockerRepository, final String imageTag, boolean isCustomConnector) throws IOException { final String imageName = DockerUtils.getTaggedImageName(dockerRepository, imageTag); - final SynchronousResponse getSpecResponse = schedulerSynchronousClient.createGetSpecJob(imageName); + final SynchronousResponse getSpecResponse = schedulerSynchronousClient.createGetSpecJob(imageName, isCustomConnector); return SpecFetcher.getSpecFromJob(getSpecResponse); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index 7621cb4baf93..bef867d6dfdb 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -152,9 +152,10 @@ public CheckConnectionRead checkSourceConnectionFromSourceId(final SourceIdReque final SourceConnection source = configRepository.getSourceConnection(sourceIdRequestBody.getSourceId()); final StandardSourceDefinition sourceDef = configRepository.getStandardSourceDefinition(source.getSourceDefinitionId()); final String imageName = DockerUtils.getTaggedImageName(sourceDef.getDockerRepository(), sourceDef.getDockerImageTag()); + final boolean isCustomConnector = sourceDef.getCustom(); final Version protocolVersion = new Version(sourceDef.getProtocolVersion()); - return reportConnectionStatus(synchronousSchedulerClient.createSourceCheckConnectionJob(source, imageName, protocolVersion)); + return reportConnectionStatus(synchronousSchedulerClient.createSourceCheckConnectionJob(source, imageName, protocolVersion, isCustomConnector)); } public CheckConnectionRead checkSourceConnectionFromSourceCreate(final SourceCoreConfig sourceConfig) @@ -174,7 +175,8 @@ public CheckConnectionRead checkSourceConnectionFromSourceCreate(final SourceCor final Version protocolVersion = new Version(sourceDef.getProtocolVersion()); final String imageName = DockerUtils.getTaggedImageName(sourceDef.getDockerRepository(), sourceDef.getDockerImageTag()); - return reportConnectionStatus(synchronousSchedulerClient.createSourceCheckConnectionJob(source, imageName, protocolVersion)); + final boolean isCustomConnector = sourceDef.getCustom(); + return reportConnectionStatus(synchronousSchedulerClient.createSourceCheckConnectionJob(source, imageName, protocolVersion, isCustomConnector)); } public CheckConnectionRead checkSourceConnectionFromSourceIdForUpdate(final SourceUpdate sourceUpdate) @@ -197,8 +199,10 @@ public CheckConnectionRead checkDestinationConnectionFromDestinationId(final Des final DestinationConnection destination = configRepository.getDestinationConnection(destinationIdRequestBody.getDestinationId()); final StandardDestinationDefinition destinationDef = configRepository.getStandardDestinationDefinition(destination.getDestinationDefinitionId()); final String imageName = DockerUtils.getTaggedImageName(destinationDef.getDockerRepository(), destinationDef.getDockerImageTag()); + final boolean isCustomConnector = destinationDef.getCustom(); final Version protocolVersion = new Version(destinationDef.getProtocolVersion()); - return reportConnectionStatus(synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, imageName, protocolVersion)); + return reportConnectionStatus( + synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, imageName, protocolVersion, isCustomConnector)); } public CheckConnectionRead checkDestinationConnectionFromDestinationCreate(final DestinationCoreConfig destinationConfig) @@ -207,6 +211,7 @@ public CheckConnectionRead checkDestinationConnectionFromDestinationCreate(final final var partialConfig = secretsRepositoryWriter.statefulSplitEphemeralSecrets( destinationConfig.getConnectionConfiguration(), destDef.getSpec()); + final boolean isCustomConnector = destDef.getCustom(); // todo (cgardens) - narrow the struct passed to the client. we are not setting fields that are // technically declared as required. @@ -214,10 +219,10 @@ public CheckConnectionRead checkDestinationConnectionFromDestinationCreate(final .withDestinationDefinitionId(destinationConfig.getDestinationDefinitionId()) .withConfiguration(partialConfig) .withWorkspaceId(destinationConfig.getWorkspaceId()); - final String imageName = DockerUtils.getTaggedImageName(destDef.getDockerRepository(), destDef.getDockerImageTag()); final Version protocolVersion = new Version(destDef.getProtocolVersion()); - return reportConnectionStatus(synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, imageName, protocolVersion)); + return reportConnectionStatus( + synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, imageName, protocolVersion, isCustomConnector)); } public CheckConnectionRead checkDestinationConnectionFromDestinationIdForUpdate(final DestinationUpdate destinationUpdate) @@ -240,6 +245,7 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceId(final Source final SourceConnection source = configRepository.getSourceConnection(discoverSchemaRequestBody.getSourceId()); final StandardSourceDefinition sourceDef = configRepository.getStandardSourceDefinition(source.getSourceDefinitionId()); final String imageName = DockerUtils.getTaggedImageName(sourceDef.getDockerRepository(), sourceDef.getDockerImageTag()); + final boolean isCustomConnector = sourceDef.getCustom(); final String configHash = HASH_FUNCTION.hashBytes(Jsons.serialize(source.getConfiguration()).getBytes( Charsets.UTF_8)).toString(); @@ -249,7 +255,12 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceId(final Source final boolean bustActorCatalogCache = discoverSchemaRequestBody.getDisableCache() != null && discoverSchemaRequestBody.getDisableCache(); if (currentCatalog.isEmpty() || bustActorCatalogCache) { final SynchronousResponse persistedCatalogId = - synchronousSchedulerClient.createDiscoverSchemaJob(source, imageName, connectorVersion, new Version(sourceDef.getProtocolVersion())); + synchronousSchedulerClient.createDiscoverSchemaJob( + source, + imageName, + connectorVersion, + new Version(sourceDef.getProtocolVersion()), + isCustomConnector); final SourceDiscoverSchemaRead discoveredSchema = retrieveDiscoveredSchema(persistedCatalogId); if (discoverSchemaRequestBody.getConnectionId() != null) { @@ -281,14 +292,20 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceCreate(final So sourceDef.getSpec()); final String imageName = DockerUtils.getTaggedImageName(sourceDef.getDockerRepository(), sourceDef.getDockerImageTag()); + final boolean isCustomConnector = sourceDef.getCustom(); // todo (cgardens) - narrow the struct passed to the client. we are not setting fields that are // technically declared as required. final SourceConnection source = new SourceConnection() .withSourceDefinitionId(sourceCreate.getSourceDefinitionId()) .withConfiguration(partialConfig) .withWorkspaceId(sourceCreate.getWorkspaceId()); - final SynchronousResponse response = synchronousSchedulerClient.createDiscoverSchemaJob(source, imageName, sourceDef.getDockerImageTag(), - new Version(sourceDef.getProtocolVersion())); + final SynchronousResponse response = synchronousSchedulerClient.createDiscoverSchemaJob( + source, + imageName, + sourceDef.getDockerImageTag(), + new Version( + sourceDef.getProtocolVersion()), + isCustomConnector); return retrieveDiscoveredSchema(response); } @@ -297,7 +314,7 @@ private SourceDiscoverSchemaRead retrieveDiscoveredSchema(final SynchronousRespo .jobInfo(jobConverter.getSynchronousJobRead(response)); if (response.isSuccess()) { - ActorCatalog catalog = configRepository.getActorCatalogById(response.getOutput()); + final ActorCatalog catalog = configRepository.getActorCatalogById(response.getOutput()); final AirbyteCatalog persistenceCatalog = Jsons.object(catalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); sourceDiscoverSchemaRead.catalog(CatalogConverter.toApi(persistenceCatalog)); @@ -352,7 +369,8 @@ public DestinationDefinitionSpecificationRead getDestinationSpecification( return specRead; } - public JobInfoRead syncConnection(final ConnectionIdRequestBody connectionIdRequestBody) throws IOException { + public JobInfoRead syncConnection(final ConnectionIdRequestBody connectionIdRequestBody) + throws IOException, JsonValidationException, ConfigNotFoundException { return submitManualSyncToWorker(connectionIdRequestBody.getConnectionId()); } @@ -365,19 +383,21 @@ public JobInfoRead cancelJob(final JobIdRequestBody jobIdRequestBody) throws IOE return submitCancellationToWorker(jobIdRequestBody.getId()); } - private void discoveredSchemaWithCatalogDiff(SourceDiscoverSchemaRead discoveredSchema, SourceDiscoverSchemaRequestBody discoverSchemaRequestBody) + private void discoveredSchemaWithCatalogDiff(final SourceDiscoverSchemaRead discoveredSchema, + final SourceDiscoverSchemaRequestBody discoverSchemaRequestBody) throws JsonValidationException, ConfigNotFoundException, IOException { final Optional catalogUsedToMakeConfiguredCatalog = connectionsHandler .getConnectionAirbyteCatalog(discoverSchemaRequestBody.getConnectionId()); final ConnectionRead connectionRead = connectionsHandler.getConnection(discoverSchemaRequestBody.getConnectionId()); final io.airbyte.api.model.generated.@NotNull AirbyteCatalog currentAirbyteCatalog = connectionRead.getSyncCatalog(); - CatalogDiff diff = connectionsHandler.getDiff(catalogUsedToMakeConfiguredCatalog.orElse(currentAirbyteCatalog), discoveredSchema.getCatalog(), - CatalogConverter.toProtocol(currentAirbyteCatalog)); - boolean containsBreakingChange = containsBreakingChange(diff); - ConnectionUpdate updateObject = + final CatalogDiff diff = + connectionsHandler.getDiff(catalogUsedToMakeConfiguredCatalog.orElse(currentAirbyteCatalog), discoveredSchema.getCatalog(), + CatalogConverter.toProtocol(currentAirbyteCatalog)); + final boolean containsBreakingChange = containsBreakingChange(diff); + final ConnectionUpdate updateObject = new ConnectionUpdate().breakingChange(containsBreakingChange).connectionId(discoverSchemaRequestBody.getConnectionId()); - ConnectionStatus connectionStatus; + final ConnectionStatus connectionStatus; if (shouldDisableConnection(containsBreakingChange, connectionRead.getNonBreakingChangesPreference(), diff)) { connectionStatus = ConnectionStatus.INACTIVE; } else { @@ -389,7 +409,9 @@ private void discoveredSchemaWithCatalogDiff(SourceDiscoverSchemaRead discovered } - private boolean shouldDisableConnection(boolean containsBreakingChange, NonBreakingChangesPreference preference, CatalogDiff diff) { + private boolean shouldDisableConnection(final boolean containsBreakingChange, + final NonBreakingChangesPreference preference, + final CatalogDiff diff) { if (!envVariableFeatureFlags.autoDetectSchema()) { return false; } @@ -438,13 +460,16 @@ private JobInfoRead submitCancellationToWorker(final Long jobId) throws IOExcept return jobConverter.getJobInfoRead(jobPersistence.getJob(jobId)); } - private JobInfoRead submitManualSyncToWorker(final UUID connectionId) throws IOException { + private JobInfoRead submitManualSyncToWorker(final UUID connectionId) + throws IOException, IllegalStateException, JsonValidationException, ConfigNotFoundException { + // get standard sync to validate connection id before submitting sync to temporal + configRepository.getStandardSync(connectionId); final ManualOperationResult manualSyncResult = eventRunner.startNewManualSync(connectionId); return readJobFromResult(manualSyncResult); } - private JobInfoRead submitResetConnectionToWorker(final UUID connectionId) throws IOException, JsonValidationException, ConfigNotFoundException { + private JobInfoRead submitResetConnectionToWorker(final UUID connectionId) throws IOException, IllegalStateException, ConfigNotFoundException { final ManualOperationResult resetConnectionResult = eventRunner.resetConnection( connectionId, configRepository.getAllStreamsForConnection(connectionId), @@ -468,12 +493,12 @@ private JobInfoRead readJobFromResult(final ManualOperationResult manualOperatio } private boolean containsBreakingChange(final CatalogDiff diff) { - for (StreamTransform streamTransform : diff.getTransforms()) { + for (final StreamTransform streamTransform : diff.getTransforms()) { if (streamTransform.getTransformType() != TransformTypeEnum.UPDATE_STREAM) { continue; } - boolean anyBreakingFieldTransforms = streamTransform.getUpdateStream().stream().anyMatch(FieldTransform::getBreaking); + final boolean anyBreakingFieldTransforms = streamTransform.getUpdateStream().stream().anyMatch(FieldTransform::getBreaking); if (anyBreakingFieldTransforms) { return true; } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java index 7d07cb59ec1a..00300be1b04e 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java @@ -8,7 +8,6 @@ import com.google.common.annotations.VisibleForTesting; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; -import io.airbyte.api.model.generated.CustomSourceDefinitionUpdate; import io.airbyte.api.model.generated.PrivateSourceDefinitionRead; import io.airbyte.api.model.generated.PrivateSourceDefinitionReadList; import io.airbyte.api.model.generated.ReleaseStage; @@ -190,19 +189,6 @@ public SourceDefinitionRead getSourceDefinitionForWorkspace(final SourceDefiniti return getSourceDefinition(new SourceDefinitionIdRequestBody().sourceDefinitionId(definitionId)); } - public SourceDefinitionRead createPrivateSourceDefinition(final SourceDefinitionCreate sourceDefinitionCreate) - throws JsonValidationException, IOException { - final StandardSourceDefinition sourceDefinition = sourceDefinitionFromCreate(sourceDefinitionCreate) - .withPublic(false) - .withCustom(false); - if (!protocolVersionRange.isSupported(new Version(sourceDefinition.getProtocolVersion()))) { - throw new UnsupportedProtocolVersionException(sourceDefinition.getProtocolVersion(), protocolVersionRange.min(), protocolVersionRange.max()); - } - configRepository.writeStandardSourceDefinition(sourceDefinition); - - return buildSourceDefinitionRead(sourceDefinition); - } - public SourceDefinitionRead createCustomSourceDefinition(final CustomSourceDefinitionCreate customSourceDefinitionCreate) throws IOException { final StandardSourceDefinition sourceDefinition = sourceDefinitionFromCreate(customSourceDefinitionCreate.getSourceDefinition()) @@ -218,7 +204,12 @@ public SourceDefinitionRead createCustomSourceDefinition(final CustomSourceDefin private StandardSourceDefinition sourceDefinitionFromCreate(final SourceDefinitionCreate sourceDefinitionCreate) throws IOException { - final ConnectorSpecification spec = getSpecForImage(sourceDefinitionCreate.getDockerRepository(), sourceDefinitionCreate.getDockerImageTag()); + final ConnectorSpecification spec = + getSpecForImage( + sourceDefinitionCreate.getDockerRepository(), + sourceDefinitionCreate.getDockerImageTag(), + // Only custom connectors can be created via handlers. + true); final Version airbyteProtocolVersion = AirbyteProtocolVersion.getWithDefault(spec.getProtocolVersion()); @@ -247,7 +238,8 @@ public SourceDefinitionRead updateSourceDefinition(final SourceDefinitionUpdate final boolean specNeedsUpdate = !currentSourceDefinition.getDockerImageTag().equals(sourceDefinitionUpdate.getDockerImageTag()) || sourceDefinitionUpdate.getDockerImageTag().equals(DEV_IMAGE_TAG); final ConnectorSpecification spec = specNeedsUpdate - ? getSpecForImage(currentSourceDefinition.getDockerRepository(), sourceDefinitionUpdate.getDockerImageTag()) + ? getSpecForImage(currentSourceDefinition.getDockerRepository(), sourceDefinitionUpdate.getDockerImageTag(), + currentSourceDefinition.getCustom()) : currentSourceDefinition.getSpec(); final ActorDefinitionResourceRequirements updatedResourceReqs = sourceDefinitionUpdate.getResourceRequirements() != null ? ApiPojoConverters.actorDefResourceReqsToInternal(sourceDefinitionUpdate.getResourceRequirements()) @@ -280,16 +272,6 @@ public SourceDefinitionRead updateSourceDefinition(final SourceDefinitionUpdate return buildSourceDefinitionRead(newSource); } - public SourceDefinitionRead updateCustomSourceDefinition(final CustomSourceDefinitionUpdate customSourceDefinitionUpdate) - throws IOException, JsonValidationException, ConfigNotFoundException { - final UUID definitionId = customSourceDefinitionUpdate.getSourceDefinition().getSourceDefinitionId(); - final UUID workspaceId = customSourceDefinitionUpdate.getWorkspaceId(); - if (!configRepository.workspaceCanUseCustomDefinition(definitionId, workspaceId)) { - throw new IdNotFoundKnownException("Cannot find the requested definition with given id for this workspace", definitionId.toString()); - } - return updateSourceDefinition(customSourceDefinitionUpdate.getSourceDefinition()); - } - public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) throws JsonValidationException, IOException, ConfigNotFoundException { // "delete" all sources associated with the source definition as well. This will cascade to @@ -307,19 +289,10 @@ public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDef configRepository.writeStandardSourceDefinition(persistedSourceDefinition); } - public void deleteCustomSourceDefinition(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) - throws IOException, JsonValidationException, ConfigNotFoundException { - final UUID definitionId = sourceDefinitionIdWithWorkspaceId.getSourceDefinitionId(); - final UUID workspaceId = sourceDefinitionIdWithWorkspaceId.getWorkspaceId(); - if (!configRepository.workspaceCanUseCustomDefinition(definitionId, workspaceId)) { - throw new IdNotFoundKnownException("Cannot find the requested definition with given id for this workspace", definitionId.toString()); - } - deleteSourceDefinition(new SourceDefinitionIdRequestBody().sourceDefinitionId(definitionId)); - } - - private ConnectorSpecification getSpecForImage(final String dockerRepository, final String imageTag) throws IOException { + private ConnectorSpecification getSpecForImage(final String dockerRepository, final String imageTag, final boolean isCustomConnector) + throws IOException { final String imageName = DockerUtils.getTaggedImageName(dockerRepository, imageTag); - final SynchronousResponse getSpecResponse = schedulerSynchronousClient.createGetSpecJob(imageName); + final SynchronousResponse getSpecResponse = schedulerSynchronousClient.createGetSpecJob(imageName, isCustomConnector); return SpecFetcher.getSpecFromJob(getSpecResponse); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java b/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java index d96acb0dd5d2..6ab0bacac3f3 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java +++ b/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java @@ -62,7 +62,8 @@ public DefaultSynchronousSchedulerClient(final TemporalClient temporalClient, @Override public SynchronousResponse createSourceCheckConnectionJob(final SourceConnection source, final String dockerImage, - final Version protocolVersion) + final Version protocolVersion, + final boolean isCustomConnector) throws IOException { final JsonNode sourceConfiguration = oAuthConfigSupplier.injectSourceOAuthParameters( source.getSourceDefinitionId(), @@ -71,7 +72,8 @@ public SynchronousResponse createSourceCheckConne final JobCheckConnectionConfig jobCheckConnectionConfig = new JobCheckConnectionConfig() .withConnectionConfiguration(sourceConfiguration) .withDockerImage(dockerImage) - .withProtocolVersion(protocolVersion); + .withProtocolVersion(protocolVersion) + .withIsCustomConnector(isCustomConnector); final UUID jobId = UUID.randomUUID(); final ConnectorJobReportingContext jobReportingContext = new ConnectorJobReportingContext(jobId, dockerImage); @@ -88,7 +90,8 @@ public SynchronousResponse createSourceCheckConne @Override public SynchronousResponse createDestinationCheckConnectionJob(final DestinationConnection destination, final String dockerImage, - final Version protocolVersion) + final Version protocolVersion, + final boolean isCustomConnector) throws IOException { final JsonNode destinationConfiguration = oAuthConfigSupplier.injectDestinationOAuthParameters( destination.getDestinationDefinitionId(), @@ -97,7 +100,8 @@ public SynchronousResponse createDestinationCheck final JobCheckConnectionConfig jobCheckConnectionConfig = new JobCheckConnectionConfig() .withConnectionConfiguration(destinationConfiguration) .withDockerImage(dockerImage) - .withProtocolVersion(protocolVersion); + .withProtocolVersion(protocolVersion) + .withIsCustomConnector(isCustomConnector); final UUID jobId = UUID.randomUUID(); final ConnectorJobReportingContext jobReportingContext = new ConnectorJobReportingContext(jobId, dockerImage); @@ -115,7 +119,8 @@ public SynchronousResponse createDestinationCheck public SynchronousResponse createDiscoverSchemaJob(final SourceConnection source, final String dockerImage, final String connectorVersion, - final Version protocolVersion) + final Version protocolVersion, + final boolean isCustomConnector) throws IOException { final JsonNode sourceConfiguration = oAuthConfigSupplier.injectSourceOAuthParameters( source.getSourceDefinitionId(), @@ -128,7 +133,8 @@ public SynchronousResponse createDiscoverSchemaJob(final SourceConnection .withSourceId(source.getSourceId().toString()) .withConfigHash(HASH_FUNCTION.hashBytes(Jsons.serialize(source.getConfiguration()).getBytes( Charsets.UTF_8)).toString()) - .withConnectorVersion(connectorVersion); + .withConnectorVersion(connectorVersion) + .withIsCustomConnector(isCustomConnector); final UUID jobId = UUID.randomUUID(); final ConnectorJobReportingContext jobReportingContext = new ConnectorJobReportingContext(jobId, dockerImage); @@ -143,8 +149,8 @@ public SynchronousResponse createDiscoverSchemaJob(final SourceConnection } @Override - public SynchronousResponse createGetSpecJob(final String dockerImage) throws IOException { - final JobGetSpecConfig jobSpecConfig = new JobGetSpecConfig().withDockerImage(dockerImage); + public SynchronousResponse createGetSpecJob(final String dockerImage, final boolean isCustomConnector) throws IOException { + final JobGetSpecConfig jobSpecConfig = new JobGetSpecConfig().withDockerImage(dockerImage).withIsCustomConnector(isCustomConnector); final UUID jobId = UUID.randomUUID(); final ConnectorJobReportingContext jobReportingContext = new ConnectorJobReportingContext(jobId, dockerImage); diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java b/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java index f472d9da7ced..7ff4257e1f2b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java +++ b/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java @@ -20,17 +20,23 @@ public interface SynchronousSchedulerClient { SynchronousResponse createSourceCheckConnectionJob(SourceConnection source, String dockerImage, - Version protocolVersion) + Version protocolVersion, + boolean isCustomConnector) throws IOException; SynchronousResponse createDestinationCheckConnectionJob(DestinationConnection destination, String dockerImage, - Version protocolVersion) + Version protocolVersion, + boolean isCustomConnector) throws IOException; - SynchronousResponse createDiscoverSchemaJob(SourceConnection source, String dockerImage, String connectorVersion, Version protocolVersion) + SynchronousResponse createDiscoverSchemaJob(SourceConnection source, + String dockerImage, + String connectorVersion, + Version protocolVersion, + boolean isCustomConnector) throws IOException; - SynchronousResponse createGetSpecJob(String dockerImage) throws IOException; + SynchronousResponse createGetSpecJob(String dockerImage, boolean isCustomConnector) throws IOException; } diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java b/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java index 3c3d19085bb6..fe1d084d92ce 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java @@ -238,6 +238,7 @@ void testEnumConversion() { assertTrue(Enums.isCompatible(JobConfig.ConfigType.class, JobConfigType.class)); assertTrue(Enums.isCompatible(JobStatus.class, io.airbyte.api.model.generated.JobStatus.class)); assertTrue(Enums.isCompatible(AttemptStatus.class, io.airbyte.api.model.generated.AttemptStatus.class)); + assertTrue(Enums.isCompatible(FailureReason.FailureOrigin.class, io.airbyte.api.model.generated.AttemptFailureOrigin.class)); } // this test intentionally only looks at the reset config as the rest is the same here. diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java index daad65516f51..32ba33b311bd 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java @@ -336,52 +336,6 @@ void testGetDefinitionWithGrantForWorkspace() throws JsonValidationException, Co assertEquals(expectedDestinationDefinitionRead, actualDestinationDefinitionRead); } - @Test - @DisplayName("createDestinationDefinition should correctly create a destinationDefinition") - void testCreateDestinationDefinition() throws URISyntaxException, IOException, JsonValidationException { - final StandardDestinationDefinition destination = generateDestinationDefinition(); - final String imageName = DockerUtils.getTaggedImageName(destination.getDockerRepository(), destination.getDockerImageTag()); - - when(uuidSupplier.get()).thenReturn(destination.getDestinationDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( - destination.getSpec(), - SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); - - final DestinationDefinitionCreate create = new DestinationDefinitionCreate() - .name(destination.getName()) - .dockerRepository(destination.getDockerRepository()) - .dockerImageTag(destination.getDockerImageTag()) - .documentationUrl(new URI(destination.getDocumentationUrl())) - .icon(destination.getIcon()) - .resourceRequirements(new io.airbyte.api.model.generated.ActorDefinitionResourceRequirements() - ._default(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(destination.getResourceRequirements().getDefault().getCpuRequest())) - .jobSpecific(Collections.emptyList())); - - final DestinationDefinitionRead expectedRead = new DestinationDefinitionRead() - .name(destination.getName()) - .dockerRepository(destination.getDockerRepository()) - .dockerImageTag(destination.getDockerImageTag()) - .documentationUrl(new URI(destination.getDocumentationUrl())) - .destinationDefinitionId(destination.getDestinationDefinitionId()) - .icon(DestinationDefinitionsHandler.loadIcon(destination.getIcon())) - .protocolVersion(DEFAULT_PROTOCOL_VERSION) - .releaseStage(ReleaseStage.CUSTOM) - .resourceRequirements(new io.airbyte.api.model.generated.ActorDefinitionResourceRequirements() - ._default(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(destination.getResourceRequirements().getDefault().getCpuRequest())) - .jobSpecific(Collections.emptyList())); - - final DestinationDefinitionRead actualRead = destinationDefinitionsHandler.createPrivateDestinationDefinition(create); - - assertEquals(expectedRead, actualRead); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); - verify(configRepository).writeStandardDestinationDefinition(destination - .withProtocolVersion(DEFAULT_PROTOCOL_VERSION) - .withReleaseDate(null) - .withReleaseStage(StandardDestinationDefinition.ReleaseStage.CUSTOM)); - } - @Test @DisplayName("createDestinationDefinition should not create a destinationDefinition with unsupported protocol version") void testCreateDestinationDefinitionShouldCheckProtocolVersion() throws URISyntaxException, IOException, JsonValidationException { @@ -391,7 +345,7 @@ void testCreateDestinationDefinitionShouldCheckProtocolVersion() throws URISynta final String imageName = DockerUtils.getTaggedImageName(destination.getDockerRepository(), destination.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(destination.getDestinationDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( destination.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -406,9 +360,13 @@ void testCreateDestinationDefinitionShouldCheckProtocolVersion() throws URISynta .cpuRequest(destination.getResourceRequirements().getDefault().getCpuRequest())) .jobSpecific(Collections.emptyList())); - assertThrows(UnsupportedProtocolVersionException.class, () -> destinationDefinitionsHandler.createPrivateDestinationDefinition(create)); + final CustomDestinationDefinitionCreate customCreate = new CustomDestinationDefinitionCreate() + .destinationDefinition(create) + .workspaceId(workspaceId); + + assertThrows(UnsupportedProtocolVersionException.class, () -> destinationDefinitionsHandler.createCustomDestinationDefinition(customCreate)); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository, never()).writeStandardDestinationDefinition(destination .withProtocolVersion(DEFAULT_PROTOCOL_VERSION) .withReleaseDate(null) @@ -422,7 +380,7 @@ void testCreateCustomDestinationDefinition() throws URISyntaxException, IOExcept final String imageName = DockerUtils.getTaggedImageName(destination.getDockerRepository(), destination.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(destination.getDestinationDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( destination.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -458,7 +416,7 @@ void testCreateCustomDestinationDefinition() throws URISyntaxException, IOExcept final DestinationDefinitionRead actualRead = destinationDefinitionsHandler.createCustomDestinationDefinition(customCreate); assertEquals(expectedRead, actualRead); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository).writeCustomDestinationDefinition( destination .withProtocolVersion(DEFAULT_PROTOCOL_VERSION) @@ -477,7 +435,7 @@ void testCreateCustomDestinationDefinitionWithInvalidProtocol() throws URISyntax final String imageName = DockerUtils.getTaggedImageName(destination.getDockerRepository(), destination.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(destination.getDestinationDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( destination.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -498,7 +456,7 @@ void testCreateCustomDestinationDefinitionWithInvalidProtocol() throws URISyntax assertThrows(UnsupportedProtocolVersionException.class, () -> destinationDefinitionsHandler.createCustomDestinationDefinition(customCreate)); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository, never()).writeCustomDestinationDefinition( destination .withProtocolVersion(invalidProtocol) @@ -525,7 +483,7 @@ void testUpdateDestination() throws ConfigNotFoundException, IOException, JsonVa final ConnectorSpecification newSpec = new ConnectorSpecification() .withConnectionSpecification(Jsons.jsonNode(ImmutableMap.of("foo2", "bar2"))) .withProtocolVersion(newProtocolVersion); - when(schedulerSynchronousClient.createGetSpecJob(newImageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(newImageName, false)).thenReturn(new SynchronousResponse<>( newSpec, SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -537,7 +495,7 @@ void testUpdateDestination() throws ConfigNotFoundException, IOException, JsonVa .dockerImageTag(newDockerImageTag)); assertEquals(newDockerImageTag, destinationRead.getDockerImageTag()); - verify(schedulerSynchronousClient).createGetSpecJob(newImageName); + verify(schedulerSynchronousClient).createGetSpecJob(newImageName, false); verify(configRepository).writeStandardDestinationDefinition(updatedDestination); final Configs configs = new EnvConfigs(); @@ -564,7 +522,7 @@ void testOutOfProtocolRangeUpdateDestination() throws ConfigNotFoundException, I final ConnectorSpecification newSpec = new ConnectorSpecification() .withConnectionSpecification(Jsons.jsonNode(ImmutableMap.of("foo2", "bar2"))) .withProtocolVersion(newProtocolVersion); - when(schedulerSynchronousClient.createGetSpecJob(newImageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(newImageName, false)).thenReturn(new SynchronousResponse<>( newSpec, SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -575,7 +533,7 @@ void testOutOfProtocolRangeUpdateDestination() throws ConfigNotFoundException, I new DestinationDefinitionUpdate().destinationDefinitionId(this.destinationDefinition.getDestinationDefinitionId()) .dockerImageTag(newDockerImageTag))); - verify(schedulerSynchronousClient).createGetSpecJob(newImageName); + verify(schedulerSynchronousClient).createGetSpecJob(newImageName, false); verify(configRepository, never()).writeStandardDestinationDefinition(updatedDestination); } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java index f06b4d6a8d69..3666e3ccc95d 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java @@ -198,13 +198,13 @@ void testCheckSourceConnectionFromSourceId() throws JsonValidationException, IOE .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion)) + when(synchronousSchedulerClient.createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion, false)) .thenReturn((SynchronousResponse) jobResponse); schedulerHandler.checkSourceConnectionFromSourceId(request); verify(configRepository).getSourceConnection(source.getSourceId()); - verify(synchronousSchedulerClient).createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion); + verify(synchronousSchedulerClient).createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion, false); } @Test @@ -229,12 +229,12 @@ void testCheckSourceConnectionFromSourceCreate() throws JsonValidationException, when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(source.getConfiguration()), any())).thenReturn(source.getConfiguration()); - when(synchronousSchedulerClient.createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion)) + when(synchronousSchedulerClient.createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion, false)) .thenReturn((SynchronousResponse) jobResponse); schedulerHandler.checkSourceConnectionFromSourceCreate(sourceCoreConfig); - verify(synchronousSchedulerClient).createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion); + verify(synchronousSchedulerClient).createSourceCheckConnectionJob(source, SOURCE_DOCKER_IMAGE, protocolVersion, false); } @Test @@ -258,7 +258,7 @@ void testCheckSourceConnectionFromUpdate() throws IOException, JsonValidationExc final SourceConnection submittedSource = new SourceConnection() .withSourceDefinitionId(source.getSourceDefinitionId()) .withConfiguration(source.getConfiguration()); - when(synchronousSchedulerClient.createSourceCheckConnectionJob(submittedSource, DESTINATION_DOCKER_IMAGE, protocolVersion)) + when(synchronousSchedulerClient.createSourceCheckConnectionJob(submittedSource, DESTINATION_DOCKER_IMAGE, protocolVersion, false)) .thenReturn((SynchronousResponse) jobResponse); when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(source.getConfiguration()), @@ -266,7 +266,7 @@ void testCheckSourceConnectionFromUpdate() throws IOException, JsonValidationExc schedulerHandler.checkSourceConnectionFromSourceIdForUpdate(sourceUpdate); verify(jsonSchemaValidator).ensure(CONNECTOR_SPECIFICATION.getConnectionSpecification(), source.getConfiguration()); - verify(synchronousSchedulerClient).createSourceCheckConnectionJob(submittedSource, DESTINATION_DOCKER_IMAGE, protocolVersion); + verify(synchronousSchedulerClient).createSourceCheckConnectionJob(submittedSource, DESTINATION_DOCKER_IMAGE, protocolVersion, false); } @Test @@ -322,14 +322,14 @@ void testCheckDestinationConnectionFromDestinationId() throws IOException, JsonV .withDestinationDefinitionId(destination.getDestinationDefinitionId())); when(configRepository.getDestinationConnection(destination.getDestinationId())).thenReturn(destination); when(synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION))) + new Version(DESTINATION_PROTOCOL_VERSION), false)) .thenReturn((SynchronousResponse) jobResponse); schedulerHandler.checkDestinationConnectionFromDestinationId(request); verify(configRepository).getDestinationConnection(destination.getDestinationId()); verify(synchronousSchedulerClient).createDestinationCheckConnectionJob(destination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION)); + new Version(DESTINATION_PROTOCOL_VERSION), false); } @Test @@ -350,7 +350,7 @@ void testCheckDestinationConnectionFromDestinationCreate() throws JsonValidation .withDestinationDefinitionId(destination.getDestinationDefinitionId())); when(synchronousSchedulerClient.createDestinationCheckConnectionJob(destination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION))) + new Version(DESTINATION_PROTOCOL_VERSION), false)) .thenReturn((SynchronousResponse) jobResponse); when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(destination.getConfiguration()), @@ -358,7 +358,7 @@ void testCheckDestinationConnectionFromDestinationCreate() throws JsonValidation schedulerHandler.checkDestinationConnectionFromDestinationCreate(destinationCoreConfig); verify(synchronousSchedulerClient).createDestinationCheckConnectionJob(destination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION)); + new Version(DESTINATION_PROTOCOL_VERSION), false); } @Test @@ -383,7 +383,7 @@ void testCheckDestinationConnectionFromUpdate() throws IOException, JsonValidati .withDestinationDefinitionId(destination.getDestinationDefinitionId()) .withConfiguration(destination.getConfiguration()); when(synchronousSchedulerClient.createDestinationCheckConnectionJob(submittedDestination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION))) + new Version(DESTINATION_PROTOCOL_VERSION), false)) .thenReturn((SynchronousResponse) jobResponse); when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(destination.getConfiguration()), @@ -392,7 +392,7 @@ void testCheckDestinationConnectionFromUpdate() throws IOException, JsonValidati verify(jsonSchemaValidator).ensure(CONNECTOR_SPECIFICATION.getConnectionSpecification(), destination.getConfiguration()); verify(synchronousSchedulerClient).createDestinationCheckConnectionJob(submittedDestination, DESTINATION_DOCKER_IMAGE, - new Version(DESTINATION_PROTOCOL_VERSION)); + new Version(DESTINATION_PROTOCOL_VERSION), false); } @Test @@ -420,8 +420,9 @@ void testDiscoverSchemaForSourceFromSourceId() throws IOException, JsonValidatio .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(configRepository.getActorCatalog(any(), any(), any())).thenReturn(Optional.empty()); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); @@ -431,7 +432,8 @@ void testDiscoverSchemaForSourceFromSourceId() throws IOException, JsonValidatio assertTrue(actual.getJobInfo().getSucceeded()); verify(configRepository).getSourceConnection(source.getSourceId()); verify(configRepository).getActorCatalog(eq(request.getSourceId()), eq(SOURCE_DOCKER_TAG), any()); - verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION)); + verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false); } @Test @@ -458,8 +460,9 @@ void testDiscoverSchemaForSourceFromSourceIdCachedCatalog() throws IOException, .withCatalogHash("") .withId(thisCatalogId); when(configRepository.getActorCatalog(any(), any(), any())).thenReturn(Optional.of(actorCatalog)); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); @@ -471,7 +474,7 @@ void testDiscoverSchemaForSourceFromSourceIdCachedCatalog() throws IOException, verify(configRepository).getActorCatalog(eq(request.getSourceId()), any(), any()); verify(configRepository, never()).writeActorCatalogFetchEvent(any(), any(), any(), any()); verify(synchronousSchedulerClient, never()).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, - new Version(SOURCE_PROTOCOL_VERSION)); + new Version(SOURCE_PROTOCOL_VERSION), false); } @Test @@ -499,8 +502,9 @@ void testDiscoverSchemaForSourceFromSourceIdDisableCache() throws IOException, J .withCatalogHash("") .withId(discoveredCatalogId); when(configRepository.getActorCatalogById(discoveredCatalogId)).thenReturn(actorCatalog); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); @@ -509,7 +513,8 @@ void testDiscoverSchemaForSourceFromSourceIdDisableCache() throws IOException, J assertTrue(actual.getJobInfo().getSucceeded()); verify(configRepository).getSourceConnection(source.getSourceId()); verify(configRepository).getActorCatalog(eq(request.getSourceId()), any(), any()); - verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION)); + verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false); } @Test @@ -524,8 +529,9 @@ void testDiscoverSchemaForSourceFromSourceIdFailed() throws IOException, JsonVal .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn((SynchronousResponse) jobResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn((SynchronousResponse) jobResponse); when(completedJob.getSuccessOutput()).thenReturn(Optional.empty()); when(completedJob.getStatus()).thenReturn(JobStatus.FAILED); @@ -535,7 +541,8 @@ void testDiscoverSchemaForSourceFromSourceIdFailed() throws IOException, JsonVal assertNotNull(actual.getJobInfo()); assertFalse(actual.getJobInfo().getSucceeded()); verify(configRepository).getSourceConnection(source.getSourceId()); - verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION)); + verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false); } @Test @@ -556,8 +563,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreaking() throws IOExcept .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -605,8 +613,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -657,8 +666,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -708,8 +718,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreaking() throws IOException .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -761,8 +772,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreakingFeatureFlagOn() throw .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -812,8 +824,9 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(discoverResponse.isSuccess()).thenReturn(true); when(discoverResponse.getOutput()).thenReturn(discoveredCatalogId); @@ -872,8 +885,9 @@ void testDiscoverSchemaForSourceFromSourceCreate() throws JsonValidationExceptio .withDockerImageTag(SOURCE_DOCKER_TAG) .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn(discoverResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn(discoverResponse); when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(source.getConfiguration()), any())).thenReturn(source.getConfiguration()); @@ -884,7 +898,8 @@ void testDiscoverSchemaForSourceFromSourceCreate() throws JsonValidationExceptio assertNotNull(actual.getJobInfo()); assertEquals(actual.getCatalogId(), discoverResponse.getOutput()); assertTrue(actual.getJobInfo().getSucceeded()); - verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION)); + verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false); } @Test @@ -904,8 +919,9 @@ void testDiscoverSchemaForSourceFromSourceCreateFailed() throws JsonValidationEx .withDockerImageTag(SOURCE_DOCKER_TAG) .withProtocolVersion(SOURCE_PROTOCOL_VERSION) .withSourceDefinitionId(source.getSourceDefinitionId())); - when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION))) - .thenReturn((SynchronousResponse) jobResponse); + when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false)) + .thenReturn((SynchronousResponse) jobResponse); when(secretsRepositoryWriter.statefulSplitEphemeralSecrets( eq(source.getConfiguration()), any())).thenReturn(source.getConfiguration()); @@ -917,7 +933,8 @@ void testDiscoverSchemaForSourceFromSourceCreateFailed() throws JsonValidationEx assertNull(actual.getCatalog()); assertNotNull(actual.getJobInfo()); assertFalse(actual.getJobInfo().getSucceeded()); - verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION)); + verify(synchronousSchedulerClient).createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), + false); } @Test @@ -927,7 +944,7 @@ void testEnumConversion() { } @Test - void testSyncConnection() throws IOException { + void testSyncConnection() throws IOException, JsonValidationException, ConfigNotFoundException { final UUID connectionId = UUID.randomUUID(); final long jobId = 123L; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java index 480ab6b7f2b5..e29293240538 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java @@ -324,54 +324,6 @@ void testGetDefinitionWithGrantForWorkspace() throws JsonValidationException, Co assertEquals(expectedSourceDefinitionRead, actualSourceDefinitionRead); } - @Test - @DisplayName("createSourceDefinition should correctly create a sourceDefinition") - void testCreateSourceDefinition() throws URISyntaxException, IOException, JsonValidationException { - final StandardSourceDefinition sourceDefinition = generateSourceDefinition(); - final String imageName = DockerUtils.getTaggedImageName(sourceDefinition.getDockerRepository(), sourceDefinition.getDockerImageTag()); - - when(uuidSupplier.get()).thenReturn(sourceDefinition.getSourceDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( - sourceDefinition.getSpec(), - SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); - - final SourceDefinitionCreate create = new SourceDefinitionCreate() - .name(sourceDefinition.getName()) - .dockerRepository(sourceDefinition.getDockerRepository()) - .dockerImageTag(sourceDefinition.getDockerImageTag()) - .documentationUrl(new URI(sourceDefinition.getDocumentationUrl())) - .icon(sourceDefinition.getIcon()) - .resourceRequirements(new io.airbyte.api.model.generated.ActorDefinitionResourceRequirements() - ._default(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(sourceDefinition.getResourceRequirements().getDefault().getCpuRequest())) - .jobSpecific(Collections.emptyList())); - - final SourceDefinitionRead expectedRead = new SourceDefinitionRead() - .name(sourceDefinition.getName()) - .dockerRepository(sourceDefinition.getDockerRepository()) - .dockerImageTag(sourceDefinition.getDockerImageTag()) - .documentationUrl(new URI(sourceDefinition.getDocumentationUrl())) - .sourceDefinitionId(sourceDefinition.getSourceDefinitionId()) - .icon(SourceDefinitionsHandler.loadIcon(sourceDefinition.getIcon())) - .protocolVersion(DEFAULT_PROTOCOL_VERSION) - .releaseStage(ReleaseStage.CUSTOM) - .resourceRequirements(new io.airbyte.api.model.generated.ActorDefinitionResourceRequirements() - ._default(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(sourceDefinition.getResourceRequirements().getDefault().getCpuRequest())) - .jobSpecific(Collections.emptyList())); - - final SourceDefinitionRead actualRead = sourceDefinitionsHandler.createPrivateSourceDefinition(create); - - assertEquals(expectedRead, actualRead); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); - verify(configRepository) - .writeStandardSourceDefinition( - sourceDefinition - .withReleaseDate(null) - .withReleaseStage(StandardSourceDefinition.ReleaseStage.CUSTOM) - .withProtocolVersion(DEFAULT_PROTOCOL_VERSION)); - } - @Test @DisplayName("createSourceDefinition should not create a sourceDefinition with an unsupported protocol version") void testCreateSourceDefinitionWithInvalidProtocol() throws URISyntaxException, IOException, JsonValidationException { @@ -381,7 +333,7 @@ void testCreateSourceDefinitionWithInvalidProtocol() throws URISyntaxException, final String imageName = DockerUtils.getTaggedImageName(sourceDefinition.getDockerRepository(), sourceDefinition.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(sourceDefinition.getSourceDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( sourceDefinition.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -395,10 +347,12 @@ void testCreateSourceDefinitionWithInvalidProtocol() throws URISyntaxException, ._default(new io.airbyte.api.model.generated.ResourceRequirements() .cpuRequest(sourceDefinition.getResourceRequirements().getDefault().getCpuRequest())) .jobSpecific(Collections.emptyList())); + final CustomSourceDefinitionCreate customCreate = new CustomSourceDefinitionCreate() + .sourceDefinition(create) + .workspaceId(workspaceId); + assertThrows(UnsupportedProtocolVersionException.class, () -> sourceDefinitionsHandler.createCustomSourceDefinition(customCreate)); - assertThrows(UnsupportedProtocolVersionException.class, () -> sourceDefinitionsHandler.createPrivateSourceDefinition(create)); - - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository, never()) .writeStandardSourceDefinition( sourceDefinition @@ -414,7 +368,7 @@ void testCreateCustomSourceDefinition() throws URISyntaxException, IOException, final String imageName = DockerUtils.getTaggedImageName(sourceDefinition.getDockerRepository(), sourceDefinition.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(sourceDefinition.getSourceDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( sourceDefinition.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -450,7 +404,7 @@ void testCreateCustomSourceDefinition() throws URISyntaxException, IOException, final SourceDefinitionRead actualRead = sourceDefinitionsHandler.createCustomSourceDefinition(customCreate); assertEquals(expectedRead, actualRead); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository).writeCustomSourceDefinition( sourceDefinition .withReleaseDate(null) @@ -469,7 +423,7 @@ void testCreateCustomSourceDefinitionWithInvalidProtocol() throws URISyntaxExcep final String imageName = DockerUtils.getTaggedImageName(sourceDefinition.getDockerRepository(), sourceDefinition.getDockerImageTag()); when(uuidSupplier.get()).thenReturn(sourceDefinition.getSourceDefinitionId()); - when(schedulerSynchronousClient.createGetSpecJob(imageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(imageName, true)).thenReturn(new SynchronousResponse<>( sourceDefinition.getSpec(), SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -490,7 +444,7 @@ void testCreateCustomSourceDefinitionWithInvalidProtocol() throws URISyntaxExcep assertThrows(UnsupportedProtocolVersionException.class, () -> sourceDefinitionsHandler.createCustomSourceDefinition(customCreate)); - verify(schedulerSynchronousClient).createGetSpecJob(imageName); + verify(schedulerSynchronousClient).createGetSpecJob(imageName, true); verify(configRepository, never()).writeCustomSourceDefinition( sourceDefinition .withReleaseDate(null) @@ -515,7 +469,7 @@ void testUpdateSourceDefinition() throws ConfigNotFoundException, IOException, J final ConnectorSpecification newSpec = new ConnectorSpecification() .withConnectionSpecification(Jsons.jsonNode(ImmutableMap.of("foo2", "bar2"))) .withProtocolVersion(newProtocolVersion); - when(schedulerSynchronousClient.createGetSpecJob(newImageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(newImageName, false)).thenReturn(new SynchronousResponse<>( newSpec, SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -527,7 +481,7 @@ void testUpdateSourceDefinition() throws ConfigNotFoundException, IOException, J new SourceDefinitionUpdate().sourceDefinitionId(this.sourceDefinition.getSourceDefinitionId()).dockerImageTag(newDockerImageTag)); assertEquals(newDockerImageTag, sourceDefinitionRead.getDockerImageTag()); - verify(schedulerSynchronousClient).createGetSpecJob(newImageName); + verify(schedulerSynchronousClient).createGetSpecJob(newImageName, false); verify(configRepository).writeStandardSourceDefinition(updatedSource); final Configs configs = new EnvConfigs(); @@ -551,7 +505,7 @@ void testUpdateSourceDefinitionWithInvalidProtocol() throws ConfigNotFoundExcept final ConnectorSpecification newSpec = new ConnectorSpecification() .withConnectionSpecification(Jsons.jsonNode(ImmutableMap.of("foo2", "bar2"))) .withProtocolVersion(newProtocolVersion); - when(schedulerSynchronousClient.createGetSpecJob(newImageName)).thenReturn(new SynchronousResponse<>( + when(schedulerSynchronousClient.createGetSpecJob(newImageName, false)).thenReturn(new SynchronousResponse<>( newSpec, SynchronousJobMetadata.mock(ConfigType.GET_SPEC))); @@ -562,7 +516,7 @@ void testUpdateSourceDefinitionWithInvalidProtocol() throws ConfigNotFoundExcept .updateSourceDefinition( new SourceDefinitionUpdate().sourceDefinitionId(this.sourceDefinition.getSourceDefinitionId()).dockerImageTag(newDockerImageTag))); - verify(schedulerSynchronousClient).createGetSpecJob(newImageName); + verify(schedulerSynchronousClient).createGetSpecJob(newImageName, false); verify(configRepository, never()).writeStandardSourceDefinition(updatedSource); } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java index b390d7a4c3fc..5ce60614a09b 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java @@ -418,7 +418,7 @@ void testWebBackendGetConnectionWithDiscoveryAndNewSchema() throws ConfigNotFoun when(configRepository.getMostRecentActorCatalogFetchEventForSource(any())) .thenReturn(Optional.of(new ActorCatalogFetchEvent().withActorCatalogId(newCatalogId))); when(configRepository.getActorCatalogById(any())).thenReturn(new ActorCatalog().withId(UUID.randomUUID())); - SourceDiscoverSchemaRead schemaRead = + final SourceDiscoverSchemaRead schemaRead = new SourceDiscoverSchemaRead().catalogDiff(expectedWithNewSchema.getCatalogDiff()).catalog(expectedWithNewSchema.getSyncCatalog()) .breakingChange(false).connectionStatus(ConnectionStatus.ACTIVE); when(schedulerHandler.discoverSchemaForSourceFromSourceId(any())).thenReturn(schemaRead); @@ -435,7 +435,7 @@ void testWebBackendGetConnectionWithDiscoveryAndNewSchemaBreakingChange() throws when(configRepository.getMostRecentActorCatalogFetchEventForSource(any())) .thenReturn(Optional.of(new ActorCatalogFetchEvent().withActorCatalogId(newCatalogId))); when(configRepository.getActorCatalogById(any())).thenReturn(new ActorCatalog().withId(UUID.randomUUID())); - SourceDiscoverSchemaRead schemaRead = + final SourceDiscoverSchemaRead schemaRead = new SourceDiscoverSchemaRead().catalogDiff(expectedWithNewSchema.getCatalogDiff()).catalog(expectedWithNewSchema.getSyncCatalog()) .breakingChange(true).connectionStatus(ConnectionStatus.INACTIVE); when(schedulerHandler.discoverSchemaForSourceFromSourceId(any())).thenReturn(schemaRead); @@ -1163,13 +1163,13 @@ void testGetStreamsToReset() { final List resultList = WebBackendConnectionsHandler.getStreamsToReset(catalogDiff); assertTrue( resultList.stream().anyMatch( - streamDescriptor -> streamDescriptor.getName() == "added_stream")); + streamDescriptor -> "added_stream".equalsIgnoreCase(streamDescriptor.getName()))); assertTrue( resultList.stream().anyMatch( - streamDescriptor -> streamDescriptor.getName() == "removed_stream")); + streamDescriptor -> "removed_stream".equalsIgnoreCase(streamDescriptor.getName()))); assertTrue( resultList.stream().anyMatch( - streamDescriptor -> streamDescriptor.getName() == "updated_stream")); + streamDescriptor -> "updated_stream".equalsIgnoreCase(streamDescriptor.getName()))); } @Test diff --git a/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java b/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java index e9af5118545d..909c21a4b71b 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java @@ -204,14 +204,14 @@ void testCreateSourceCheckConnectionJob() throws IOException { final JobCheckConnectionConfig jobCheckConnectionConfig = new JobCheckConnectionConfig() .withConnectionConfiguration(SOURCE_CONNECTION.getConfiguration()) .withDockerImage(DOCKER_IMAGE) - .withProtocolVersion(PROTOCOL_VERSION); + .withProtocolVersion(PROTOCOL_VERSION).withIsCustomConnector(false); final StandardCheckConnectionOutput mockOutput = mock(StandardCheckConnectionOutput.class); final ConnectorJobOutput jobOutput = new ConnectorJobOutput().withCheckConnection(mockOutput); when(temporalClient.submitCheckConnection(any(UUID.class), eq(0), eq(jobCheckConnectionConfig))) .thenReturn(new TemporalResponse<>(jobOutput, createMetadata(true))); final SynchronousResponse response = - schedulerClient.createSourceCheckConnectionJob(SOURCE_CONNECTION, DOCKER_IMAGE, PROTOCOL_VERSION); + schedulerClient.createSourceCheckConnectionJob(SOURCE_CONNECTION, DOCKER_IMAGE, PROTOCOL_VERSION, false); assertEquals(mockOutput, response.getOutput()); } @@ -220,14 +220,15 @@ void testCreateDestinationCheckConnectionJob() throws IOException { final JobCheckConnectionConfig jobCheckConnectionConfig = new JobCheckConnectionConfig() .withConnectionConfiguration(DESTINATION_CONNECTION.getConfiguration()) .withDockerImage(DOCKER_IMAGE) - .withProtocolVersion(PROTOCOL_VERSION); + .withProtocolVersion(PROTOCOL_VERSION) + .withIsCustomConnector(false); final StandardCheckConnectionOutput mockOutput = mock(StandardCheckConnectionOutput.class); final ConnectorJobOutput jobOutput = new ConnectorJobOutput().withCheckConnection(mockOutput); when(temporalClient.submitCheckConnection(any(UUID.class), eq(0), eq(jobCheckConnectionConfig))) .thenReturn(new TemporalResponse<>(jobOutput, createMetadata(true))); final SynchronousResponse response = - schedulerClient.createDestinationCheckConnectionJob(DESTINATION_CONNECTION, DOCKER_IMAGE, PROTOCOL_VERSION); + schedulerClient.createDestinationCheckConnectionJob(DESTINATION_CONNECTION, DOCKER_IMAGE, PROTOCOL_VERSION, false); assertEquals(mockOutput, response.getOutput()); } @@ -238,19 +239,19 @@ void testCreateDiscoverSchemaJob() throws IOException { when(temporalClient.submitDiscoverSchema(any(UUID.class), eq(0), any(JobDiscoverCatalogConfig.class))) .thenReturn(new TemporalResponse<>(jobOutput, createMetadata(true))); final SynchronousResponse response = - schedulerClient.createDiscoverSchemaJob(SOURCE_CONNECTION, DOCKER_IMAGE, DOCKER_IMAGE_TAG, PROTOCOL_VERSION); + schedulerClient.createDiscoverSchemaJob(SOURCE_CONNECTION, DOCKER_IMAGE, DOCKER_IMAGE_TAG, PROTOCOL_VERSION, false); assertEquals(expectedCatalogId, response.getOutput()); } @Test void testCreateGetSpecJob() throws IOException { - final JobGetSpecConfig jobSpecConfig = new JobGetSpecConfig().withDockerImage(DOCKER_IMAGE); + final JobGetSpecConfig jobSpecConfig = new JobGetSpecConfig().withDockerImage(DOCKER_IMAGE).withIsCustomConnector(false); final ConnectorSpecification mockOutput = mock(ConnectorSpecification.class); final ConnectorJobOutput jobOutput = new ConnectorJobOutput().withSpec(mockOutput); when(temporalClient.submitGetSpec(any(UUID.class), eq(0), eq(jobSpecConfig))) .thenReturn(new TemporalResponse<>(jobOutput, createMetadata(true))); - final SynchronousResponse response = schedulerClient.createGetSpecJob(DOCKER_IMAGE); + final SynchronousResponse response = schedulerClient.createGetSpecJob(DOCKER_IMAGE, false); assertEquals(mockOutput, response.getOutput()); } diff --git a/airbyte-test-utils/src/main/java/io/airbyte/test/utils/AirbyteAcceptanceTestHarness.java b/airbyte-test-utils/src/main/java/io/airbyte/test/utils/AirbyteAcceptanceTestHarness.java index a85f6498975a..0094cd92791a 100644 --- a/airbyte-test-utils/src/main/java/io/airbyte/test/utils/AirbyteAcceptanceTestHarness.java +++ b/airbyte-test-utils/src/main/java/io/airbyte/test/utils/AirbyteAcceptanceTestHarness.java @@ -25,6 +25,8 @@ import io.airbyte.api.client.model.generated.ConnectionState; import io.airbyte.api.client.model.generated.ConnectionStatus; import io.airbyte.api.client.model.generated.ConnectionUpdate; +import io.airbyte.api.client.model.generated.CustomDestinationDefinitionCreate; +import io.airbyte.api.client.model.generated.CustomSourceDefinitionCreate; import io.airbyte.api.client.model.generated.DestinationCreate; import io.airbyte.api.client.model.generated.DestinationDefinitionCreate; import io.airbyte.api.client.model.generated.DestinationDefinitionRead; @@ -644,20 +646,24 @@ private Map localConfig(final PostgreSQLContainer psql, return dbConfig; } - public SourceDefinitionRead createE2eSourceDefinition() throws ApiException { - return apiClient.getSourceDefinitionApi().createSourceDefinition(new SourceDefinitionCreate() - .name("E2E Test Source") - .dockerRepository("airbyte/source-e2e-test") - .dockerImageTag(SOURCE_E2E_TEST_CONNECTOR_VERSION) - .documentationUrl(URI.create("https://example.com"))); + public SourceDefinitionRead createE2eSourceDefinition(final UUID workspaceId) throws ApiException { + return apiClient.getSourceDefinitionApi().createCustomSourceDefinition(new CustomSourceDefinitionCreate() + .workspaceId(workspaceId) + .sourceDefinition(new SourceDefinitionCreate() + .name("E2E Test Source") + .dockerRepository("airbyte/source-e2e-test") + .dockerImageTag(SOURCE_E2E_TEST_CONNECTOR_VERSION) + .documentationUrl(URI.create("https://example.com")))); } - public DestinationDefinitionRead createE2eDestinationDefinition() throws ApiException { - return apiClient.getDestinationDefinitionApi().createDestinationDefinition(new DestinationDefinitionCreate() - .name("E2E Test Destination") - .dockerRepository("airbyte/destination-e2e-test") - .dockerImageTag(DESTINATION_E2E_TEST_CONNECTOR_VERSION) - .documentationUrl(URI.create("https://example.com"))); + public DestinationDefinitionRead createE2eDestinationDefinition(final UUID workspaceId) throws ApiException { + return apiClient.getDestinationDefinitionApi().createCustomDestinationDefinition(new CustomDestinationDefinitionCreate() + .workspaceId(workspaceId) + .destinationDefinition(new DestinationDefinitionCreate() + .name("E2E Test Destination") + .dockerRepository("airbyte/destination-e2e-test") + .dockerImageTag(DESTINATION_E2E_TEST_CONNECTOR_VERSION) + .documentationUrl(URI.create("https://example.com")))); } public SourceRead createPostgresSource(final boolean isLegacy) throws ApiException { diff --git a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/AdvancedAcceptanceTests.java b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/AdvancedAcceptanceTests.java index a78778e7eaae..216159195f1c 100644 --- a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/AdvancedAcceptanceTests.java +++ b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/AdvancedAcceptanceTests.java @@ -153,8 +153,8 @@ void testManualSync() throws Exception { @RetryingTest(3) @Order(2) void testCheckpointing() throws Exception { - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); - final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); + final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(workspaceId); final SourceRead source = testHarness.createSource( "E2E Test Source -" + UUID.randomUUID(), @@ -244,8 +244,8 @@ void testRedactionOfSensitiveRequestBodies() throws Exception { @RetryingTest(3) @Order(4) void testBackpressure() throws Exception { - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); - final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); + final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(workspaceId); final SourceRead source = testHarness.createSource( "E2E Test Source -" + UUID.randomUUID(), diff --git a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java index 757f2a90018f..aaa219ed07d1 100644 --- a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java +++ b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java @@ -371,7 +371,7 @@ void testCreateConnection() throws ApiException { @Test @Order(7) void testCancelSync() throws Exception { - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); final SourceRead source = testHarness.createSource( E2E_TEST_SOURCE + UUID.randomUUID(), @@ -763,7 +763,7 @@ void testUpdateConnectionWhenWorkflowUnreachable() throws Exception { void testManualSyncRepairsWorkflowWhenWorkflowUnreachable() throws Exception { // This test only covers the specific behavior of updating a connection that does not have an // underlying temporal workflow. - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); final SourceRead source = testHarness.createSource( E2E_TEST_SOURCE + UUID.randomUUID(), workspaceId, @@ -837,7 +837,7 @@ void testResetConnectionRepairsWorkflowWhenWorkflowUnreachable() throws Exceptio @Test @Order(18) void testResetCancelsRunningSync() throws Exception { - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); final SourceRead source = testHarness.createSource( E2E_TEST_SOURCE + UUID.randomUUID(), @@ -1476,8 +1476,8 @@ private void waitForSuccessfulJobWithRetries(final UUID connectionId, final int @Test @Disabled void testFailureTimeout() throws Exception { - final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(); - final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(); + final SourceDefinitionRead sourceDefinition = testHarness.createE2eSourceDefinition(workspaceId); + final DestinationDefinitionRead destinationDefinition = testHarness.createE2eDestinationDefinition(workspaceId); final SourceRead source = testHarness.createSource( E2E_TEST_SOURCE + UUID.randomUUID(), diff --git a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/ContainerOrchestratorAcceptanceTests.java b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/ContainerOrchestratorAcceptanceTests.java index bf3c628a1245..642dda066c38 100644 --- a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/ContainerOrchestratorAcceptanceTests.java +++ b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/ContainerOrchestratorAcceptanceTests.java @@ -101,6 +101,8 @@ void setup() throws URISyntaxException, IOException, SQLException { testHarness.setup(); } + // This test is flaky. Warnings are suppressed until that condition us understood + // See: https://github.com/airbytehq/airbyte/issues/19948 @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") void testDowntimeDuringSync() throws Exception { diff --git a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/VersioningAcceptanceTests.java b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/VersioningAcceptanceTests.java index 43d1d824e34a..9147d1257d82 100644 --- a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/VersioningAcceptanceTests.java +++ b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/VersioningAcceptanceTests.java @@ -9,6 +9,8 @@ import io.airbyte.api.client.AirbyteApiClient; import io.airbyte.api.client.invoker.generated.ApiClient; import io.airbyte.api.client.invoker.generated.ApiException; +import io.airbyte.api.client.model.generated.CustomDestinationDefinitionCreate; +import io.airbyte.api.client.model.generated.CustomSourceDefinitionCreate; import io.airbyte.api.client.model.generated.DestinationDefinitionCreate; import io.airbyte.api.client.model.generated.DestinationDefinitionIdRequestBody; import io.airbyte.api.client.model.generated.DestinationDefinitionRead; @@ -70,13 +72,15 @@ void tearDown() { }) void testCreateSourceSpec(final String dockerImageTag, final String expectedProtocolVersion) throws ApiException, URISyntaxException { - final SourceDefinitionCreate sourceDefinitionCreate = new SourceDefinitionCreate() - .dockerImageTag(dockerImageTag) - .dockerRepository("airbyte/source-e2e-test") - .documentationUrl(new URI("https://hub.docker.com/r/airbyte/source-e2e-test")) - .name("Source E2E Test Connector"); - - final SourceDefinitionRead sourceDefinitionRead = apiClient.getSourceDefinitionApi().createSourceDefinition(sourceDefinitionCreate); + final CustomSourceDefinitionCreate sourceDefinitionCreate = new CustomSourceDefinitionCreate() + .workspaceId(workspaceId) + .sourceDefinition(new SourceDefinitionCreate() + .dockerImageTag(dockerImageTag) + .dockerRepository("airbyte/source-e2e-test") + .documentationUrl(new URI("https://hub.docker.com/r/airbyte/source-e2e-test")) + .name("Source E2E Test Connector")); + + final SourceDefinitionRead sourceDefinitionRead = apiClient.getSourceDefinitionApi().createCustomSourceDefinition(sourceDefinitionCreate); assertEquals(expectedProtocolVersion, sourceDefinitionRead.getProtocolVersion()); final SourceDefinitionIdRequestBody sourceDefinitionReq = new SourceDefinitionIdRequestBody() @@ -96,16 +100,19 @@ void testCreateSourceSpec(final String dockerImageTag, final String expectedProt }) void testCreateDestinationSpec(final String dockerImageTag, final String expectedProtocolVersion) throws ApiException, URISyntaxException { - final DestinationDefinitionCreate destDefinitionCreate = new DestinationDefinitionCreate() - .dockerImageTag(dockerImageTag) - // We are currently using source because the destination-e2e-test connector is facing a regression - // For the purpose of the test, at this moment, using source works because we only check version - .dockerRepository("airbyte/source-e2e-test") - .documentationUrl(new URI("https://hub.docker.com/r/airbyte/destination-e2e-test")) - .name("Dest E2E Test Connector"); + final CustomDestinationDefinitionCreate destDefinitionCreate = + new CustomDestinationDefinitionCreate() + .workspaceId(workspaceId) + .destinationDefinition(new DestinationDefinitionCreate() + .dockerImageTag(dockerImageTag) + // We are currently using source because the destination-e2e-test connector is facing a regression + // For the purpose of the test, at this moment, using source works because we only check version + .dockerRepository("airbyte/source-e2e-test") + .documentationUrl(new URI("https://hub.docker.com/r/airbyte/destination-e2e-test")) + .name("Dest E2E Test Connector")); final DestinationDefinitionRead destDefinitionRead = - apiClient.getDestinationDefinitionApi().createDestinationDefinition(destDefinitionCreate); + apiClient.getDestinationDefinitionApi().createCustomDestinationDefinition(destDefinitionCreate); assertEquals(expectedProtocolVersion, destDefinitionRead.getProtocolVersion()); final DestinationDefinitionIdRequestBody destDefinitionReq = new DestinationDefinitionIdRequestBody() diff --git a/airbyte-webapp-e2e-tests/.eslintrc.js b/airbyte-webapp-e2e-tests/.eslintrc.js new file mode 100644 index 000000000000..f0abf5c00175 --- /dev/null +++ b/airbyte-webapp-e2e-tests/.eslintrc.js @@ -0,0 +1,52 @@ +module.exports = { + env: { + browser: true, + node: true, + }, + extends: [ + "plugin:cypress/recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "plugin:prettier/recommended", + ], + plugins: ["@typescript-eslint", "prettier"], + parser: "@typescript-eslint/parser", + rules: { + "cypress/no-unnecessary-waiting": "warn", + "prettier/prettier": "warn", + + curly: "warn", + "dot-location": ["warn", "property"], + "dot-notation": "warn", + "no-else-return": "warn", + "no-lonely-if": "warn", + "no-inner-declarations": "off", + "no-unused-vars": "off", + "no-useless-computed-key": "warn", + "no-useless-return": "warn", + "no-var": "warn", + "object-shorthand": ["warn", "always"], + "prefer-arrow-callback": "warn", + "prefer-const": "warn", + "prefer-destructuring": ["warn", { AssignmentExpression: { array: true } }], + "prefer-object-spread": "warn", + "prefer-template": "warn", + "spaced-comment": ["warn", "always", { markers: ["/"] }], + yoda: "warn", + + "@typescript-eslint/array-type": ["warn", { default: "array-simple" }], + "@typescript-eslint/ban-ts-comment": [ + "warn", + { + "ts-expect-error": "allow-with-description", + }, + ], + "@typescript-eslint/ban-types": "warn", + "@typescript-eslint/consistent-indexed-object-style": ["warn", "record"], + "@typescript-eslint/consistent-type-definitions": ["warn", "interface"], + "@typescript-eslint/no-unused-vars": "warn", + + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/triple-slash-reference": "off", + }, +}; diff --git a/airbyte-webapp-e2e-tests/cypress/commands/common.ts b/airbyte-webapp-e2e-tests/cypress/commands/common.ts index e5b6aa51c54c..030e4e924f5f 100644 --- a/airbyte-webapp-e2e-tests/cypress/commands/common.ts +++ b/airbyte-webapp-e2e-tests/cypress/commands/common.ts @@ -3,9 +3,7 @@ export const submitButtonClick = () => { }; export const updateField = (field: string, value: string) => { - cy.get("input[name='" + field + "']") - .clear() - .type(value); + cy.get(`input[name='${field}']`).clear().type(value); }; export const openSettingForm = (name: string) => { @@ -31,5 +29,5 @@ export const fillEmail = (email: string) => { // useful for ensuring that a name is unique from one test run to the next export const appendRandomString = (string: string) => { const randomString = Math.random().toString(36).substring(2, 10); - return string + " _" + randomString; + return `${string} _${randomString}`; }; diff --git a/airbyte-webapp-e2e-tests/cypress/commands/destination.ts b/airbyte-webapp-e2e-tests/cypress/commands/destination.ts index 4f17ef4c5b32..f52bd8e14081 100644 --- a/airbyte-webapp-e2e-tests/cypress/commands/destination.ts +++ b/airbyte-webapp-e2e-tests/cypress/commands/destination.ts @@ -2,7 +2,7 @@ import { deleteEntity, openSettingForm, submitButtonClick, updateField } from ". import { fillLocalJsonForm, fillPostgresForm } from "./connector"; import { goToDestinationPage, openNewDestinationForm } from "pages/destinationPage"; -export const createLocalJsonDestination = (name: string, destinationPath: string = "/local") => { +export const createLocalJsonDestination = (name: string, destinationPath = "/local") => { cy.intercept("/api/v1/scheduler/destinations/check_connection").as("checkDestinationConnection"); cy.intercept("/api/v1/destinations/create").as("createDestination"); @@ -17,12 +17,12 @@ export const createLocalJsonDestination = (name: string, destinationPath: string export const createPostgresDestination = ( name: string, - host: string = "localhost", - port: string = "5434", - database: string = "airbyte_ci_destination", - username: string = "postgres", - password: string = "secret_password", - schema: string = "" + host = "localhost", + port = "5434", + database = "airbyte_ci_destination", + username = "postgres", + password = "secret_password", + schema = "" ) => { cy.intercept("/api/v1/scheduler/destinations/check_connection").as("checkDestinationConnection"); cy.intercept("/api/v1/destinations/create").as("createDestination"); diff --git a/airbyte-webapp-e2e-tests/cypress/commands/source.ts b/airbyte-webapp-e2e-tests/cypress/commands/source.ts index 9a04f81b9b59..083ec4e16a57 100644 --- a/airbyte-webapp-e2e-tests/cypress/commands/source.ts +++ b/airbyte-webapp-e2e-tests/cypress/commands/source.ts @@ -4,12 +4,12 @@ import { fillPostgresForm, fillPokeAPIForm } from "./connector"; export const createPostgresSource = ( name: string, - host: string = "localhost", - port: string = "5433", - database: string = "airbyte_ci_source", - username: string = "postgres", - password: string = "secret_password", - schema: string = "" + host = "localhost", + port = "5433", + database = "airbyte_ci_source", + username = "postgres", + password = "secret_password", + schema = "" ) => { cy.intercept("/api/v1/scheduler/sources/check_connection").as("checkSourceUpdateConnection"); cy.intercept("/api/v1/sources/create").as("createSource"); diff --git a/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.ts b/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.ts index df2d9f72313f..8917723e38b0 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.ts +++ b/airbyte-webapp-e2e-tests/cypress/integration/connection.spec.ts @@ -21,7 +21,7 @@ import { checkPrimaryKey, isPrimaryKeyNonExist, selectPrimaryKeyField, - checkPreFilledPrimaryKeyField + checkPreFilledPrimaryKeyField, } from "pages/replicationPage"; import { openSourceDestinationFromGrid, goToSourcePage } from "pages/sourcePage"; import { goToSettingsPage } from "pages/settingsConnectionPage"; @@ -35,7 +35,6 @@ import { toggleStreamWithChangesAccordion, } from "../pages/modals/catalogDiffModal"; import { updateSchemaModalConfirmBtnClick } from "../pages/modals/updateSchemaModal"; -import { update, ceil } from "cypress/types/lodash"; describe("Connection main actions", () => { beforeEach(() => { @@ -252,7 +251,7 @@ describe("Connection main actions", () => { expect(interception.request) .property("body") .to.contain({ - name: sourceName + " <> " + destName + "Connection name", + name: `${sourceName} <> ${destName}Connection name`, prefix: "auto_test", namespaceDefinition: "customformat", namespaceFormat: "${SOURCE_NAMESPACE}_test", @@ -453,7 +452,7 @@ describe("Connection main actions", () => { expect(interception.request) .property("body") .to.contain({ - name: sourceName + " <> " + destName + "Connection name", + name: `${sourceName} <> ${destName}Connection name`, namespaceDefinition: "customformat", namespaceFormat: "${SOURCE_NAMESPACE}_DestinationNamespaceCustomFormat", status: "active", @@ -523,7 +522,7 @@ describe("Connection main actions", () => { expect(interception.request) .property("body") .to.contain({ - name: sourceName + " <> " + destName + "Connection name", + name: `${sourceName} <> ${destName}Connection name`, namespaceDefinition: "destination", namespaceFormat: "${SOURCE_NAMESPACE}", status: "active", diff --git a/airbyte-webapp-e2e-tests/cypress/integration/source.spec.ts b/airbyte-webapp-e2e-tests/cypress/integration/source.spec.ts index 07995c845d95..234f74744978 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/source.spec.ts +++ b/airbyte-webapp-e2e-tests/cypress/integration/source.spec.ts @@ -13,11 +13,12 @@ describe("Source main actions", () => { cy.intercept("/api/v1/sources/create").as("createSource"); createPostgresSource("Test source cypress"); - cy.wait("@createSource", {timeout: 30000}).then((interception) => { - assert("include", `/source/${interception.response?.body.Id}`)}); + cy.wait("@createSource", { timeout: 30000 }).then((interception) => { + assert("include", `/source/${interception.response?.body.Id}`); + }); }); - //TODO: add update source on some other connector or create 1 more user for pg + // TODO: add update source on some other connector or create 1 more user for pg it.skip("Update source", () => { const sourceName = appendRandomString("Test source cypress for update"); createPostgresSource(sourceName); @@ -70,11 +71,12 @@ describe("Unsaved changes modal", () => { cy.get("[data-testid='confirmationModal']").should("exist"); cy.get("[data-testid='confirmationModal']").contains("Discard changes"); - cy.get("[data-testid='confirmationModal']") - .contains("There are unsaved changes. Are you sure you want to discard your changes?"); + cy.get("[data-testid='confirmationModal']").contains( + "There are unsaved changes. Are you sure you want to discard your changes?" + ); }); - //BUG - https://github.com/airbytehq/airbyte/issues/18246 + // BUG - https://github.com/airbytehq/airbyte/issues/18246 it.skip("Check leaving Source page after failing testing", () => { cy.intercept("/api/v1/scheduler/sources/check_connection").as("checkSourceUpdateConnection"); @@ -83,13 +85,14 @@ describe("Unsaved changes modal", () => { fillPokeAPIForm("testName", "name"); submitButtonClick(); - cy.wait("@checkSourceUpdateConnection", {timeout: 5000}); + cy.wait("@checkSourceUpdateConnection", { timeout: 5000 }); openHomepage(); cy.get("[data-testid='confirmationModal']").should("exist"); cy.get("[data-testid='confirmationModal']").contains("Discard changes"); - cy.get("[data-testid='confirmationModal']") - .contains("There are unsaved changes. Are you sure you want to discard your changes?"); + cy.get("[data-testid='confirmationModal']").contains( + "There are unsaved changes. Are you sure you want to discard your changes?" + ); }); }); diff --git a/airbyte-webapp-e2e-tests/cypress/pages/createConnectorPage.ts b/airbyte-webapp-e2e-tests/cypress/pages/createConnectorPage.ts index 9c6f73afd164..f2ae7a529c4c 100644 --- a/airbyte-webapp-e2e-tests/cypress/pages/createConnectorPage.ts +++ b/airbyte-webapp-e2e-tests/cypress/pages/createConnectorPage.ts @@ -53,7 +53,7 @@ export const enterSchema = (value: string) => { cy.get(schemaInput).first().type(value, { force: true }).type("{enter}", { force: true }); }; -export const removeSchema = (value: string = "Remove public") => { +export const removeSchema = (value = "Remove public") => { if (!value) { return; } diff --git a/airbyte-webapp-e2e-tests/cypress/pages/modals/updateSchemaModal.ts b/airbyte-webapp-e2e-tests/cypress/pages/modals/updateSchemaModal.ts index 07186ac5aaf9..d75314333b3e 100644 --- a/airbyte-webapp-e2e-tests/cypress/pages/modals/updateSchemaModal.ts +++ b/airbyte-webapp-e2e-tests/cypress/pages/modals/updateSchemaModal.ts @@ -1,3 +1,3 @@ export const updateSchemaModalConfirmBtnClick = () => { - cy.get("[data-testid='update-schema-confirm-btn']").click(); -}; \ No newline at end of file + cy.get("[data-testid='update-schema-confirm-btn']").click(); +}; diff --git a/airbyte-webapp-e2e-tests/cypress/pages/replicationPage.ts b/airbyte-webapp-e2e-tests/cypress/pages/replicationPage.ts index fdadf9ab86ac..ed90e798019e 100644 --- a/airbyte-webapp-e2e-tests/cypress/pages/replicationPage.ts +++ b/airbyte-webapp-e2e-tests/cypress/pages/replicationPage.ts @@ -40,10 +40,7 @@ export const fillOutDestinationPrefix = (value: string) => { export const setupDestinationNamespaceCustomFormat = (value: string) => { cy.get(destinationNamespace).click(); cy.get(destinationNamespaceCustom).click(); - cy.get(destinationNamespaceCustomInput) - .first() - .type(value) - .should("have.value", "${SOURCE_NAMESPACE}" + value); + cy.get(destinationNamespaceCustomInput).first().type(value).should("have.value", `\${SOURCE_NAMESPACE}${value}`); }; export const setupDestinationNamespaceSourceFormat = () => { diff --git a/airbyte-webapp-e2e-tests/cypress/plugins/index.ts b/airbyte-webapp-e2e-tests/cypress/plugins/index.ts index e546c1e5f1e5..61b54a1eabfd 100644 --- a/airbyte-webapp-e2e-tests/cypress/plugins/index.ts +++ b/airbyte-webapp-e2e-tests/cypress/plugins/index.ts @@ -12,8 +12,7 @@ // This function is called when a project is opened or re-opened (e.g. due to // the project's config changing) -import Cypress from "cypress" - +import Cypress from "cypress"; /** * @type {Cypress.PluginConfig} @@ -21,7 +20,7 @@ import Cypress from "cypress" module.exports = (on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions) => { // `on` is used to hook into various events Cypress emits // `config` is the resolved Cypress config - on("task", { - dbQuery:(query)=> require("cypress-postgres")(query.query,query.connection) - }); + on("task", { + dbQuery: (query) => require("cypress-postgres")(query.query, query.connection), + }); }; diff --git a/airbyte-webapp-e2e-tests/package-lock.json b/airbyte-webapp-e2e-tests/package-lock.json index 7923972b12c3..42c98ed633ac 100644 --- a/airbyte-webapp-e2e-tests/package-lock.json +++ b/airbyte-webapp-e2e-tests/package-lock.json @@ -9,9 +9,13 @@ "version": "0.0.0", "devDependencies": { "@types/node": "^18.11.9", + "@typescript-eslint/eslint-plugin": "^5.27.1", + "@typescript-eslint/parser": "^5.27.1", "cypress": "^9.2.0", "cypress-postgres": "^1.1.1", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-cypress": "^2.12.1", + "eslint-plugin-prettier": "^4.0.0", "prettier": "^2.6.2", "typescript": "^4.5.4" } @@ -136,12 +140,59 @@ "dev": true, "peer": true }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/sinonjs__fake-timers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", @@ -164,6 +215,224 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", + "integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/type-utils": "5.45.1", + "@typescript-eslint/utils": "5.45.1", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", + "integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/typescript-estree": "5.45.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", + "integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/visitor-keys": "5.45.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", + "integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.45.1", + "@typescript-eslint/utils": "5.45.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", + "integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", + "integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/visitor-keys": "5.45.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", + "integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/typescript-estree": "5.45.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", + "integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.45.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/acorn": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", @@ -292,6 +561,15 @@ "dev": true, "peer": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -401,6 +679,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -723,9 +1013,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -761,6 +1051,18 @@ "node": ">=0.4.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -880,6 +1182,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-plugin-cypress": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", @@ -892,6 +1206,27 @@ "eslint": ">= 3.2.1" } }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -911,7 +1246,6 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "peer": true, "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -930,17 +1264,15 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "peer": true, "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1007,7 +1339,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -1020,7 +1351,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -1118,6 +1448,40 @@ "dev": true, "peer": true }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1132,6 +1496,15 @@ "dev": true, "peer": true }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -1178,6 +1551,18 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -1340,6 +1725,35 @@ "node": ">=4" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -1466,7 +1880,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -1485,7 +1898,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1509,6 +1921,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1752,7 +2173,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1766,6 +2186,28 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -1827,6 +2269,12 @@ "dev": true, "peer": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -1948,6 +2396,15 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -2067,6 +2524,18 @@ "split2": "^4.1.0" } }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2140,6 +2609,18 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -2212,12 +2693,31 @@ "node": ">=0.4.x" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -2257,6 +2757,16 @@ "node": ">=8" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -2278,6 +2788,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", @@ -2314,11 +2847,10 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -2356,6 +2888,15 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -2504,6 +3045,18 @@ "node": ">=8.17.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -2523,6 +3076,27 @@ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2714,8 +3288,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/yauzl": { "version": "2.10.0", @@ -2832,12 +3405,50 @@ "dev": true, "peer": true }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/sinonjs__fake-timers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", @@ -2860,6 +3471,130 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", + "integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/type-utils": "5.45.1", + "@typescript-eslint/utils": "5.45.1", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", + "integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/typescript-estree": "5.45.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", + "integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/visitor-keys": "5.45.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", + "integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.45.1", + "@typescript-eslint/utils": "5.45.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", + "integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", + "integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/visitor-keys": "5.45.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", + "integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.45.1", + "@typescript-eslint/types": "5.45.1", + "@typescript-eslint/typescript-estree": "5.45.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", + "integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.45.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "acorn": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", @@ -2941,6 +3676,12 @@ "dev": true, "peer": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -3035,6 +3776,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -3287,9 +4037,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3316,6 +4066,15 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3433,6 +4192,13 @@ } } }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, "eslint-plugin-cypress": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", @@ -3442,6 +4208,15 @@ "globals": "^11.12.0" } }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", @@ -3458,7 +4233,6 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "peer": true, "requires": { "eslint-visitor-keys": "^2.0.0" }, @@ -3467,17 +4241,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true + "dev": true } } }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "peer": true + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true }, "espree": { "version": "9.2.0", @@ -3506,7 +4278,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "peer": true, "requires": { "estraverse": "^5.2.0" } @@ -3515,8 +4286,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true + "dev": true }, "esutils": { "version": "2.0.3", @@ -3588,6 +4358,36 @@ "dev": true, "peer": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3602,6 +4402,15 @@ "dev": true, "peer": true }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -3638,6 +4447,15 @@ "flat-cache": "^3.0.4" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -3764,6 +4582,28 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -3859,8 +4699,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "peer": true + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -3873,7 +4712,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "peer": true, "requires": { "is-extglob": "^2.1.1" } @@ -3888,6 +4726,12 @@ "is-path-inside": "^3.0.2" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4084,7 +4928,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "requires": { "yallist": "^4.0.0" } @@ -4095,6 +4938,22 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", @@ -4144,6 +5003,12 @@ "dev": true, "peer": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -4235,6 +5100,12 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -4336,6 +5207,12 @@ "split2": "^4.1.0" } }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4382,6 +5259,15 @@ "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -4435,12 +5321,17 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "peer": true + "dev": true }, "request-progress": { "version": "3.0.0", @@ -4468,6 +5359,12 @@ "signal-exit": "^3.0.2" } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", @@ -4483,6 +5380,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", @@ -4505,11 +5411,10 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -4535,6 +5440,12 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -4645,6 +5556,15 @@ "rimraf": "^3.0.0" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -4661,6 +5581,23 @@ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4805,8 +5742,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "yauzl": { "version": "2.10.0", diff --git a/airbyte-webapp-e2e-tests/package.json b/airbyte-webapp-e2e-tests/package.json index 555bcbf36525..8e2b18d4f5bb 100644 --- a/airbyte-webapp-e2e-tests/package.json +++ b/airbyte-webapp-e2e-tests/package.json @@ -7,26 +7,18 @@ "cypress:ci": "CYPRESS_BASE_URL=http://localhost:8000 cypress run", "cypress:ci:record": "CYPRESS_BASE_URL=http://localhost:8000 cypress run --record --key $CYPRESS_KEY", "createdbsource": "docker run --rm -d -p 5433:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci_source --name airbyte_ci_pg_source postgres", - "createdbdestination": "docker run --rm -d -p 5434:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci_destination --name airbyte_ci_pg_destination postgres" - - }, - "eslintConfig": { - "env": { - "browser": true, - "node": true - }, - "rules": { - "cypress/no-unnecessary-waiting": "warn" - }, - "extends": [ - "plugin:cypress/recommended" - ] + "createdbdestination": "docker run --rm -d -p 5434:5432 -e POSTGRES_PASSWORD=secret_password -e POSTGRES_DB=airbyte_ci_destination --name airbyte_ci_pg_destination postgres", + "lint": "eslint --ext js,ts,tsx cypress" }, "devDependencies": { "@types/node": "^18.11.9", + "@typescript-eslint/eslint-plugin": "^5.27.1", + "@typescript-eslint/parser": "^5.27.1", "cypress": "^9.2.0", "cypress-postgres": "^1.1.1", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-cypress": "^2.12.1", + "eslint-plugin-prettier": "^4.0.0", "prettier": "^2.6.2", "typescript": "^4.5.4" } diff --git a/airbyte-webapp-e2e-tests/tsconfig.json b/airbyte-webapp-e2e-tests/tsconfig.json index 5bd50d734540..43def3592a3f 100644 --- a/airbyte-webapp-e2e-tests/tsconfig.json +++ b/airbyte-webapp-e2e-tests/tsconfig.json @@ -18,6 +18,13 @@ "lib": ["es2015", "dom"], "isolatedModules": false, "allowJs": true, - "noEmit": true + "noEmit": true, + "paths": { + "commands/*": ["commands/*"], + "fixtures/*": ["fixtures/*"], + "integration": ["integration/*"], + "pages/*": ["pages/*"], + "plugins/*": ["plugins/*"] + } } } diff --git a/airbyte-webapp/.eslintrc.js b/airbyte-webapp/.eslintrc.js index c7c5b2545112..23296b922804 100644 --- a/airbyte-webapp/.eslintrc.js +++ b/airbyte-webapp/.eslintrc.js @@ -89,6 +89,7 @@ module.exports = { "react/jsx-fragments": "warn", "react/jsx-no-useless-fragment": ["warn", { allowExpressions: true }], "react/self-closing-comp": "warn", + "react/style-prop-object": ["warn", { allow: ["FormattedNumber"] }], "no-restricted-imports": [ "error", { diff --git a/airbyte-webapp/.storybook/preview.ts b/airbyte-webapp/.storybook/preview.ts index 2d3d9392e56b..da70fe71614d 100644 --- a/airbyte-webapp/.storybook/preview.ts +++ b/airbyte-webapp/.storybook/preview.ts @@ -4,6 +4,7 @@ import { withProviders } from "./withProvider"; import "!style-loader!css-loader!sass-loader!../public/index.css"; import "../src/scss/global.scss"; +import "../src/globals"; addDecorator(withProviders); diff --git a/airbyte-webapp/.stylelintignore b/airbyte-webapp/.stylelintignore new file mode 100644 index 000000000000..806b6a32b8e9 --- /dev/null +++ b/airbyte-webapp/.stylelintignore @@ -0,0 +1 @@ +coverage/**/* diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index 1dc0411cb31a..1debda5979c7 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -1,12 +1,12 @@ { "name": "airbyte-webapp", - "version": "0.40.23", + "version": "0.40.24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "airbyte-webapp", - "version": "0.40.23", + "version": "0.40.24", "dependencies": { "@datadog/browser-rum": "^4.21.2", "@floating-ui/react-dom": "^1.0.0", @@ -19,6 +19,7 @@ "@monaco-editor/react": "^4.4.5", "@sentry/react": "^6.19.6", "@sentry/tracing": "^6.19.6", + "@tanstack/react-table": "^8.7.0", "@types/segment-analytics": "^0.0.34", "classnames": "^2.3.1", "dayjs": "^1.11.3", @@ -32,6 +33,7 @@ "mdast": "^3.0.0", "query-string": "^6.13.1", "react": "^17.0.2", + "react-datepicker": "^4.8.0", "react-dom": "^17.0.2", "react-helmet-async": "^1.3.0", "react-intl": "^6.1.1", @@ -82,6 +84,7 @@ "@types/node": "^17.0.40", "@types/query-string": "^6.3.0", "@types/react": "^17.0.39", + "@types/react-datepicker": "^4.8.0", "@types/react-dom": "^17.0.11", "@types/react-helmet": "^6.1.5", "@types/react-lazylog": "^4.5.1", @@ -108,7 +111,7 @@ "lint-staged": "^12.3.7", "mini-css-extract-plugin": "^2.6.1", "node-fetch": "^2.6.7", - "orval": "^6.7.1", + "orval": "^6.11.0-alpha.10", "prettier": "^2.6.2", "react-scripts": "^5.0.1", "react-select-event": "^5.5.0", @@ -119,6 +122,7 @@ "stylelint-config-standard": "^26.0.0", "stylelint-config-standard-scss": "^5.0.0", "tar": "^6.1.11", + "timezone-mock": "^1.3.4", "tmpl": "^1.0.5", "ts-node": "^10.8.1", "typescript": "^4.7.3" @@ -233,6 +237,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/@asyncapi/specs": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-3.2.1.tgz", + "integrity": "sha512-FO+EteK+Gk3zwumrBw6frpp9cJ4oQL5++hBBpfM81w16e9KaiA4sKrzvQsvVjifoZZHNvVEX4D2zoz9i8CLccQ==", + "dev": true + }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -432,23 +442,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", @@ -1832,23 +1825,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", @@ -2093,23 +2069,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@babel/preset-flow": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.14.5.tgz", @@ -2718,6 +2677,38 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -2775,9 +2766,9 @@ } }, "node_modules/@exodus/schemasafe": { - "version": "1.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", - "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==", + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.9.tgz", + "integrity": "sha512-dGGHpb61hLwifAu7sotuHFDBw6GTdpG8aKC0fsK17EuTzMRvUrH7lEAr6LTJ+sx3AZYed9yZ77rltVDHyg2hRg==", "dev": true }, "node_modules/@firebase/analytics": { @@ -3696,14 +3687,15 @@ "dev": true }, "node_modules/@ibm-cloud/openapi-ruleset": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-0.6.2.tgz", - "integrity": "sha512-9fjTjYrXqejjNTyLC5znFeZ4UlxYNSZHroU3upUsmVLe2OgFsh4fAlwGkM2cqX79y7TxP5Tz5GvapyY0LIDYBQ==", + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-0.37.3.tgz", + "integrity": "sha512-saQM/1YTfhW7ou/mtmC4BMUhW/UM54aD47KBZucjrZLvAelzt8Lykm5zeN59Cu4cs/LBDEcvJfyZzDpPhdcVjQ==", "dev": true, "dependencies": { - "@stoplight/spectral-formats": "1.0.2", - "@stoplight/spectral-functions": "1.5.1", - "@stoplight/spectral-rulesets": "1.4.3" + "@stoplight/spectral-formats": "^1.1.0", + "@stoplight/spectral-functions": "^1.6.1", + "@stoplight/spectral-rulesets": "^1.6.0", + "lodash": "^4.17.21" }, "engines": { "node": ">=12.0.0" @@ -5413,9 +5405,9 @@ "dev": true }, "node_modules/@jsep-plugin/regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.2.tgz", - "integrity": "sha512-Nn/Bcaww8zOebMDqNmGlhAWPWhIr/8S8lGIgaB/fSqev5xaO5uKy5i4qvTh63GpR+VzKqimgxDdcxdcRuCJXSw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", + "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", "dev": true, "engines": { "node": ">= 10.16.0" @@ -5425,9 +5417,9 @@ } }, "node_modules/@jsep-plugin/ternary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.2.tgz", - "integrity": "sha512-gXguJc09uCrqWt1MD7L1+ChO32g4UH4BYGpHPoQRLhyU7pAPPRA7cvKbyjoqhnUlLutiXvLzB5hVVawPKax8jw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.3.tgz", + "integrity": "sha512-qtLGzCNzPVJ3kdH6/zoLWDPjauHIKiLSBAR71Wa0+PWvGA8wODUQvRgxtpUA5YqAYL3CQ8S4qXhd/9WuWTZirg==", "dev": true, "engines": { "node": ">= 10.16.0" @@ -5724,6 +5716,199 @@ "node": ">=10" } }, + "node_modules/@orval/angular": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/angular/-/angular-6.11.0-alpha.10.tgz", + "integrity": "sha512-6CcB0zvdPOEGECcWD2cmGLguYiqOWXMyTy2+9Nf21KhpszCbcfR2TVJe5rZVtX0J2uR2lzI58Uhx4cAvNi+59w==", + "dev": true, + "dependencies": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "node_modules/@orval/axios": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/axios/-/axios-6.11.0-alpha.10.tgz", + "integrity": "sha512-9h1anI1l+n2WHPWJ4qSRUeGY/i3tDWr6GCv8h3QBjoQ52JjxoLP0YAQ0mLPmh/0yDPs0tkpKTwAXx1a76SgKOA==", + "dev": true, + "dependencies": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "node_modules/@orval/core": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/core/-/core-6.11.0-alpha.10.tgz", + "integrity": "sha512-t9Z7/gxvBPnIFx7ywpqDp6K+ySrMXtW9NagcleeARcSCrsjqCfTTFleCCS27GBBy8J8CvnrladR2t1bY3XfrEQ==", + "dev": true, + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "acorn": "^8.8.0", + "ajv": "^8.11.0", + "chalk": "^4.1.2", + "compare-versions": "^4.1.3", + "debug": "^4.3.4", + "esbuild": "^0.15.3", + "esutils": "2.0.3", + "fs-extra": "^10.1.0", + "globby": "11.1.0", + "ibm-openapi-validator": "^0.88.0", + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0", + "lodash.omit": "^4.5.0", + "lodash.uniq": "^4.5.0", + "lodash.uniqby": "^4.7.0", + "lodash.uniqwith": "^4.5.0", + "micromatch": "^4.0.5", + "openapi3-ts": "^3.0.0", + "swagger2openapi": "^7.0.8", + "url": "^0.11.0", + "validator": "^13.7.0" + } + }, + "node_modules/@orval/core/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@orval/core/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@orval/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@orval/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@orval/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@orval/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@orval/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@orval/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@orval/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@orval/msw": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/msw/-/msw-6.11.0-alpha.10.tgz", + "integrity": "sha512-CDxouHl3J6/SpFWDbRhIxhXrQX+gNDDe6ekLDWZkYbD/kJln1TenjLCke1oPzBMToWPsYUjDf/2veQe8jwlwbg==", + "dev": true, + "dependencies": { + "@orval/core": "6.11.0-alpha.10", + "cuid": "^2.1.8", + "lodash.get": "^4.4.2", + "lodash.omit": "^4.5.0", + "openapi3-ts": "^3.0.0" + } + }, + "node_modules/@orval/query": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/query/-/query-6.11.0-alpha.10.tgz", + "integrity": "sha512-O0uWGVTkwEn+uo96Dg7OianKJcXNwCP7Jrx38Ajv/Stpl/PGJT4Y2C56AMCdSyxWN9Pg+DKE8lCcBlOXUTeYdA==", + "dev": true, + "dependencies": { + "@orval/core": "6.11.0-alpha.10", + "lodash.omitby": "^4.6.0" + } + }, + "node_modules/@orval/swr": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/swr/-/swr-6.11.0-alpha.10.tgz", + "integrity": "sha512-+d5xlNPspMshjxgIa0Zqj+lUkFhEnl63tLtmLIi1z0xmy01MhQvGujkdbAUgCGEtj5/9UkhTB2OfiiVRpN/cIQ==", + "dev": true, + "dependencies": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -5802,9 +5987,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", - "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -5816,33 +6001,10 @@ "resolve": "^1.17.0" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 12.0.0" }, "peerDependencies": { - "rollup": "^2.38.3" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "rollup": "^2.68.0" } }, "node_modules/@rollup/plugin-node-resolve": { @@ -5874,23 +6036,6 @@ "node": ">=0.10.0" } }, - "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", @@ -6042,15 +6187,6 @@ "node": ">=6" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -6070,13 +6206,14 @@ } }, "node_modules/@stoplight/json": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.0.tgz", - "integrity": "sha512-WW0z2bb0D4t8FTl+zNTCu46J8lEOsrUhBPgwEYQ3Ri2Y0MiRE4U1/9ZV8Ki+pIJznZgY9i42bbFwOBxyZn5/6w==", + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.20.1.tgz", + "integrity": "sha512-FXfud+uWgIj1xv6nUO9WnmgmnVikaxJcbtR4XQt4C42n5c2qua3U05Z/3B57hP5TJRSj+tpn9ID6/bFeyYYlEg==", "dev": true, "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" @@ -6105,49 +6242,36 @@ "dev": true }, "node_modules/@stoplight/json-ref-resolver": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.3.tgz", - "integrity": "sha512-SgoKXwVnlpIZUyAFX4W79eeuTWvXmNlMfICZixL16GZXnkjcW+uZnfmAU0ZIjcnaTgaI4mjfxn8LAP2KR6Cr0A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.4.tgz", + "integrity": "sha512-842JVmMsi++qpDuIX+JpQvK7YY8FXEZZb+/z4xuRfStOAVEryJT/tbgGOWxniSdxEl9Eni5D/I2afMyy6BuiNw==", "dev": true, "dependencies": { "@stoplight/json": "^3.17.0", "@stoplight/path": "^1.3.2", - "@stoplight/types": "^12.3.0", - "@types/urijs": "^1.19.16", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", "dependency-graph": "~0.11.0", "fast-memoize": "^2.5.2", "immer": "^9.0.6", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", + "lodash": "^4.17.21", "tslib": "^2.3.1", - "urijs": "^1.19.6" + "urijs": "^1.19.11" }, "engines": { "node": ">=8.3.0" } }, "node_modules/@stoplight/json-ref-resolver/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, - "node_modules/@stoplight/lifecycle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/lifecycle/-/lifecycle-2.3.2.tgz", - "integrity": "sha512-v0u8p27FA/eg04b4z6QXw4s0NeeFcRzyvseBW0+k/q4jtpg7EhVCqy42EbbbU43NTNDpIeQ81OcvkFz+6CYshw==", - "dev": true, - "dependencies": { - "wolfy87-eventemitter": "~5.2.8" - }, - "engines": { - "node": ">=8.3.0" - } - }, "node_modules/@stoplight/ordered-object-literal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.2.tgz", - "integrity": "sha512-0ZMS/9sNU3kVo/6RF3eAv7MK9DY8WLjiVJB/tVyfF2lhr2R4kqh534jZ0PlrFB9CRXrdndzn1DbX6ihKZXft2w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.4.tgz", + "integrity": "sha512-OF8uib1jjDs5/cCU+iOVy+GJjU3X7vk/qJIkIJFqwmlJKrrtijFmqwbu8XToXrwTYLQTP+Hebws5gtZEmk9jag==", "dev": true, "engines": { "node": ">=8" @@ -6163,22 +6287,21 @@ } }, "node_modules/@stoplight/spectral-cli": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.2.1.tgz", - "integrity": "sha512-Omi/vFk8u+UyM36HbFIuH33oPpOUhDF26xD1N0HoefJstMDUot+L0xVGJWslbVYubuJ7U+JLVLUFLKFU39NfcQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.6.0.tgz", + "integrity": "sha512-z46fnrvraaWMio8Y9RYYkLO+XdmtxOWpy5qNJF3CsmWua0FZ4iOTryb5Cm3GkB0wEtqxNUCBUHvoo4hS6Noyqg==", "dev": true, "dependencies": { - "@rollup/plugin-commonjs": "^20.0.0", - "@stoplight/json": "3.17.0", + "@stoplight/json": "~3.20.1", "@stoplight/path": "1.3.2", - "@stoplight/spectral-core": "^1.5.1", - "@stoplight/spectral-parsers": "^1.0.1", - "@stoplight/spectral-ref-resolver": "1.0.1", - "@stoplight/spectral-ruleset-bundler": "^1.0.0", - "@stoplight/spectral-ruleset-migrator": "^1.5.0", + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-parsers": "^1.0.2", + "@stoplight/spectral-ref-resolver": "1.0.2", + "@stoplight/spectral-ruleset-bundler": "^1.4.0", + "@stoplight/spectral-ruleset-migrator": "^1.9.0", "@stoplight/spectral-rulesets": ">=1", - "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "12.3.0", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", "chalk": "4.1.2", "cliui": "7.0.4", "eol": "0.9.1", @@ -6186,6 +6309,7 @@ "lodash": "~4.17.21", "pony-cause": "^1.0.0", "proxy-agent": "5.0.0", + "stacktracey": "^2.1.7", "strip-ansi": "6.0", "text-table": "0.2", "tslib": "^2.3.0", @@ -6285,9 +6409,9 @@ } }, "node_modules/@stoplight/spectral-cli/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-cli/node_modules/y18n": { @@ -6318,38 +6442,39 @@ } }, "node_modules/@stoplight/spectral-cli/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/@stoplight/spectral-core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.10.1.tgz", - "integrity": "sha512-eJ6KGWMzzvTfcunoDSEHddRB8is34u+h29wnPzs97V5gFzADkLV3eMPkjFnDmBaiD6kuaRvWV3ZLPbJtpuNg8w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.16.0.tgz", + "integrity": "sha512-W/NG+wV2UffwLExboqEa04/JbjGhiSTOl7GghLWYP4NKxZGaO6karP6fIxRBOnm34n1qyoZv9thsjSe92MWcDw==", "dev": true, "dependencies": { - "@stoplight/better-ajv-errors": "1.0.1", - "@stoplight/json": "~3.17.1", - "@stoplight/lifecycle": "2.3.2", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.20.1", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.0", "@stoplight/spectral-runtime": "^1.0.0", - "@stoplight/types": "12.3.0", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", "ajv": "^8.6.0", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.0", - "blueimp-md5": "2.18.0", - "json-schema": "0.4.0", - "jsonpath-plus": "6.0.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "7.1.0", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", - "minimatch": "3.0.4", - "nimma": "0.1.7", + "minimatch": "3.1.2", + "nimma": "0.2.2", + "pony-cause": "^1.0.0", "simple-eval": "1.0.0", "tslib": "^2.3.0" }, @@ -6358,9 +6483,9 @@ } }, "node_modules/@stoplight/spectral-core/node_modules/@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "dependencies": { "jsonpointer": "^5.0.0", @@ -6373,26 +6498,23 @@ "ajv": ">=8" } }, - "node_modules/@stoplight/spectral-core/node_modules/@stoplight/json": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.2.tgz", - "integrity": "sha512-NwIVzanXRUy291J5BMkncCZRMG1Lx+aq+VidGQgfkJjgo8vh1Y/PSAz7fSU8gVGSZBCcqmOkMI7R4zw7DlfTwA==", + "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", "dev": true, "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=8.3.0" + "node": "^12.20 || >=14.13" } }, "node_modules/@stoplight/spectral-core/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6421,15 +6543,15 @@ "dev": true }, "node_modules/@stoplight/spectral-core/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-formats": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.0.2.tgz", - "integrity": "sha512-jMIlMTSCJzFKq3kXnHv+YC0TTnwli/DuZY4JxObyaBwdiG1LnSAJLL7R857PpJpQ1uoiZULov8clxudSMeKL+Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.4.0.tgz", + "integrity": "sha512-j9VQukDzgqDSi26rK9LqsbXrqtkeIsPSPgEf5/sxRsmeF2bwWUhSjYXgYin4flSZ7owFZjZWQ3o0Qq3iApi2JQ==", "dev": true, "dependencies": { "@stoplight/json": "^3.17.0", @@ -6442,23 +6564,22 @@ } }, "node_modules/@stoplight/spectral-formats/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-functions": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.5.1.tgz", - "integrity": "sha512-KHMprX4OwjgVtzUulVPfqkZTNCAP4JbZqTQ5/UTCfrQ1nO4vcr+3CJgU74ggSP6rH3UuJIIFVZN+9wU7HP1bEA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.7.1.tgz", + "integrity": "sha512-UWeUrxc1pu45ZNYKtK3OloMpkUNTPqwpmjbGUn4oEnbqrLEYu/B2oOg66EtGcadOBEsdOb7f5vaPlhUNNrpEpQ==", "dev": true, "dependencies": { - "@stoplight/better-ajv-errors": "1.0.1", - "@stoplight/json": "~3.17.1", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", "@stoplight/spectral-core": "^1.7.0", "@stoplight/spectral-formats": "^1.0.0", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "12.3.0", "ajv": "^8.6.3", "ajv-draft-04": "~1.0.0", "ajv-errors": "~3.0.0", @@ -6471,9 +6592,9 @@ } }, "node_modules/@stoplight/spectral-functions/node_modules/@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "dependencies": { "jsonpointer": "^5.0.0", @@ -6486,26 +6607,10 @@ "ajv": ">=8" } }, - "node_modules/@stoplight/spectral-functions/node_modules/@stoplight/json": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.2.tgz", - "integrity": "sha512-NwIVzanXRUy291J5BMkncCZRMG1Lx+aq+VidGQgfkJjgo8vh1Y/PSAz7fSU8gVGSZBCcqmOkMI7R4zw7DlfTwA==", - "dev": true, - "dependencies": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" - }, - "engines": { - "node": ">=8.3.0" - } - }, "node_modules/@stoplight/spectral-functions/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6548,20 +6653,20 @@ "dev": true }, "node_modules/@stoplight/spectral-functions/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-parsers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.1.tgz", - "integrity": "sha512-JGKlrTxhjUzIGo2FOCf8Qp0WKTWXedoRNPovqYPE8pAp08epqU8DzHwl/i46BGH5yfTmouKMZgBN/PV2+Cr5jw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.2.tgz", + "integrity": "sha512-ZQXknJ+BM5Re4Opj4cgVlHgG2qyOk/wznKJq3Vf1qsBEg2CNzN0pJmSB0deRqW0kArqm44qpb8c+cz3F2rgMtw==", "dev": true, "dependencies": { - "@stoplight/json": "3.17.0", - "@stoplight/types": "12.3.0", - "@stoplight/yaml": "4.2.2", + "@stoplight/json": "~3.20.1", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", "tslib": "^2.3.1" }, "engines": { @@ -6569,20 +6674,20 @@ } }, "node_modules/@stoplight/spectral-parsers/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.1.tgz", - "integrity": "sha512-0tY7nTOccvTsa3c4QbSWfJ8wGfPO1RXvmKnmBjuyLfoTMNuhkHPII9gKhCjygsshzsBLxs2IyRHZYhWYVnEbCA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.2.tgz", + "integrity": "sha512-ah6NIB/O1EdEaEu89So3LmtbKRXPVnSElgQ7oBRE9S4/VOedSqyXn+qqMd40tGnO2CsKgZaFUYXdSEHOshpHYw==", "dev": true, "dependencies": { "@stoplight/json-ref-readers": "1.2.2", - "@stoplight/json-ref-resolver": "3.1.3", - "@stoplight/spectral-runtime": "^1.0.0", + "@stoplight/json-ref-resolver": "~3.1.4", + "@stoplight/spectral-runtime": "^1.1.2", "dependency-graph": "0.11.0", "tslib": "^2.3.1" }, @@ -6591,31 +6696,31 @@ } }, "node_modules/@stoplight/spectral-ref-resolver/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-ruleset-bundler": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.2.1.tgz", - "integrity": "sha512-baQDeu6YychKWFXmed4Pw6pDJIJimtqfCRHZ5CzUpp4j6UHTwozAA+am1FiKdmwlVYpBKS4g5ORu0s/aVQe+8A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.5.0.tgz", + "integrity": "sha512-I1ZbhnJtRTi0lG6oXA1r8J6KLxoZKkNB3aSdrNJJTHoo/AccMSMhV4ey8zbLsYNsJ/9ywR5ttkBAbyGuo3Jtxg==", "dev": true, "dependencies": { - "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-commonjs": "~22.0.2", "@stoplight/path": "1.3.2", "@stoplight/spectral-core": ">=1", "@stoplight/spectral-formats": ">=1", "@stoplight/spectral-functions": ">=1", "@stoplight/spectral-parsers": ">=1", "@stoplight/spectral-ref-resolver": ">=1", - "@stoplight/spectral-ruleset-migrator": "^1.5.2", + "@stoplight/spectral-ruleset-migrator": "^1.7.4", "@stoplight/spectral-rulesets": ">=1", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "^12.3.0", + "@stoplight/types": "^13.6.0", "@types/node": "*", "pony-cause": "1.1.1", - "rollup": "~2.67.0", + "rollup": "~2.79.0", "tslib": "^2.3.1", "validate-npm-package-name": "3.0.0" }, @@ -6623,69 +6728,25 @@ "node": "^12.20 || >= 14.13" } }, - "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/@rollup/plugin-commonjs": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", - "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^2.38.3" - } - }, - "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-ruleset-migrator": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.7.3.tgz", - "integrity": "sha512-1TlJgNxIqlcafzrH6gsGpQQcVkFhndib5piMNXVg9xshJ42l2yC6A0AUAixUC+ODJ5098DR7SjIYBVKk+CTQSw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.9.1.tgz", + "integrity": "sha512-TiH7UZIuHX+yb6EsWA9Z2ou455Wtki3z7SCkVRgd7WdzkD7O13R8ywqKoCUJ44UP7iuo1Ejnog18Rw4qJJE/fg==", "dev": true, "dependencies": { - "@stoplight/json": "~3.17.0", - "@stoplight/ordered-object-literal": "1.0.2", + "@stoplight/json": "~3.20.1", + "@stoplight/ordered-object-literal": "~1.0.4", "@stoplight/path": "1.3.2", "@stoplight/spectral-functions": "^1.0.0", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "^12.3.0", - "@stoplight/yaml": "4.2.2", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", "@types/node": "*", "ajv": "^8.6.0", "ast-types": "0.14.2", @@ -6699,9 +6760,9 @@ } }, "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6721,24 +6782,25 @@ "dev": true }, "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-rulesets": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.4.3.tgz", - "integrity": "sha512-kiUKcPvvvgg0U9p1KtsaRglW4xKCqXwTu2lL6Ci6elwsqK7P7CQAxJbcbhl30tqJ+m2oXTLTWJhZFa/xGk01FA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.14.1.tgz", + "integrity": "sha512-tn6a5fYPFDwEY+/YyK/hcq2gcR5nSIBt7l+JGELb/2RdTzD5ikj2mfl2ua3uxbqOZytftFoOX5ewGZ0qQNrudw==", "dev": true, "dependencies": { - "@stoplight/better-ajv-errors": "1.0.1", + "@asyncapi/specs": "^3.2.0", + "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.8.1", - "@stoplight/spectral-formats": "^1.0.2", + "@stoplight/spectral-formats": "^1.4.0", "@stoplight/spectral-functions": "^1.5.1", "@stoplight/spectral-runtime": "^1.1.1", - "@stoplight/types": "^12.3.0", + "@stoplight/types": "^13.6.0", "@types/json-schema": "^7.0.7", "ajv": "^8.8.2", "ajv-formats": "~2.1.0", @@ -6751,9 +6813,9 @@ } }, "node_modules/@stoplight/spectral-rulesets/node_modules/@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "dependencies": { "jsonpointer": "^5.0.0", @@ -6767,9 +6829,9 @@ } }, "node_modules/@stoplight/spectral-rulesets/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6789,9 +6851,9 @@ "dev": true }, "node_modules/@stoplight/spectral-rulesets/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/spectral-runtime": { @@ -6812,33 +6874,46 @@ "node": ">=12" } }, + "node_modules/@stoplight/spectral-runtime/node_modules/@stoplight/types": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.5.0.tgz", + "integrity": "sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@stoplight/spectral-runtime/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@stoplight/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.3.0.tgz", - "integrity": "sha512-hgzUR1z5BlYvIzUeFK5pjs5JXSvEutA9Pww31+dVicBlunsG1iXopDx/cvfBY7rHOrgtZDuvyeK4seqkwAZ6Cg==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.8.0.tgz", + "integrity": "sha512-5glKswz7y9aACh+a+JegID+4xX//4TsIdv7iPl29hWnOoWrnlPbg3Gjc4nYUXXgMSaSlSsA15JU/0+rE89fR4A==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" }, "engines": { - "node": ">=8" + "node": "^12.20 || >=14.13" } }, "node_modules/@stoplight/yaml": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.2.tgz", - "integrity": "sha512-N086FU8pmSpjc5TvMBjmlTniZVh3OXzmEh6SYljSLiuv6aMxgjyjf13YrAlUqgu0b4b6pQ5zmkjrfo9i0SiLsw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", + "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", "dev": true, "dependencies": { "@stoplight/ordered-object-literal": "^1.0.1", - "@stoplight/types": "^12.0.0", + "@stoplight/types": "^13.0.0", "@stoplight/yaml-ast-parser": "0.0.48", "tslib": "^2.2.0" }, @@ -6853,9 +6928,9 @@ "dev": true }, "node_modules/@stoplight/yaml/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@storybook/addon-actions": { @@ -9504,18 +9579,6 @@ "node": ">=6" } }, - "node_modules/@storybook/core-common/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/core-common/node_modules/loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -10350,18 +10413,6 @@ "node": ">=4" } }, - "node_modules/@storybook/core-server/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/core-server/node_modules/loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -10754,18 +10805,6 @@ "node": ">=10" } }, - "node_modules/@storybook/csf-tools/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/csf-tools/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -11264,18 +11303,6 @@ "node": ">=4" } }, - "node_modules/@storybook/manager-webpack4/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/manager-webpack4/node_modules/loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -12071,18 +12098,6 @@ "node": ">=6" } }, - "node_modules/@storybook/manager-webpack5/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/manager-webpack5/node_modules/loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -13102,18 +13117,6 @@ "node": ">=6" } }, - "node_modules/@storybook/react/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/react/node_modules/loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -13465,18 +13468,6 @@ "node": ">=8" } }, - "node_modules/@storybook/telemetry/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@storybook/telemetry/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13872,16 +13863,35 @@ "node": ">=8.9.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, + "node_modules/@tanstack/react-table": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.7.0.tgz", + "integrity": "sha512-VJ+9rsymDLaSU35rWOfX0bwNXnpW1i+T14wi+sHx8lxwAsfg6IY1Yw7FPfGADvUFP5eQn2t4nlohAJd+IoEj/Q==", "dependencies": { - "defer-to-connect": "^1.0.1" + "@tanstack/table-core": "8.7.0" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.7.0.tgz", + "integrity": "sha512-DRiRbOAmDHapzUBd4/C4Yy+FTug4fdGp5sdZWWfCq4wxRoaXQraQgbzmK23a3QcbwLFtLeNezPkZrqbJWuX+VA==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@testing-library/dom": { @@ -14314,6 +14324,15 @@ "@types/ms": "*" } }, + "node_modules/@types/es-aggregate-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz", + "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -14622,6 +14641,18 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==", + "dev": true, + "dependencies": { + "@popperjs/core": "^2.9.2", + "@types/react": "*", + "date-fns": "^2.0.1", + "react-popper": "^2.2.5" + } + }, "node_modules/@types/react-dom": { "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", @@ -16040,6 +16071,15 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -16312,6 +16352,15 @@ "node": ">=8" } }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -16886,22 +16935,6 @@ "node": ">=10" } }, - "node_modules/babel-plugin-macros/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", @@ -16950,23 +16983,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", @@ -17011,23 +17027,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/babel-plugin-polyfill-regenerator/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-plugin-react-docgen": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", @@ -17319,53 +17318,12 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/blueimp-md5": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", - "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", - "dev": true - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -17969,57 +17927,6 @@ "node": ">=0.10.0" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -18232,12 +18139,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "node_modules/check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -18399,18 +18300,6 @@ "node": ">=8" } }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-table3": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", @@ -18492,15 +18381,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -18514,7 +18394,7 @@ "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -18555,15 +18435,6 @@ "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/clsx": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", @@ -18711,6 +18582,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "node_modules/compare-versions": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz", + "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==", + "dev": true + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -18806,23 +18683,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -19838,6 +19698,18 @@ "resolved": "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-3.1.0.tgz", "integrity": "sha1-H80D29UEudvuK5B4yFpfHH08wtM=" }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/dayjs": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", @@ -19930,18 +19802,6 @@ "node": ">=0.10" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -19965,15 +19825,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -20007,20 +19858,17 @@ } }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -20155,7 +20003,7 @@ "node_modules/degenerator/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -20185,7 +20033,7 @@ "node_modules/degenerator/node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -20202,15 +20050,15 @@ } }, "node_modules/degenerator/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/degenerator/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -20644,27 +20492,6 @@ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -20686,12 +20513,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -20886,6 +20707,18 @@ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -20926,31 +20759,32 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -20962,6 +20796,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-aggregate-error": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz", + "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "function-bind": "^1.1.1", + "functions-have-names": "^1.2.3", + "get-intrinsic": "^1.1.3", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", @@ -21028,7 +20883,7 @@ "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", "dev": true }, "node_modules/es6-shim": { @@ -21038,9 +20893,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", - "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "hasInstallScript": true, "bin": { @@ -21050,26 +20905,348 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.39", - "esbuild-android-arm64": "0.14.39", - "esbuild-darwin-64": "0.14.39", - "esbuild-darwin-arm64": "0.14.39", - "esbuild-freebsd-64": "0.14.39", - "esbuild-freebsd-arm64": "0.14.39", - "esbuild-linux-32": "0.14.39", - "esbuild-linux-64": "0.14.39", - "esbuild-linux-arm": "0.14.39", - "esbuild-linux-arm64": "0.14.39", - "esbuild-linux-mips64le": "0.14.39", - "esbuild-linux-ppc64le": "0.14.39", - "esbuild-linux-riscv64": "0.14.39", - "esbuild-linux-s390x": "0.14.39", - "esbuild-netbsd-64": "0.14.39", - "esbuild-openbsd-64": "0.14.39", - "esbuild-sunos-64": "0.14.39", - "esbuild-windows-32": "0.14.39", - "esbuild-windows-64": "0.14.39", - "esbuild-windows-arm64": "0.14.39" + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/escalade": { @@ -21080,15 +21257,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -21330,23 +21498,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-module-utils": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", @@ -21524,23 +21675,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-jest": { "version": "26.5.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz", @@ -22044,6 +22178,12 @@ "node": ">=8.3.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -22449,32 +22589,6 @@ "node": ">=0.10.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -22685,21 +22799,6 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -22789,41 +22888,6 @@ "ramda": "^0.28.0" } }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/file-system-cache/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/file-system-cache/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -23215,18 +23279,6 @@ "node": ">=8" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -23447,17 +23499,26 @@ } }, "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/fs-minipass": { @@ -23535,7 +23596,7 @@ "node_modules/ftp": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "dependencies": { "readable-stream": "1.1.x", @@ -23548,13 +23609,13 @@ "node_modules/ftp/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "node_modules/ftp/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -23566,7 +23627,7 @@ "node_modules/ftp/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, "node_modules/function-bind": { @@ -23644,14 +23705,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -23677,6 +23738,31 @@ "node": ">=8.0.0" } }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-source/node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/get-source/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -23741,6 +23827,29 @@ "node": ">= 6" } }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -23816,27 +23925,6 @@ "process": "^0.11.10" } }, - "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "dependencies": { - "ini": "1.3.7" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -23939,40 +24027,6 @@ "node": ">=0.6.0" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -24205,15 +24259,6 @@ "node": ">=0.10.0" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -24662,12 +24707,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -24797,15 +24836,15 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "node_modules/ibm-openapi-validator": { - "version": "0.57.4", - "resolved": "https://registry.npmjs.org/ibm-openapi-validator/-/ibm-openapi-validator-0.57.4.tgz", - "integrity": "sha512-LMYdpg1BUIlGJ14W8d6Ltr3uyLtpXblqHKqAuufIE6vWVcd20d4I631DMUp/man6KwdUvFnQwE5cx+Q6AGQ9gQ==", + "version": "0.88.3", + "resolved": "https://registry.npmjs.org/ibm-openapi-validator/-/ibm-openapi-validator-0.88.3.tgz", + "integrity": "sha512-WHkkO5TXWSS12P8VybB04Stq+yFloMlHy2aVzcLAZo425PYIVMuIWhsH7zN9vwcZcOB/qAnWQ4T3PKn6wrcT+Q==", "dev": true, "dependencies": { - "@ibm-cloud/openapi-ruleset": "0.6.2", - "@stoplight/spectral-cli": "6.2.1", - "@stoplight/spectral-core": "1.10.1", - "@stoplight/spectral-parsers": "1.0.1", + "@ibm-cloud/openapi-ruleset": "0.37.3", + "@stoplight/spectral-cli": "^6.4.2", + "@stoplight/spectral-core": "^1.12.4", + "@stoplight/spectral-parsers": "^1.0.1", "chalk": "^4.1.1", "commander": "^2.20.3", "deepmerge": "^2.2.1", @@ -24820,7 +24859,6 @@ "pad": "^2.3.0", "require-all": "^3.0.0", "semver": "^5.7.1", - "update-notifier": "^4.1.3", "validator": "^13.7.0", "yaml-js": "^0.2.3" }, @@ -24957,7 +24995,7 @@ "node_modules/ibm-openapi-validator/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" @@ -25095,15 +25133,6 @@ "node": ">=6" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -25180,102 +25209,6 @@ "css-in-js-utils": "^2.0.0" } }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -25469,9 +25402,9 @@ "dev": true }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -25493,9 +25426,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -25671,40 +25604,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -25732,15 +25631,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -25930,18 +25820,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -26008,12 +25886,6 @@ "node": ">=8" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -28219,23 +28091,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -29688,9 +29543,9 @@ } }, "node_modules/jsep": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.6.tgz", - "integrity": "sha512-o7fP1eZVROIChADx7HKiwGRVI0tUqgUUGhaok6DP7cMxpDeparuooREDBDeNk2G5KIB49MBSkRYsCOu4PmZ+1w==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.7.tgz", + "integrity": "sha512-NFbZTr1t13fPKw53swmZFKwBkEDWDnno7uLJk+a+Rw9tGDTkGgnGdZJ8A/o3gR1+XaAXmSsbpfIBIBgqRBZWDA==", "dev": true, "engines": { "node": ">= 10.16.0" @@ -29707,12 +29562,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "node_modules/json-dup-key-validator": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/json-dup-key-validator/-/json-dup-key-validator-1.0.3.tgz", @@ -29743,6 +29592,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz", "integrity": "sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ==", + "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", "dev": true, "dependencies": { "call-me-maybe": "^1.0.1", @@ -29821,21 +29671,33 @@ "dev": true }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/jsonpath-plus": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-6.0.1.tgz", - "integrity": "sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.1.0.tgz", + "integrity": "sha512-gTaNRsPWO/K2KY6MrqaUFClF9kmuM6MFH5Dhg1VYDODgFbByw1yb7xu3hrViE/sz+dGOeMWgCzwUwQtAnCTE9g==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/jsonpointer": { @@ -29911,15 +29773,6 @@ "node": ">=8" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -29968,18 +29821,6 @@ "language-subtag-registry": "~0.3.2" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/launchdarkly-js-client-sdk": { "version": "2.22.1", "resolved": "https://registry.npmjs.org/launchdarkly-js-client-sdk/-/launchdarkly-js-client-sdk-2.22.1.tgz", @@ -30376,7 +30217,13 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", "dev": true }, "node_modules/lodash.memoize": { @@ -30394,19 +30241,13 @@ "node_modules/lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", "dev": true }, "node_modules/lodash.omitby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", - "integrity": "sha1-XBX/R1StVVAWtTwEExHo8HkgR5E=", - "dev": true - }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==", "dev": true }, "node_modules/lodash.sortby": { @@ -30423,7 +30264,7 @@ "node_modules/lodash.topath": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", - "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", "dev": true }, "node_modules/lodash.truncate": { @@ -30441,101 +30282,15 @@ "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true }, "node_modules/lodash.uniqwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", - "integrity": "sha1-egy/ZfQ7WShiWp1NDcVLGMrcfvM=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==", "dev": true }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -30672,15 +30427,6 @@ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lowlight": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", @@ -32692,15 +32438,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", @@ -33048,12 +32785,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "node_modules/nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", @@ -33194,9 +32925,9 @@ "dev": true }, "node_modules/nimma": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.1.7.tgz", - "integrity": "sha512-0FIra4ogMHhOjn4fd2UiBuuaxM1nHzwhCEPvaFmCbwsR6qzHyJUG3dLW3tAIQji42wIij8OA/HB0+Gldg3OX4A==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.2.tgz", + "integrity": "sha512-V52MLl7BU+tH2Np9tDrIXK8bql3MVUadnMIl/0/oZSGC9keuro0O9UUv9QKp0aMvtN8HRew4G7byY7H4eWsxaQ==", "dev": true, "dependencies": { "@jsep-plugin/regex": "^1.0.1", @@ -33212,6 +32943,16 @@ "lodash.topath": "^4.5.2" } }, + "node_modules/nimma/node_modules/jsonpath-plus": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-6.0.1.tgz", + "integrity": "sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -33360,7 +33101,7 @@ "node_modules/node-readfiles": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", "dev": true, "dependencies": { "es6-promise": "^3.2.1" @@ -33527,6 +33268,20 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-resolver/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/oas-resolver/node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -33537,27 +33292,27 @@ } }, "node_modules/oas-resolver/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/oas-resolver/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -33647,9 +33402,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -33895,12 +33650,21 @@ "peer": true }, "node_modules/openapi3-ts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", - "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-3.1.2.tgz", + "integrity": "sha512-S8fijNOqe/ut0kEDAwHZnI7sVYqb8Q3XnISmSyXmK76jgrcf4ableI75KTY1qdksd9EI/t39Vi5M4VYKrkNKfQ==", "dev": true, "dependencies": { - "yaml": "^1.10.2" + "yaml": "^2.1.3" + } + }, + "node_modules/openapi3-ts/node_modules/yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==", + "dev": true, + "engines": { + "node": ">= 14" } }, "node_modules/optionator": { @@ -33920,149 +33684,50 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/orval": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/orval/-/orval-6.8.1.tgz", - "integrity": "sha512-E8ZsGB1BsulDqMxdYvni3lc63mUpkFsLZbqiZRKTWs3sBtNz7THSkUEkCYhRW6qyXR8TM+RHCYeYGUYHlWuCmw==", - "dev": true, - "dependencies": { - "@apidevtools/swagger-parser": "^10.0.3", - "acorn": "^8.7.0", + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/orval/-/orval-6.11.0-alpha.10.tgz", + "integrity": "sha512-PBgt9Wgs2jLSh0XYPza1hogZpkbA2Nii6NNbcX2aTN1Q8OEEmEasVTubWq7xlm8LBpElWyLcP3aja8O6t+wI3Q==", + "dev": true, + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "@orval/angular": "6.11.0-alpha.10", + "@orval/axios": "6.11.0-alpha.10", + "@orval/core": "6.11.0-alpha.10", + "@orval/msw": "6.11.0-alpha.10", + "@orval/query": "6.11.0-alpha.10", + "@orval/swr": "6.11.0-alpha.10", + "ajv": "^8.11.0", "cac": "^6.7.12", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "compare-versions": "^4.1.3", - "cuid": "^2.1.8", - "debug": "^4.3.3", - "esbuild": "^0.14.25", - "esutils": "2.0.3", + "enquirer": "^2.3.6", "execa": "^5.1.1", "find-up": "5.0.0", - "fs-extra": "^10.0.1", - "globby": "11.0.4", - "ibm-openapi-validator": "^0.57.4", - "inquirer": "^8.2.0", - "lodash.get": "^4.4.2", - "lodash.omit": "^4.5.0", - "lodash.omitby": "^4.6.0", + "fs-extra": "^10.1.0", "lodash.uniq": "^4.5.0", - "lodash.uniqby": "^4.7.0", - "lodash.uniqwith": "^4.5.0", - "micromatch": "^4.0.4", - "openapi3-ts": "^2.0.2", - "swagger2openapi": "^7.0.8", - "tsconfck": "^1.2.0", - "upath": "^2.0.1", - "url": "^0.11.0", - "validator": "^13.7.0" + "openapi3-ts": "^3.0.0", + "string-argv": "^0.3.1", + "tsconfck": "^2.0.1" }, "bin": { "orval": "dist/bin/orval.js" } }, - "node_modules/orval/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "node_modules/orval/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/orval/node_modules/ansi-styles": { @@ -34114,12 +33779,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/orval/node_modules/compare-versions": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.3.tgz", - "integrity": "sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg==", - "dev": true - }, "node_modules/orval/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -34136,40 +33795,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/orval/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/orval/node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/orval/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -34179,17 +33804,11 @@ "node": ">=8" } }, - "node_modules/orval/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/orval/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/orval/node_modules/locate-path": { "version": "6.0.0", @@ -34248,25 +33867,6 @@ "node": ">=8" } }, - "node_modules/orval/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/orval/node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -34322,15 +33922,6 @@ "node": ">=6" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -34469,34 +34060,19 @@ } }, "node_modules/pac-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", - "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "dev": true, "dependencies": { - "degenerator": "^3.0.1", + "degenerator": "^3.0.2", "ip": "^1.1.5", - "netmask": "^2.0.1" + "netmask": "^2.0.2" }, "engines": { "node": ">= 8" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pad": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz", @@ -35222,15 +34798,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", @@ -35321,6 +34888,12 @@ "node": ">= 0.8" } }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, "node_modules/prismjs": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", @@ -35612,18 +35185,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -35851,30 +35412,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -35917,6 +35454,23 @@ "react-dom": ">=15.3.0" } }, + "node_modules/react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-u69zXGHMpxAa4LeYR83vucQoUCJQ6m/WBsSxmUMu/M8ahTSVMMyiyQzauHgZA2NUr9y0FUgOAix71hGYUb6tvg==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.0", + "react-popper": "^2.2.5" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -36576,6 +36130,19 @@ "react-dom": ">0.13.0" } }, + "node_modules/react-onclickoutside": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", + "integrity": "sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, "node_modules/react-paginate": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.1.3.tgz", @@ -36587,6 +36154,33 @@ "react": "^16 || ^17 || ^18" } }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-popper/node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-popper/node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/react-query": { "version": "3.39.1", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.1.tgz", @@ -37369,20 +36963,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-scripts/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/react-scripts/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -37565,18 +37145,6 @@ "node": ">=6" } }, - "node_modules/react-scripts/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/react-scripts/node_modules/loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -38672,23 +38240,6 @@ "strip-ansi": "^6.0.1" } }, - "node_modules/react-scripts/node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/react-scripts/node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -39030,15 +38581,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-scripts/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/react-scripts/node_modules/webpack-dev-middleware": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", @@ -39863,30 +39405,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -41090,7 +40608,7 @@ "node_modules/require-all": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz", - "integrity": "sha1-Rz1JcEvjEBFc4ST3c4Ox69hnExI=", + "integrity": "sha512-jPGN876lc5exWYrMcgZSd7U42P0PmVQzxnQB13fCSzmyGnqQWW4WUz5DosZ/qe24hz+5o9lSvW2epBNZ1xa6Fw==", "dev": true, "engines": { "node": ">= 0.8" @@ -41122,7 +40640,7 @@ "node_modules/reserved": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", - "integrity": "sha1-cHsSRqMmn3Vdp8/Pmvb0mDvvEFw=", + "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", "dev": true, "engines": { "node": ">=0.8" @@ -41134,12 +40652,19 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { @@ -41253,15 +40778,6 @@ "node": ">=10" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -41325,9 +40841,9 @@ } }, "node_modules/rollup": { - "version": "2.67.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.3.tgz", - "integrity": "sha512-G/x1vUwbGtP6O5ZM8/sWr8+p7YfZhI18pPqMRtMYMWSbHjKZ/ajHGiM+GWNTlWyOR0EHIdT8LHU+Z4ciIZ1oBw==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -41416,15 +40932,6 @@ "@babel/runtime": "^7.1.2" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -41495,6 +41002,20 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", @@ -41959,18 +41480,6 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -42292,7 +41801,7 @@ "node_modules/should-format": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "dev": true, "dependencies": { "should-type": "^1.3.0", @@ -42302,7 +41811,7 @@ "node_modules/should-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", "dev": true }, "node_modules/should-type-adaptors": { @@ -42574,12 +42083,12 @@ "dev": true }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -42601,6 +42110,12 @@ "node": ">= 6" } }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -42876,6 +42391,16 @@ "stacktrace-gps": "^3.0.4" } }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", @@ -44064,6 +43589,20 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/swagger2openapi/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/swagger2openapi/node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -44074,27 +43613,27 @@ } }, "node_modules/swagger2openapi/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/swagger2openapi/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -44320,18 +43859,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -44582,6 +44109,12 @@ "node": ">=0.6.0" } }, + "node_modules/timezone-mock": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/timezone-mock/-/timezone-mock-1.3.4.tgz", + "integrity": "sha512-B0CGmOgMPVUZqp63eU/FGcDaL68JjHeiVnCF24K99Kj6AwCV15BHWMLCv8ZKSUq5oyVHTtg7p1ajOWfXB+0wnQ==", + "dev": true + }, "node_modules/timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -44648,15 +44181,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -44895,15 +44419,16 @@ } }, "node_modules/tsconfck": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-1.2.2.tgz", - "integrity": "sha512-x5YpjOqjJnMs1EsJvQBQbrysrY32eGoZRRr5YvbN1hwlrXKc7jiphCOUrT7xbFdOWk8sh+EtMYbGPbTO8rDmcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.1.tgz", + "integrity": "sha512-/ipap2eecmVBmBlsQLBRbUmUNFwNJV/z2E+X0FPtHNjPwroMZQ7m39RMaCywlCulBheYXgMdUlWDd9rzxwMA0Q==", "dev": true, "bin": { "tsconfck": "bin/tsconfck.js" }, "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" + "node": "^14.13.1 || ^16 || >=18", + "pnpm": "^7.0.1" }, "peerDependencies": { "typescript": "^4.3.5" @@ -45522,140 +45047,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -45759,18 +45150,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -45950,7 +45329,7 @@ "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "dependencies": { "builtins": "^1.0.3" @@ -46044,9 +45423,9 @@ "dev": true }, "node_modules/vm2": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", - "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "version": "3.9.12", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.12.tgz", + "integrity": "sha512-OMmRsKh1gmdosFzuqmj6O43hqIStqXA24YbwjtUTO0TkOBP8yLNHLplbr4odnAzEcMnm9lt2r3R8kTivn8urMg==", "dev": true, "dependencies": { "acorn": "^8.7.0", @@ -46060,9 +45439,9 @@ } }, "node_modules/vm2/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -46437,7 +45816,7 @@ "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { "defaults": "^1.0.3" @@ -46964,12 +46343,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "node_modules/wolfy87-eventemitter": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz", - "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -47113,18 +46486,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/workbox-build/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", @@ -47435,15 +46796,6 @@ "default-browser-id": "^1.0.4" } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -47459,7 +46811,7 @@ "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", "dev": true, "engines": { "node": "*" @@ -47678,6 +47030,12 @@ } } }, + "@asyncapi/specs": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-3.2.1.tgz", + "integrity": "sha512-FO+EteK+Gk3zwumrBw6frpp9cJ4oQL5++hBBpfM81w16e9KaiA4sKrzvQsvVjifoZZHNvVEX4D2zoz9i8CLccQ==", + "dev": true + }, "@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -47820,19 +47178,6 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" - }, - "dependencies": { - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } } }, "@babel/helper-environment-visitor": { @@ -48755,17 +48100,6 @@ "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.20.0" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -48952,17 +48286,6 @@ "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.20.0" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -49424,6 +48747,20 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -49437,7 +48774,7 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.5", + "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -49465,9 +48802,9 @@ } }, "@exodus/schemasafe": { - "version": "1.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", - "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==", + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.9.tgz", + "integrity": "sha512-dGGHpb61hLwifAu7sotuHFDBw6GTdpG8aKC0fsK17EuTzMRvUrH7lEAr6LTJ+sx3AZYed9yZ77rltVDHyg2hRg==", "dev": true }, "@firebase/analytics": { @@ -50312,7 +49649,7 @@ "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" } }, "@humanwhocodes/object-schema": { @@ -50322,14 +49659,15 @@ "dev": true }, "@ibm-cloud/openapi-ruleset": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-0.6.2.tgz", - "integrity": "sha512-9fjTjYrXqejjNTyLC5znFeZ4UlxYNSZHroU3upUsmVLe2OgFsh4fAlwGkM2cqX79y7TxP5Tz5GvapyY0LIDYBQ==", + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@ibm-cloud/openapi-ruleset/-/openapi-ruleset-0.37.3.tgz", + "integrity": "sha512-saQM/1YTfhW7ou/mtmC4BMUhW/UM54aD47KBZucjrZLvAelzt8Lykm5zeN59Cu4cs/LBDEcvJfyZzDpPhdcVjQ==", "dev": true, "requires": { - "@stoplight/spectral-formats": "1.0.2", - "@stoplight/spectral-functions": "1.5.1", - "@stoplight/spectral-rulesets": "1.4.3" + "@stoplight/spectral-formats": "^1.1.0", + "@stoplight/spectral-functions": "^1.6.1", + "@stoplight/spectral-rulesets": "^1.6.0", + "lodash": "^4.17.21" } }, "@istanbuljs/load-nyc-config": { @@ -51666,16 +51004,16 @@ "dev": true }, "@jsep-plugin/regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.2.tgz", - "integrity": "sha512-Nn/Bcaww8zOebMDqNmGlhAWPWhIr/8S8lGIgaB/fSqev5xaO5uKy5i4qvTh63GpR+VzKqimgxDdcxdcRuCJXSw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", + "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", "dev": true, "requires": {} }, "@jsep-plugin/ternary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.2.tgz", - "integrity": "sha512-gXguJc09uCrqWt1MD7L1+ChO32g4UH4BYGpHPoQRLhyU7pAPPRA7cvKbyjoqhnUlLutiXvLzB5hVVawPKax8jw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.3.tgz", + "integrity": "sha512-qtLGzCNzPVJ3kdH6/zoLWDPjauHIKiLSBAR71Wa0+PWvGA8wODUQvRgxtpUA5YqAYL3CQ8S4qXhd/9WuWTZirg==", "dev": true, "requires": {} }, @@ -51895,6 +51233,166 @@ } } }, + "@orval/angular": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/angular/-/angular-6.11.0-alpha.10.tgz", + "integrity": "sha512-6CcB0zvdPOEGECcWD2cmGLguYiqOWXMyTy2+9Nf21KhpszCbcfR2TVJe5rZVtX0J2uR2lzI58Uhx4cAvNi+59w==", + "dev": true, + "requires": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "@orval/axios": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/axios/-/axios-6.11.0-alpha.10.tgz", + "integrity": "sha512-9h1anI1l+n2WHPWJ4qSRUeGY/i3tDWr6GCv8h3QBjoQ52JjxoLP0YAQ0mLPmh/0yDPs0tkpKTwAXx1a76SgKOA==", + "dev": true, + "requires": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "@orval/core": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/core/-/core-6.11.0-alpha.10.tgz", + "integrity": "sha512-t9Z7/gxvBPnIFx7ywpqDp6K+ySrMXtW9NagcleeARcSCrsjqCfTTFleCCS27GBBy8J8CvnrladR2t1bY3XfrEQ==", + "dev": true, + "requires": { + "@apidevtools/swagger-parser": "^10.1.0", + "acorn": "^8.8.0", + "ajv": "^8.11.0", + "chalk": "^4.1.2", + "compare-versions": "^4.1.3", + "debug": "^4.3.4", + "esbuild": "^0.15.3", + "esutils": "2.0.3", + "fs-extra": "^10.1.0", + "globby": "11.1.0", + "ibm-openapi-validator": "^0.88.0", + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0", + "lodash.omit": "^4.5.0", + "lodash.uniq": "^4.5.0", + "lodash.uniqby": "^4.7.0", + "lodash.uniqwith": "^4.5.0", + "micromatch": "^4.0.5", + "openapi3-ts": "^3.0.0", + "swagger2openapi": "^7.0.8", + "url": "^0.11.0", + "validator": "^13.7.0" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@orval/msw": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/msw/-/msw-6.11.0-alpha.10.tgz", + "integrity": "sha512-CDxouHl3J6/SpFWDbRhIxhXrQX+gNDDe6ekLDWZkYbD/kJln1TenjLCke1oPzBMToWPsYUjDf/2veQe8jwlwbg==", + "dev": true, + "requires": { + "@orval/core": "6.11.0-alpha.10", + "cuid": "^2.1.8", + "lodash.get": "^4.4.2", + "lodash.omit": "^4.5.0", + "openapi3-ts": "^3.0.0" + } + }, + "@orval/query": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/query/-/query-6.11.0-alpha.10.tgz", + "integrity": "sha512-O0uWGVTkwEn+uo96Dg7OianKJcXNwCP7Jrx38Ajv/Stpl/PGJT4Y2C56AMCdSyxWN9Pg+DKE8lCcBlOXUTeYdA==", + "dev": true, + "requires": { + "@orval/core": "6.11.0-alpha.10", + "lodash.omitby": "^4.6.0" + } + }, + "@orval/swr": { + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/@orval/swr/-/swr-6.11.0-alpha.10.tgz", + "integrity": "sha512-+d5xlNPspMshjxgIa0Zqj+lUkFhEnl63tLtmLIi1z0xmy01MhQvGujkdbAUgCGEtj5/9UkhTB2OfiiVRpN/cIQ==", + "dev": true, + "requires": { + "@orval/core": "6.11.0-alpha.10" + } + }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -51960,9 +51458,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", - "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -51972,25 +51470,6 @@ "is-reference": "^1.2.1", "magic-string": "^0.25.7", "resolve": "^1.17.0" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } } }, "@rollup/plugin-node-resolve": { @@ -52012,17 +51491,6 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -52143,12 +51611,6 @@ "tslib": "^1.9.3" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -52168,13 +51630,14 @@ } }, "@stoplight/json": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.0.tgz", - "integrity": "sha512-WW0z2bb0D4t8FTl+zNTCu46J8lEOsrUhBPgwEYQ3Ri2Y0MiRE4U1/9ZV8Ki+pIJznZgY9i42bbFwOBxyZn5/6w==", + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.20.1.tgz", + "integrity": "sha512-FXfud+uWgIj1xv6nUO9WnmgmnVikaxJcbtR4XQt4C42n5c2qua3U05Z/3B57hP5TJRSj+tpn9ID6/bFeyYYlEg==", "dev": true, "requires": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" @@ -52199,45 +51662,35 @@ } }, "@stoplight/json-ref-resolver": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.3.tgz", - "integrity": "sha512-SgoKXwVnlpIZUyAFX4W79eeuTWvXmNlMfICZixL16GZXnkjcW+uZnfmAU0ZIjcnaTgaI4mjfxn8LAP2KR6Cr0A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.4.tgz", + "integrity": "sha512-842JVmMsi++qpDuIX+JpQvK7YY8FXEZZb+/z4xuRfStOAVEryJT/tbgGOWxniSdxEl9Eni5D/I2afMyy6BuiNw==", "dev": true, "requires": { "@stoplight/json": "^3.17.0", "@stoplight/path": "^1.3.2", - "@stoplight/types": "^12.3.0", - "@types/urijs": "^1.19.16", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", "dependency-graph": "~0.11.0", "fast-memoize": "^2.5.2", "immer": "^9.0.6", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", + "lodash": "^4.17.21", "tslib": "^2.3.1", - "urijs": "^1.19.6" + "urijs": "^1.19.11" }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, - "@stoplight/lifecycle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@stoplight/lifecycle/-/lifecycle-2.3.2.tgz", - "integrity": "sha512-v0u8p27FA/eg04b4z6QXw4s0NeeFcRzyvseBW0+k/q4jtpg7EhVCqy42EbbbU43NTNDpIeQ81OcvkFz+6CYshw==", - "dev": true, - "requires": { - "wolfy87-eventemitter": "~5.2.8" - } - }, "@stoplight/ordered-object-literal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.2.tgz", - "integrity": "sha512-0ZMS/9sNU3kVo/6RF3eAv7MK9DY8WLjiVJB/tVyfF2lhr2R4kqh534jZ0PlrFB9CRXrdndzn1DbX6ihKZXft2w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.4.tgz", + "integrity": "sha512-OF8uib1jjDs5/cCU+iOVy+GJjU3X7vk/qJIkIJFqwmlJKrrtijFmqwbu8XToXrwTYLQTP+Hebws5gtZEmk9jag==", "dev": true }, "@stoplight/path": { @@ -52247,22 +51700,21 @@ "dev": true }, "@stoplight/spectral-cli": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.2.1.tgz", - "integrity": "sha512-Omi/vFk8u+UyM36HbFIuH33oPpOUhDF26xD1N0HoefJstMDUot+L0xVGJWslbVYubuJ7U+JLVLUFLKFU39NfcQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.6.0.tgz", + "integrity": "sha512-z46fnrvraaWMio8Y9RYYkLO+XdmtxOWpy5qNJF3CsmWua0FZ4iOTryb5Cm3GkB0wEtqxNUCBUHvoo4hS6Noyqg==", "dev": true, "requires": { - "@rollup/plugin-commonjs": "^20.0.0", - "@stoplight/json": "3.17.0", + "@stoplight/json": "~3.20.1", "@stoplight/path": "1.3.2", - "@stoplight/spectral-core": "^1.5.1", - "@stoplight/spectral-parsers": "^1.0.1", - "@stoplight/spectral-ref-resolver": "1.0.1", - "@stoplight/spectral-ruleset-bundler": "^1.0.0", - "@stoplight/spectral-ruleset-migrator": "^1.5.0", + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-parsers": "^1.0.2", + "@stoplight/spectral-ref-resolver": "1.0.2", + "@stoplight/spectral-ruleset-bundler": "^1.4.0", + "@stoplight/spectral-ruleset-migrator": "^1.9.0", "@stoplight/spectral-rulesets": ">=1", - "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "12.3.0", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", "chalk": "4.1.2", "cliui": "7.0.4", "eol": "0.9.1", @@ -52270,6 +51722,7 @@ "lodash": "~4.17.21", "pony-cause": "^1.0.0", "proxy-agent": "5.0.0", + "stacktracey": "^2.1.7", "strip-ansi": "6.0", "text-table": "0.2", "tslib": "^2.3.0", @@ -52339,9 +51792,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "y18n": { @@ -52366,68 +51819,66 @@ } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "@stoplight/spectral-core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.10.1.tgz", - "integrity": "sha512-eJ6KGWMzzvTfcunoDSEHddRB8is34u+h29wnPzs97V5gFzADkLV3eMPkjFnDmBaiD6kuaRvWV3ZLPbJtpuNg8w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.16.0.tgz", + "integrity": "sha512-W/NG+wV2UffwLExboqEa04/JbjGhiSTOl7GghLWYP4NKxZGaO6karP6fIxRBOnm34n1qyoZv9thsjSe92MWcDw==", "dev": true, "requires": { - "@stoplight/better-ajv-errors": "1.0.1", - "@stoplight/json": "~3.17.1", - "@stoplight/lifecycle": "2.3.2", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.20.1", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.0", "@stoplight/spectral-runtime": "^1.0.0", - "@stoplight/types": "12.3.0", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", "ajv": "^8.6.0", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.0", - "blueimp-md5": "2.18.0", - "json-schema": "0.4.0", - "jsonpath-plus": "6.0.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "7.1.0", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", - "minimatch": "^3.0.5", - "nimma": "0.1.7", + "minimatch": "3.1.2", + "nimma": "0.2.2", + "pony-cause": "^1.0.0", "simple-eval": "1.0.0", "tslib": "^2.3.0" }, "dependencies": { "@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "requires": { "jsonpointer": "^5.0.0", "leven": "^3.1.0" } }, - "@stoplight/json": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.2.tgz", - "integrity": "sha512-NwIVzanXRUy291J5BMkncCZRMG1Lx+aq+VidGQgfkJjgo8vh1Y/PSAz7fSU8gVGSZBCcqmOkMI7R4zw7DlfTwA==", + "@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", "dev": true, "requires": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" } }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -52450,17 +51901,17 @@ "dev": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-formats": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.0.2.tgz", - "integrity": "sha512-jMIlMTSCJzFKq3kXnHv+YC0TTnwli/DuZY4JxObyaBwdiG1LnSAJLL7R857PpJpQ1uoiZULov8clxudSMeKL+Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.4.0.tgz", + "integrity": "sha512-j9VQukDzgqDSi26rK9LqsbXrqtkeIsPSPgEf5/sxRsmeF2bwWUhSjYXgYin4flSZ7owFZjZWQ3o0Qq3iApi2JQ==", "dev": true, "requires": { "@stoplight/json": "^3.17.0", @@ -52470,25 +51921,24 @@ }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-functions": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.5.1.tgz", - "integrity": "sha512-KHMprX4OwjgVtzUulVPfqkZTNCAP4JbZqTQ5/UTCfrQ1nO4vcr+3CJgU74ggSP6rH3UuJIIFVZN+9wU7HP1bEA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.7.1.tgz", + "integrity": "sha512-UWeUrxc1pu45ZNYKtK3OloMpkUNTPqwpmjbGUn4oEnbqrLEYu/B2oOg66EtGcadOBEsdOb7f5vaPlhUNNrpEpQ==", "dev": true, "requires": { - "@stoplight/better-ajv-errors": "1.0.1", - "@stoplight/json": "~3.17.1", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", "@stoplight/spectral-core": "^1.7.0", "@stoplight/spectral-formats": "^1.0.0", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "12.3.0", "ajv": "^8.6.3", "ajv-draft-04": "~1.0.0", "ajv-errors": "~3.0.0", @@ -52498,32 +51948,19 @@ }, "dependencies": { "@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "requires": { "jsonpointer": "^5.0.0", "leven": "^3.1.0" } }, - "@stoplight/json": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.17.2.tgz", - "integrity": "sha512-NwIVzanXRUy291J5BMkncCZRMG1Lx+aq+VidGQgfkJjgo8vh1Y/PSAz7fSU8gVGSZBCcqmOkMI7R4zw7DlfTwA==", - "dev": true, - "requires": { - "@stoplight/ordered-object-literal": "^1.0.2", - "@stoplight/types": "^12.3.0", - "jsonc-parser": "~2.2.1", - "lodash": "^4.17.21", - "safe-stable-stringify": "^1.1" - } - }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -52553,131 +51990,99 @@ "dev": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-parsers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.1.tgz", - "integrity": "sha512-JGKlrTxhjUzIGo2FOCf8Qp0WKTWXedoRNPovqYPE8pAp08epqU8DzHwl/i46BGH5yfTmouKMZgBN/PV2+Cr5jw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.2.tgz", + "integrity": "sha512-ZQXknJ+BM5Re4Opj4cgVlHgG2qyOk/wznKJq3Vf1qsBEg2CNzN0pJmSB0deRqW0kArqm44qpb8c+cz3F2rgMtw==", "dev": true, "requires": { - "@stoplight/json": "3.17.0", - "@stoplight/types": "12.3.0", - "@stoplight/yaml": "4.2.2", + "@stoplight/json": "~3.20.1", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", "tslib": "^2.3.1" }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-ref-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.1.tgz", - "integrity": "sha512-0tY7nTOccvTsa3c4QbSWfJ8wGfPO1RXvmKnmBjuyLfoTMNuhkHPII9gKhCjygsshzsBLxs2IyRHZYhWYVnEbCA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.2.tgz", + "integrity": "sha512-ah6NIB/O1EdEaEu89So3LmtbKRXPVnSElgQ7oBRE9S4/VOedSqyXn+qqMd40tGnO2CsKgZaFUYXdSEHOshpHYw==", "dev": true, "requires": { "@stoplight/json-ref-readers": "1.2.2", - "@stoplight/json-ref-resolver": "3.1.3", - "@stoplight/spectral-runtime": "^1.0.0", + "@stoplight/json-ref-resolver": "~3.1.4", + "@stoplight/spectral-runtime": "^1.1.2", "dependency-graph": "0.11.0", "tslib": "^2.3.1" }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-ruleset-bundler": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.2.1.tgz", - "integrity": "sha512-baQDeu6YychKWFXmed4Pw6pDJIJimtqfCRHZ5CzUpp4j6UHTwozAA+am1FiKdmwlVYpBKS4g5ORu0s/aVQe+8A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.5.0.tgz", + "integrity": "sha512-I1ZbhnJtRTi0lG6oXA1r8J6KLxoZKkNB3aSdrNJJTHoo/AccMSMhV4ey8zbLsYNsJ/9ywR5ttkBAbyGuo3Jtxg==", "dev": true, "requires": { - "@rollup/plugin-commonjs": "^21.0.1", + "@rollup/plugin-commonjs": "~22.0.2", "@stoplight/path": "1.3.2", "@stoplight/spectral-core": ">=1", "@stoplight/spectral-formats": ">=1", "@stoplight/spectral-functions": ">=1", "@stoplight/spectral-parsers": ">=1", "@stoplight/spectral-ref-resolver": ">=1", - "@stoplight/spectral-ruleset-migrator": "^1.5.2", + "@stoplight/spectral-ruleset-migrator": "^1.7.4", "@stoplight/spectral-rulesets": ">=1", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "^12.3.0", + "@stoplight/types": "^13.6.0", "@types/node": "*", "pony-cause": "1.1.1", - "rollup": "~2.67.0", + "rollup": "~2.79.0", "tslib": "^2.3.1", "validate-npm-package-name": "3.0.0" }, "dependencies": { - "@rollup/plugin-commonjs": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", - "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-ruleset-migrator": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.7.3.tgz", - "integrity": "sha512-1TlJgNxIqlcafzrH6gsGpQQcVkFhndib5piMNXVg9xshJ42l2yC6A0AUAixUC+ODJ5098DR7SjIYBVKk+CTQSw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.9.1.tgz", + "integrity": "sha512-TiH7UZIuHX+yb6EsWA9Z2ou455Wtki3z7SCkVRgd7WdzkD7O13R8ywqKoCUJ44UP7iuo1Ejnog18Rw4qJJE/fg==", "dev": true, "requires": { - "@stoplight/json": "~3.17.0", - "@stoplight/ordered-object-literal": "1.0.2", + "@stoplight/json": "~3.20.1", + "@stoplight/ordered-object-literal": "~1.0.4", "@stoplight/path": "1.3.2", "@stoplight/spectral-functions": "^1.0.0", "@stoplight/spectral-runtime": "^1.1.0", - "@stoplight/types": "^12.3.0", - "@stoplight/yaml": "4.2.2", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", "@types/node": "*", "ajv": "^8.6.0", "ast-types": "0.14.2", @@ -52688,9 +52093,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -52706,26 +52111,27 @@ "dev": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/spectral-rulesets": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.4.3.tgz", - "integrity": "sha512-kiUKcPvvvgg0U9p1KtsaRglW4xKCqXwTu2lL6Ci6elwsqK7P7CQAxJbcbhl30tqJ+m2oXTLTWJhZFa/xGk01FA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.14.1.tgz", + "integrity": "sha512-tn6a5fYPFDwEY+/YyK/hcq2gcR5nSIBt7l+JGELb/2RdTzD5ikj2mfl2ua3uxbqOZytftFoOX5ewGZ0qQNrudw==", "dev": true, "requires": { - "@stoplight/better-ajv-errors": "1.0.1", + "@asyncapi/specs": "^3.2.0", + "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.8.1", - "@stoplight/spectral-formats": "^1.0.2", + "@stoplight/spectral-formats": "^1.4.0", "@stoplight/spectral-functions": "^1.5.1", "@stoplight/spectral-runtime": "^1.1.1", - "@stoplight/types": "^12.3.0", + "@stoplight/types": "^13.6.0", "@types/json-schema": "^7.0.7", "ajv": "^8.8.2", "ajv-formats": "~2.1.0", @@ -52735,9 +52141,9 @@ }, "dependencies": { "@stoplight/better-ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.1.tgz", - "integrity": "sha512-rgxT+ZMeZbYRiOLNk6Oy6e/Ig1iQKo0IL8v/Y9E/0FewzgtkGs/p5dMeUpIFZXWj3RZaEPmfL9yh0oUEmNXZjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", "dev": true, "requires": { "jsonpointer": "^5.0.0", @@ -52745,9 +52151,9 @@ } }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -52763,9 +52169,9 @@ "dev": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -52785,18 +52191,28 @@ "tslib": "^2.3.1" }, "dependencies": { + "@stoplight/types": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.5.0.tgz", + "integrity": "sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + } + }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@stoplight/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.3.0.tgz", - "integrity": "sha512-hgzUR1z5BlYvIzUeFK5pjs5JXSvEutA9Pww31+dVicBlunsG1iXopDx/cvfBY7rHOrgtZDuvyeK4seqkwAZ6Cg==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.8.0.tgz", + "integrity": "sha512-5glKswz7y9aACh+a+JegID+4xX//4TsIdv7iPl29hWnOoWrnlPbg3Gjc4nYUXXgMSaSlSsA15JU/0+rE89fR4A==", "dev": true, "requires": { "@types/json-schema": "^7.0.4", @@ -52804,21 +52220,21 @@ } }, "@stoplight/yaml": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.2.tgz", - "integrity": "sha512-N086FU8pmSpjc5TvMBjmlTniZVh3OXzmEh6SYljSLiuv6aMxgjyjf13YrAlUqgu0b4b6pQ5zmkjrfo9i0SiLsw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", + "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", "dev": true, "requires": { "@stoplight/ordered-object-literal": "^1.0.1", - "@stoplight/types": "^12.0.0", + "@stoplight/types": "^13.0.0", "@stoplight/yaml-ast-parser": "0.0.48", "tslib": "^2.2.0" }, "dependencies": { "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -53410,7 +52826,7 @@ "@babel/code-frame": "^7.5.5", "chalk": "^2.4.1", "micromatch": "^3.1.10", - "minimatch": "^3.0.5", + "minimatch": "^3.0.4", "semver": "^5.6.0", "tapable": "^1.0.0", "worker-rpc": "^0.1.0" @@ -54767,16 +54183,6 @@ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -55455,16 +54861,6 @@ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -55764,16 +55160,6 @@ "universalify": "^2.0.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -56196,16 +55582,6 @@ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -56789,16 +56165,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -57438,16 +56804,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -57713,16 +57069,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -57983,15 +57329,19 @@ } } }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, + "@tanstack/react-table": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.7.0.tgz", + "integrity": "sha512-VJ+9rsymDLaSU35rWOfX0bwNXnpW1i+T14wi+sHx8lxwAsfg6IY1Yw7FPfGADvUFP5eQn2t4nlohAJd+IoEj/Q==", "requires": { - "defer-to-connect": "^1.0.1" + "@tanstack/table-core": "8.7.0" } }, + "@tanstack/table-core": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.7.0.tgz", + "integrity": "sha512-DRiRbOAmDHapzUBd4/C4Yy+FTug4fdGp5sdZWWfCq4wxRoaXQraQgbzmK23a3QcbwLFtLeNezPkZrqbJWuX+VA==" + }, "@testing-library/dom": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.1.tgz", @@ -58334,6 +57684,15 @@ "@types/ms": "*" } }, + "@types/es-aggregate-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz", + "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -58641,6 +58000,18 @@ "csstype": "^3.0.2" } }, + "@types/react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==", + "dev": true, + "requires": { + "@popperjs/core": "^2.9.2", + "@types/react": "*", + "date-fns": "^2.0.1", + "react-popper": "^2.2.5" + } + }, "@types/react-dom": { "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", @@ -59764,6 +59135,12 @@ "string-width": "^4.1.0" } }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -59955,6 +59332,15 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, + "as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "requires": { + "printable-characters": "^1.0.42" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -60423,16 +59809,6 @@ "path-type": "^4.0.0", "yaml": "^1.10.0" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -60475,17 +59851,6 @@ "resolve": "^1.14.2", "semver": "^6.1.2" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -60523,17 +59888,6 @@ "resolve": "^1.14.2", "semver": "^6.1.2" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -60766,41 +60120,12 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "blueimp-md5": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", - "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", - "dev": true - }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -61286,44 +60611,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -61477,12 +60764,6 @@ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "check-types": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", @@ -61607,12 +60888,6 @@ "restore-cursor": "^3.1.0" } }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true - }, "cli-table3": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", @@ -61667,12 +60942,6 @@ } } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -61686,7 +60955,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-deep": { @@ -61717,15 +60986,6 @@ } } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "clsx": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", @@ -61840,6 +61100,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz", + "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -61930,20 +61196,6 @@ } } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -62765,6 +62017,11 @@ "resolved": "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-3.1.0.tgz", "integrity": "sha1-H80D29UEudvuK5B4yFpfHH08wtM=" }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, "dayjs": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", @@ -62831,15 +62088,6 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -62860,12 +62108,6 @@ "regexp.prototype.flags": "^1.2.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -62890,20 +62132,14 @@ } }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -63004,7 +62240,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -63028,7 +62264,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "source-map": { @@ -63039,15 +62275,15 @@ "optional": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -63408,23 +62644,6 @@ } } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -63443,12 +62662,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -63624,6 +62837,15 @@ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -63661,36 +62883,52 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" } }, + "es-aggregate-error": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz", + "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "function-bind": "^1.1.1", + "functions-have-names": "^1.2.3", + "get-intrinsic": "^1.1.3", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0" + } + }, "es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", @@ -63747,7 +62985,7 @@ "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", "dev": true }, "es6-shim": { @@ -63757,44 +62995,180 @@ "dev": true }, "esbuild": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", - "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.39", - "esbuild-android-arm64": "0.14.39", - "esbuild-darwin-64": "0.14.39", - "esbuild-darwin-arm64": "0.14.39", - "esbuild-freebsd-64": "0.14.39", - "esbuild-freebsd-arm64": "0.14.39", - "esbuild-linux-32": "0.14.39", - "esbuild-linux-64": "0.14.39", - "esbuild-linux-arm": "0.14.39", - "esbuild-linux-arm64": "0.14.39", - "esbuild-linux-mips64le": "0.14.39", - "esbuild-linux-ppc64le": "0.14.39", - "esbuild-linux-riscv64": "0.14.39", - "esbuild-linux-s390x": "0.14.39", - "esbuild-netbsd-64": "0.14.39", - "esbuild-openbsd-64": "0.14.39", - "esbuild-sunos-64": "0.14.39", - "esbuild-windows-32": "0.14.39", - "esbuild-windows-64": "0.14.39", - "esbuild-windows-arm64": "0.14.39" - } + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "dev": true, + "optional": true }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -64077,17 +63451,6 @@ "requires": { "ms": "^2.1.1" } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -64225,17 +63588,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } } } }, @@ -64473,6 +63825,12 @@ "c8": "^7.6.0" } }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -64797,28 +64155,6 @@ } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -65003,15 +64339,6 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -65072,35 +64399,6 @@ "requires": { "fs-extra": "^10.1.0", "ramda": "^0.28.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "file-uri-to-path": { @@ -65116,7 +64414,7 @@ "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, "requires": { - "minimatch": "^3.0.5" + "minimatch": "^5.0.1" }, "dependencies": { "brace-expansion": { @@ -65407,16 +64705,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -65589,14 +64877,22 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "fs-minipass": { @@ -65666,7 +64962,7 @@ "ftp": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "requires": { "readable-stream": "1.1.x", @@ -65676,13 +64972,13 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -65694,7 +64990,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } @@ -65756,14 +65052,14 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-node-dimensions": { @@ -65783,6 +65079,30 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, + "get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -65825,6 +65145,26 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } } } }, @@ -65885,23 +65225,6 @@ "process": "^0.11.10" } }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - }, - "dependencies": { - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - } - } - }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -65976,36 +65299,6 @@ "minimist": "^1.2.5" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -66181,12 +65474,6 @@ } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -66534,12 +65821,6 @@ } } }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -66641,15 +65922,15 @@ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "ibm-openapi-validator": { - "version": "0.57.4", - "resolved": "https://registry.npmjs.org/ibm-openapi-validator/-/ibm-openapi-validator-0.57.4.tgz", - "integrity": "sha512-LMYdpg1BUIlGJ14W8d6Ltr3uyLtpXblqHKqAuufIE6vWVcd20d4I631DMUp/man6KwdUvFnQwE5cx+Q6AGQ9gQ==", + "version": "0.88.3", + "resolved": "https://registry.npmjs.org/ibm-openapi-validator/-/ibm-openapi-validator-0.88.3.tgz", + "integrity": "sha512-WHkkO5TXWSS12P8VybB04Stq+yFloMlHy2aVzcLAZo425PYIVMuIWhsH7zN9vwcZcOB/qAnWQ4T3PKn6wrcT+Q==", "dev": true, "requires": { - "@ibm-cloud/openapi-ruleset": "0.6.2", - "@stoplight/spectral-cli": "6.2.1", - "@stoplight/spectral-core": "1.10.1", - "@stoplight/spectral-parsers": "1.0.1", + "@ibm-cloud/openapi-ruleset": "0.37.3", + "@stoplight/spectral-cli": "^6.4.2", + "@stoplight/spectral-core": "^1.12.4", + "@stoplight/spectral-parsers": "^1.0.1", "chalk": "^4.1.1", "commander": "^2.20.3", "deepmerge": "^2.2.1", @@ -66664,7 +65945,6 @@ "pad": "^2.3.0", "require-all": "^3.0.0", "semver": "^5.7.1", - "update-notifier": "^4.1.3", "validator": "^13.7.0", "yaml-js": "^0.2.3" }, @@ -66765,7 +66045,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "semver": { @@ -66860,12 +66140,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -66927,80 +66201,6 @@ "css-in-js-utils": "^2.0.0" } }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -67151,9 +66351,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -67166,9 +66366,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -67289,30 +66489,6 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - } - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -67331,12 +66507,6 @@ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -67466,12 +66636,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -67521,12 +66685,6 @@ "is-docker": "^2.0.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -67654,7 +66812,7 @@ "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "dependencies": { "ansi-styles": { @@ -69134,17 +68292,6 @@ } } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -70363,9 +69510,9 @@ } }, "jsep": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.6.tgz", - "integrity": "sha512-o7fP1eZVROIChADx7HKiwGRVI0tUqgUUGhaok6DP7cMxpDeparuooREDBDeNk2G5KIB49MBSkRYsCOu4PmZ+1w==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.7.tgz", + "integrity": "sha512-NFbZTr1t13fPKw53swmZFKwBkEDWDnno7uLJk+a+Rw9tGDTkGgnGdZJ8A/o3gR1+XaAXmSsbpfIBIBgqRBZWDA==", "dev": true }, "jsesc": { @@ -70373,12 +69520,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-dup-key-validator": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/json-dup-key-validator/-/json-dup-key-validator-1.0.3.tgz", @@ -70483,18 +69624,27 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "jsonpath-plus": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-6.0.1.tgz", - "integrity": "sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.1.0.tgz", + "integrity": "sha512-gTaNRsPWO/K2KY6MrqaUFClF9kmuM6MFH5Dhg1VYDODgFbByw1yb7xu3hrViE/sz+dGOeMWgCzwUwQtAnCTE9g==", "dev": true }, "jsonpointer": { @@ -70560,15 +69710,6 @@ "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", "dev": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -70608,15 +69749,6 @@ "language-subtag-registry": "~0.3.2" } }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "launchdarkly-js-client-sdk": { "version": "2.22.1", "resolved": "https://registry.npmjs.org/launchdarkly-js-client-sdk/-/launchdarkly-js-client-sdk-2.22.1.tgz", @@ -70930,7 +70062,13 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", "dev": true }, "lodash.memoize": { @@ -70948,19 +70086,13 @@ "lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", "dev": true }, "lodash.omitby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", - "integrity": "sha1-XBX/R1StVVAWtTwEExHo8HkgR5E=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==", "dev": true }, "lodash.sortby": { @@ -70977,7 +70109,7 @@ "lodash.topath": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", - "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", "dev": true }, "lodash.truncate": { @@ -70995,76 +70127,15 @@ "lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true }, "lodash.uniqwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", - "integrity": "sha1-egy/ZfQ7WShiWp1NDcVLGMrcfvM=", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==", "dev": true }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -71171,12 +70242,6 @@ } } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lowlight": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", @@ -72549,12 +71614,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", @@ -72832,12 +71891,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", @@ -72955,9 +72008,9 @@ "dev": true }, "nimma": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.1.7.tgz", - "integrity": "sha512-0FIra4ogMHhOjn4fd2UiBuuaxM1nHzwhCEPvaFmCbwsR6qzHyJUG3dLW3tAIQji42wIij8OA/HB0+Gldg3OX4A==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.2.tgz", + "integrity": "sha512-V52MLl7BU+tH2Np9tDrIXK8bql3MVUadnMIl/0/oZSGC9keuro0O9UUv9QKp0aMvtN8HRew4G7byY7H4eWsxaQ==", "dev": true, "requires": { "@jsep-plugin/regex": "^1.0.1", @@ -72966,6 +72019,15 @@ "jsep": "^1.2.0", "jsonpath-plus": "^6.0.1", "lodash.topath": "^4.5.2" + }, + "dependencies": { + "jsonpath-plus": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-6.0.1.tgz", + "integrity": "sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==", + "dev": true, + "optional": true + } } }, "no-case": { @@ -72992,7 +72054,7 @@ "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", "dev": true, "requires": { - "minimatch": "^3.0.5" + "minimatch": "^3.0.2" } }, "node-fetch": { @@ -73105,7 +72167,7 @@ "node-readfiles": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", "dev": true, "requires": { "es6-promise": "^3.2.1" @@ -73244,6 +72306,17 @@ "yargs": "^17.0.1" }, "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -73251,24 +72324,24 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } @@ -73338,9 +72411,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "object-is": { @@ -73520,12 +72593,20 @@ "peer": true }, "openapi3-ts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", - "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-3.1.2.tgz", + "integrity": "sha512-S8fijNOqe/ut0kEDAwHZnI7sVYqb8Q3XnISmSyXmK76jgrcf4ableI75KTY1qdksd9EI/t39Vi5M4VYKrkNKfQ==", "dev": true, "requires": { - "yaml": "^1.10.2" + "yaml": "^2.1.3" + }, + "dependencies": { + "yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==", + "dev": true + } } }, "optionator": { @@ -73542,116 +72623,44 @@ "word-wrap": "^1.2.3" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "orval": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/orval/-/orval-6.8.1.tgz", - "integrity": "sha512-E8ZsGB1BsulDqMxdYvni3lc63mUpkFsLZbqiZRKTWs3sBtNz7THSkUEkCYhRW6qyXR8TM+RHCYeYGUYHlWuCmw==", - "dev": true, - "requires": { - "@apidevtools/swagger-parser": "^10.0.3", - "acorn": "^8.7.0", + "version": "6.11.0-alpha.10", + "resolved": "https://registry.npmjs.org/orval/-/orval-6.11.0-alpha.10.tgz", + "integrity": "sha512-PBgt9Wgs2jLSh0XYPza1hogZpkbA2Nii6NNbcX2aTN1Q8OEEmEasVTubWq7xlm8LBpElWyLcP3aja8O6t+wI3Q==", + "dev": true, + "requires": { + "@apidevtools/swagger-parser": "^10.1.0", + "@orval/angular": "6.11.0-alpha.10", + "@orval/axios": "6.11.0-alpha.10", + "@orval/core": "6.11.0-alpha.10", + "@orval/msw": "6.11.0-alpha.10", + "@orval/query": "6.11.0-alpha.10", + "@orval/swr": "6.11.0-alpha.10", + "ajv": "^8.11.0", "cac": "^6.7.12", "chalk": "^4.1.2", "chokidar": "^3.5.3", - "compare-versions": "^4.1.3", - "cuid": "^2.1.8", - "debug": "^4.3.3", - "esbuild": "^0.14.25", - "esutils": "2.0.3", + "enquirer": "^2.3.6", "execa": "^5.1.1", "find-up": "5.0.0", - "fs-extra": "^10.0.1", - "globby": "11.0.4", - "ibm-openapi-validator": "^0.57.4", - "inquirer": "^8.2.0", - "lodash.get": "^4.4.2", - "lodash.omit": "^4.5.0", - "lodash.omitby": "^4.6.0", + "fs-extra": "^10.1.0", "lodash.uniq": "^4.5.0", - "lodash.uniqby": "^4.7.0", - "lodash.uniqwith": "^4.5.0", - "micromatch": "^4.0.4", - "openapi3-ts": "^2.0.2", - "swagger2openapi": "^7.0.8", - "tsconfck": "^1.2.0", - "upath": "^2.0.1", - "url": "^0.11.0", - "validator": "^13.7.0" + "openapi3-ts": "^3.0.0", + "string-argv": "^0.3.1", + "tsconfck": "^2.0.1" }, "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } }, "ansi-styles": { "version": "4.3.0", @@ -73687,12 +72696,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "compare-versions": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.3.tgz", - "integrity": "sha512-WQfnbDcrYnGr55UwbxKiQKASnTtNnaAWVi8jZyy8NTpVAXWACSne8lMD1iaIo9AiU6mnuLvSVshCzewVuWxHUg==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -73703,46 +72706,17 @@ "path-exists": "^4.0.0" } }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "locate-path": { "version": "6.0.0", @@ -73779,18 +72753,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true } } }, @@ -73839,12 +72801,6 @@ } } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -73943,26 +72899,14 @@ } }, "pac-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", - "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "dev": true, "requires": { - "degenerator": "^3.0.1", + "degenerator": "^3.0.2", "ip": "^1.1.5", - "netmask": "^2.0.1" - } - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" + "netmask": "^2.0.2" } }, "pad": { @@ -74536,12 +73480,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "prettier": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", @@ -74604,6 +73542,12 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, + "printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, "prismjs": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", @@ -74861,15 +73805,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -75019,26 +73954,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, "react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -75071,6 +73986,19 @@ "spy-on-component": "^1.1.0" } }, + "react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-u69zXGHMpxAa4LeYR83vucQoUCJQ6m/WBsSxmUMu/M8ahTSVMMyiyQzauHgZA2NUr9y0FUgOAix71hGYUb6tvg==", + "requires": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.0", + "react-popper": "^2.2.5" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -75557,6 +74485,12 @@ "resize-observer-polyfill": "^1.5.0" } }, + "react-onclickoutside": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", + "integrity": "sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA==", + "requires": {} + }, "react-paginate": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.1.3.tgz", @@ -75565,6 +74499,30 @@ "prop-types": "^15.6.1" } }, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "dependencies": { + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "react-query": { "version": "3.39.1", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.1.tgz", @@ -76066,17 +75024,6 @@ "path-exists": "^4.0.0" } }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -76204,16 +75151,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -76914,17 +75851,6 @@ "strip-ansi": "^6.0.1" } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -77139,12 +76065,6 @@ "optional": true, "peer": true }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "webpack-dev-middleware": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", @@ -77628,7 +76548,7 @@ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dev": true, "requires": { - "minimatch": "^3.0.5" + "minimatch": "3.0.4" } }, "redent": { @@ -77777,24 +76697,6 @@ "unicode-match-property-value-ecmascript": "^2.0.0" } }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -78621,7 +77523,7 @@ "require-all": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz", - "integrity": "sha1-Rz1JcEvjEBFc4ST3c4Ox69hnExI=", + "integrity": "sha512-jPGN876lc5exWYrMcgZSd7U42P0PmVQzxnQB13fCSzmyGnqQWW4WUz5DosZ/qe24hz+5o9lSvW2epBNZ1xa6Fw==", "dev": true }, "require-directory": { @@ -78644,7 +77546,7 @@ "reserved": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", - "integrity": "sha1-cHsSRqMmn3Vdp8/Pmvb0mDvvEFw=", + "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", "dev": true }, "resize-observer-polyfill": { @@ -78653,12 +77555,13 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -78736,15 +77639,6 @@ "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -78792,9 +77686,9 @@ } }, "rollup": { - "version": "2.67.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.3.tgz", - "integrity": "sha512-G/x1vUwbGtP6O5ZM8/sWr8+p7YfZhI18pPqMRtMYMWSbHjKZ/ajHGiM+GWNTlWyOR0EHIdT8LHU+Z4ciIZ1oBw==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -78861,12 +77755,6 @@ "@babel/runtime": "^7.1.2" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -78922,6 +77810,17 @@ "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safe-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", @@ -79287,15 +78186,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -79579,7 +78469,7 @@ "should-format": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "dev": true, "requires": { "should-type": "^1.3.0", @@ -79589,7 +78479,7 @@ "should-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", "dev": true }, "should-type-adaptors": { @@ -79805,13 +78695,21 @@ } }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + } } }, "socks-proxy-agent": { @@ -80072,6 +78970,16 @@ "stacktrace-gps": "^3.0.4" } }, + "stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "requires": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, "state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", @@ -80953,6 +79861,17 @@ "yargs": "^17.0.1" }, "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -80960,24 +79879,24 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } @@ -81152,12 +80071,6 @@ } } }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -81270,7 +80183,7 @@ "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" } }, "text-encoding-utf-8": { @@ -81352,6 +80265,12 @@ "setimmediate": "^1.0.4" } }, + "timezone-mock": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/timezone-mock/-/timezone-mock-1.3.4.tgz", + "integrity": "sha512-B0CGmOgMPVUZqp63eU/FGcDaL68JjHeiVnCF24K99Kj6AwCV15BHWMLCv8ZKSUq5oyVHTtg7p1ajOWfXB+0wnQ==", + "dev": true + }, "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -81408,12 +80327,6 @@ } } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -81577,9 +80490,9 @@ "dev": true }, "tsconfck": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-1.2.2.tgz", - "integrity": "sha512-x5YpjOqjJnMs1EsJvQBQbrysrY32eGoZRRr5YvbN1hwlrXKc7jiphCOUrT7xbFdOWk8sh+EtMYbGPbTO8rDmcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.1.tgz", + "integrity": "sha512-/ipap2eecmVBmBlsQLBRbUmUNFwNJV/z2E+X0FPtHNjPwroMZQ7m39RMaCywlCulBheYXgMdUlWDd9rzxwMA0Q==", "dev": true, "requires": {} }, @@ -82020,106 +80933,6 @@ "picocolors": "^1.0.0" } }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -82206,15 +81019,6 @@ } } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -82354,7 +81158,7 @@ "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" @@ -82415,9 +81219,9 @@ "dev": true }, "vm2": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", - "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "version": "3.9.12", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.12.tgz", + "integrity": "sha512-OMmRsKh1gmdosFzuqmj6O43hqIStqXA24YbwjtUTO0TkOBP8yLNHLplbr4odnAzEcMnm9lt2r3R8kTivn8urMg==", "dev": true, "requires": { "acorn": "^8.7.0", @@ -82425,9 +81229,9 @@ }, "dependencies": { "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-walk": { @@ -82751,7 +81555,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" @@ -83147,12 +81951,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "wolfy87-eventemitter": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz", - "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw==", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -83279,16 +82077,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", @@ -83561,12 +82349,6 @@ "default-browser-id": "^1.0.4" } }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -83582,7 +82364,7 @@ "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", "dev": true }, "xtend": { diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index 12a923ac6285..5b133571d863 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -1,6 +1,6 @@ { "name": "airbyte-webapp", - "version": "0.40.23", + "version": "0.40.24", "private": true, "engines": { "node": ">=16.0.0" @@ -38,6 +38,7 @@ "@monaco-editor/react": "^4.4.5", "@sentry/react": "^6.19.6", "@sentry/tracing": "^6.19.6", + "@tanstack/react-table": "^8.7.0", "@types/segment-analytics": "^0.0.34", "classnames": "^2.3.1", "dayjs": "^1.11.3", @@ -51,6 +52,7 @@ "mdast": "^3.0.0", "query-string": "^6.13.1", "react": "^17.0.2", + "react-datepicker": "^4.8.0", "react-dom": "^17.0.2", "react-helmet-async": "^1.3.0", "react-intl": "^6.1.1", @@ -101,6 +103,7 @@ "@types/node": "^17.0.40", "@types/query-string": "^6.3.0", "@types/react": "^17.0.39", + "@types/react-datepicker": "^4.8.0", "@types/react-dom": "^17.0.11", "@types/react-helmet": "^6.1.5", "@types/react-lazylog": "^4.5.1", @@ -127,7 +130,7 @@ "lint-staged": "^12.3.7", "mini-css-extract-plugin": "^2.6.1", "node-fetch": "^2.6.7", - "orval": "^6.7.1", + "orval": "^6.11.0-alpha.10", "prettier": "^2.6.2", "react-scripts": "^5.0.1", "react-select-event": "^5.5.0", @@ -138,6 +141,7 @@ "stylelint-config-standard": "^26.0.0", "stylelint-config-standard-scss": "^5.0.0", "tar": "^6.1.11", + "timezone-mock": "^1.3.4", "tmpl": "^1.0.5", "ts-node": "^10.8.1", "typescript": "^4.7.3" diff --git a/airbyte-webapp/src/components/CreateConnection/CreateConnectionForm.tsx b/airbyte-webapp/src/components/CreateConnection/CreateConnectionForm.tsx index 30358beb2453..2b409aa27a7a 100644 --- a/airbyte-webapp/src/components/CreateConnection/CreateConnectionForm.tsx +++ b/airbyte-webapp/src/components/CreateConnection/CreateConnectionForm.tsx @@ -5,6 +5,7 @@ import { useNavigate } from "react-router-dom"; import LoadingSchema from "components/LoadingSchema"; import { DestinationRead, SourceRead } from "core/request/AirbyteClient"; +import { useIsAutoDetectSchemaChangesEnabled } from "hooks/connection/useIsAutoDetectSchemaChangesEnabled"; import { ConnectionFormServiceProvider, tidyConnectionFormValues, @@ -42,7 +43,7 @@ const CreateConnectionFormInner: React.FC = ({ schem const navigate = useNavigate(); const canEditDataGeographies = useFeature(FeatureItem.AllowChangeDataGeographies); const { mutateAsync: createConnection } = useCreateConnection(); - + const isAutoDetectSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); const { clearFormChange } = useFormChangeTrackerService(); const workspaceId = useCurrentWorkspaceId(); @@ -53,7 +54,13 @@ const CreateConnectionFormInner: React.FC = ({ schem const onFormSubmit = useCallback( async (formValues: FormikConnectionFormValues, formikHelpers: FormikHelpers) => { - const values = tidyConnectionFormValues(formValues, workspaceId, mode, allowSubOneHourCronExpressions); + const values = tidyConnectionFormValues( + formValues, + workspaceId, + mode, + allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled + ); try { const createdConnection = await createConnection({ @@ -86,6 +93,8 @@ const CreateConnectionFormInner: React.FC = ({ schem [ workspaceId, mode, + allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled, createConnection, connection.source, connection.destination, @@ -95,7 +104,6 @@ const CreateConnectionFormInner: React.FC = ({ schem afterSubmitConnection, navigate, setSubmitError, - allowSubOneHourCronExpressions, ] ); @@ -108,7 +116,11 @@ const CreateConnectionFormInner: React.FC = ({ schem

{({ values, isSubmitting, isValid, dirty }) => ( diff --git a/airbyte-webapp/src/components/CreateConnection/__snapshots__/CreateConnectionForm.test.tsx.snap b/airbyte-webapp/src/components/CreateConnection/__snapshots__/CreateConnectionForm.test.tsx.snap index c2406dfd0cd7..b7abe8343415 100644 --- a/airbyte-webapp/src/components/CreateConnection/__snapshots__/CreateConnectionForm.test.tsx.snap +++ b/airbyte-webapp/src/components/CreateConnection/__snapshots__/CreateConnectionForm.test.tsx.snap @@ -441,13 +441,13 @@ exports[`CreateConnectionForm should render 1`] = ` class="" > Source -
-
-
-
-
-
+ + +
Sync mode -
-
-
-
-
-
+ + +
Cursor field -
-
-
-
-
-
+ + +
Primary key -
-
-
-
-
-
+ + +
Destination -
-
-
-
-
-
+ + +
= ({ data, entity, onClickRow, onSync }) => { const navigate = useNavigate(); const query = useQuery<{ sortBy?: string; order?: SortOrderEnum }>(); - const isSchemaChangesFeatureEnabled = process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES === "true"; + const isSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); const allowSync = useFeature(FeatureItem.AllowSync); const sortBy = query.sortBy || "entityName"; @@ -163,7 +164,7 @@ const ConnectionTable: React.FC = ({ data, entity, onClickRow, onSync }) isSyncing={row.original.isSyncing} isManual={row.original.scheduleType === ConnectionScheduleType.manual} onSync={onSync} - hasBreakingChange={isSchemaChangesFeatureEnabled && row.original.schemaChange === SchemaChange.breaking} + hasBreakingChange={isSchemaChangesEnabled && row.original.schemaChange === SchemaChange.breaking} allowSync={allowSync} /> ), @@ -175,7 +176,7 @@ const ConnectionTable: React.FC = ({ data, entity, onClickRow, onSync }) Cell: ({ cell }: CellProps) => , }, ], - [sortBy, sortOrder, entity, onSortClick, onSync, allowSync, isSchemaChangesFeatureEnabled] + [sortBy, sortOrder, entity, onSortClick, onSync, allowSync, isSchemaChangesEnabled] ); return ; diff --git a/airbyte-webapp/src/components/EntityTable/components/StatusCell.tsx b/airbyte-webapp/src/components/EntityTable/components/StatusCell.tsx index 23aadba32aa8..2cfe091c1412 100644 --- a/airbyte-webapp/src/components/EntityTable/components/StatusCell.tsx +++ b/airbyte-webapp/src/components/EntityTable/components/StatusCell.tsx @@ -1,6 +1,7 @@ import React from "react"; import { SchemaChange } from "core/request/AirbyteClient"; +import { useIsAutoDetectSchemaChangesEnabled } from "hooks/connection/useIsAutoDetectSchemaChangesEnabled"; import { ChangesStatusIcon } from "./ChangesStatusIcon"; import styles from "./StatusCell.module.scss"; @@ -27,7 +28,7 @@ export const StatusCell: React.FC = ({ schemaChange, hasBreakingChange, }) => { - const isSchemaChangesFeatureEnabled = process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES === "true"; + const isSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); return (
@@ -40,7 +41,7 @@ export const StatusCell: React.FC = ({ hasBreakingChange={hasBreakingChange} allowSync={allowSync} /> - {isSchemaChangesFeatureEnabled && } + {isSchemaChangesEnabled && }
); }; diff --git a/airbyte-webapp/src/components/GroupControls/GroupControls.module.scss b/airbyte-webapp/src/components/GroupControls/GroupControls.module.scss index ee2ad793203b..7da33c2358ef 100644 --- a/airbyte-webapp/src/components/GroupControls/GroupControls.module.scss +++ b/airbyte-webapp/src/components/GroupControls/GroupControls.module.scss @@ -1,12 +1,11 @@ -@use "../../scss/colors"; -@use "../../scss/variables"; +@use "scss/colors"; +@use "scss/variables"; $title-height: 34px; $group-spacing: variables.$spacing-xl; $border-width: variables.$border-thick; .container { - margin-bottom: 27px; min-height: $title-height; position: relative; padding-top: calc($title-height / 2); @@ -27,6 +26,23 @@ $border-width: variables.$border-thick; } } +.label { + width: auto; + height: 100%; + padding-right: variables.$spacing-md; + display: flex; + align-items: center; + background-color: colors.$white; + white-space: nowrap; +} + +.dropdown { + margin-left: auto; + padding: 0 variables.$spacing-xs; + background-color: colors.$white; + min-width: calc(50% - 100px); +} + .content { border-color: colors.$grey-100; border-style: solid; diff --git a/airbyte-webapp/src/components/GroupControls/GroupControls.tsx b/airbyte-webapp/src/components/GroupControls/GroupControls.tsx index 23eecb0f79e5..580e8c1fad1d 100644 --- a/airbyte-webapp/src/components/GroupControls/GroupControls.tsx +++ b/airbyte-webapp/src/components/GroupControls/GroupControls.tsx @@ -3,16 +3,20 @@ import React from "react"; import styles from "./GroupControls.module.scss"; interface GroupControlsProps { - title: React.ReactNode; + label: React.ReactNode; + dropdown?: React.ReactNode; name?: string; } -const GroupControls: React.FC> = ({ title, children, name }) => { +const GroupControls: React.FC> = ({ label, dropdown, children, name }) => { return ( // This outer div is necessary for .content > :first-child padding to be properly applied in the case of nested GroupControls
-
{title}
+
+
{label}
+
{dropdown}
+
{children}
diff --git a/airbyte-webapp/src/components/GroupControls/index.stories.tsx b/airbyte-webapp/src/components/GroupControls/index.stories.tsx index 0ac049aa5e08..414aec31cac6 100644 --- a/airbyte-webapp/src/components/GroupControls/index.stories.tsx +++ b/airbyte-webapp/src/components/GroupControls/index.stories.tsx @@ -54,16 +54,16 @@ const conditionFormField: FormConditionItem = { path: "section.conditional", }; -const title = ; +const label = ; export const Empty = Template.bind({}); Empty.args = { - title, + label, }; export const WithContent = Template.bind({}); WithContent.args = { - title, + label, children: ( <> Content part 1 diff --git a/airbyte-webapp/src/components/JobItem/components/AttemptDetails.tsx b/airbyte-webapp/src/components/JobItem/components/AttemptDetails.tsx index bd9a4eebd128..c06b10ea3917 100644 --- a/airbyte-webapp/src/components/JobItem/components/AttemptDetails.tsx +++ b/airbyte-webapp/src/components/JobItem/components/AttemptDetails.tsx @@ -3,6 +3,8 @@ import dayjs from "dayjs"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; +import { formatBytes } from "utils/numberHelper"; + import { AttemptRead, AttemptStatus } from "../../../core/request/AirbyteClient"; import styles from "./AttemptDetails.module.scss"; @@ -23,20 +25,6 @@ const AttemptDetails: React.FC = ({ attempt, className, has return null; } - const formatBytes = (bytes?: number) => { - if (!bytes) { - return ; - } - - const k = 1024; - const dm = 2; - const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - const result = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)); - - return ; - }; - const getFailureOrigin = (attempt: AttemptRead) => { const failure = getFailureFromAttempt(attempt); const failureOrigin = failure?.failureOrigin ?? formatMessage({ id: "errorView.unknown" }); diff --git a/airbyte-webapp/src/components/JobItem/components/MainInfo.module.scss b/airbyte-webapp/src/components/JobItem/components/MainInfo.module.scss index aced7492a215..6f53bcbcf78c 100644 --- a/airbyte-webapp/src/components/JobItem/components/MainInfo.module.scss +++ b/airbyte-webapp/src/components/JobItem/components/MainInfo.module.scss @@ -5,10 +5,10 @@ cursor: pointer; height: unset !important; min-height: 70px; + gap: variables.$spacing-lg; padding: variables.$spacing-lg 0; .titleCell { - width: 80%; display: flex; color: colors.$dark-blue; min-width: 0; @@ -39,6 +39,7 @@ display: flex; justify-content: flex-end; align-items: center; + flex: 0 0 auto; .attemptCount { font-size: 12px; diff --git a/airbyte-webapp/src/components/JobItem/components/MainInfo.tsx b/airbyte-webapp/src/components/JobItem/components/MainInfo.tsx index c6d363b3b4db..1db81e96bdc3 100644 --- a/airbyte-webapp/src/components/JobItem/components/MainInfo.tsx +++ b/airbyte-webapp/src/components/JobItem/components/MainInfo.tsx @@ -4,6 +4,7 @@ import classNames from "classnames"; import React, { useMemo } from "react"; import { FormattedDateParts, FormattedMessage, FormattedTimeParts } from "react-intl"; +import { JobProgress } from "components/connection/JobProgress"; import { Cell, Row } from "components/SimpleTableComponents"; import { StatusIcon } from "components/ui/StatusIcon"; @@ -87,6 +88,7 @@ const MainInfo: React.FC = ({ job, attempts = [], isOpen, onExpan
{statusIcon}
{label} + {jobConfigType === "sync" && } {attempts.length > 0 && ( <> {jobConfigType === "reset_connection" ? ( diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.module.scss similarity index 65% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.module.scss index 4a53ac37cae7..095b5c59ee25 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.module.scss @@ -1,4 +1,4 @@ -@use "../../../scss/variables"; +@use "scss/variables"; .modalContent { display: flex; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.test.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.test.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.test.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.test.tsx diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.tsx similarity index 93% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.tsx index fda79811d5a8..8ce4b516d163 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/CatalogDiffModal.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/CatalogDiffModal.tsx @@ -9,8 +9,8 @@ import { AirbyteCatalog, CatalogDiff } from "core/request/AirbyteClient"; import { useModalService } from "hooks/services/Modal"; import styles from "./CatalogDiffModal.module.scss"; -import { DiffSection } from "./components/DiffSection"; -import { FieldSection } from "./components/FieldSection"; +import { DiffSection } from "./DiffSection"; +import { FieldSection } from "./FieldSection"; import { getSortedDiff } from "./utils"; interface CatalogDiffModalProps { diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordion.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordion.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordion.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordion.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordion.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordion.tsx similarity index 97% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordion.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordion.tsx index 52cd6efc35ab..1392090fc7ed 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordion.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordion.tsx @@ -3,10 +3,10 @@ import { useMemo } from "react"; import { StreamTransform } from "core/request/AirbyteClient"; -import { getSortedDiff } from "../utils"; import styles from "./DiffAccordion.module.scss"; import { DiffAccordionHeader } from "./DiffAccordionHeader"; import { DiffFieldTable } from "./DiffFieldTable"; +import { getSortedDiff } from "./utils"; interface DiffAccordionProps { streamTransform: StreamTransform; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordionHeader.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordionHeader.module.scss similarity index 56% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordionHeader.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordionHeader.module.scss index 58427fc104f2..740f7cc61d87 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordionHeader.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordionHeader.module.scss @@ -1,5 +1,5 @@ -@forward "../components/StreamRow.module.scss"; -@forward "../components/DiffSection.module.scss"; +@forward "./StreamRow.module.scss"; +@forward "./DiffSection.module.scss"; @use "scss/variables"; .row { diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordionHeader.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordionHeader.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffAccordionHeader.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffAccordionHeader.tsx diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffFieldTable.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffFieldTable.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffFieldTable.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffFieldTable.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffFieldTable.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffFieldTable.tsx similarity index 96% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffFieldTable.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffFieldTable.tsx index b4d45e871777..aab8e0f02af5 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffFieldTable.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffFieldTable.tsx @@ -2,10 +2,10 @@ import { FormattedMessage } from "react-intl"; import { FieldTransform } from "core/request/AirbyteClient"; -import { DiffVerb } from "../types"; import styles from "./DiffFieldTable.module.scss"; import { DiffHeader } from "./DiffHeader"; import { FieldRow } from "./FieldRow"; +import { DiffVerb } from "./types"; interface DiffFieldTableProps { fieldTransforms: FieldTransform[]; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffHeader.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffHeader.tsx similarity index 93% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffHeader.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffHeader.tsx index 00ef53880d3c..1693c9543fad 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffHeader.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffHeader.tsx @@ -1,6 +1,6 @@ import { useIntl } from "react-intl"; -import { DiffVerb } from "../types"; +import { DiffVerb } from "./types"; export type DiffType = "field" | "stream"; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffIconBlock.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffIconBlock.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffIconBlock.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffIconBlock.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffIconBlock.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffIconBlock.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffIconBlock.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffIconBlock.tsx diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffSection.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffSection.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffSection.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffSection.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffSection.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffSection.tsx similarity index 98% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffSection.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/DiffSection.tsx index 215e40a53cb9..06ebc68e1bb7 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/DiffSection.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/DiffSection.tsx @@ -2,10 +2,10 @@ import { FormattedMessage } from "react-intl"; import { AirbyteCatalog, StreamDescriptor, StreamTransform } from "core/request/AirbyteClient"; -import { DiffVerb } from "../types"; import { DiffHeader } from "./DiffHeader"; import styles from "./DiffSection.module.scss"; import { StreamRow } from "./StreamRow"; +import { DiffVerb } from "./types"; interface DiffSectionProps { streams: StreamTransform[]; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldRow.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/FieldRow.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldRow.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/FieldRow.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldRow.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/FieldRow.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldRow.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/FieldRow.tsx diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldSection.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/FieldSection.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldSection.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/FieldSection.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldSection.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/FieldSection.tsx similarity index 97% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldSection.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/FieldSection.tsx index b6916a74ee8f..41067a879303 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/FieldSection.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/FieldSection.tsx @@ -2,10 +2,10 @@ import { FormattedMessage, useIntl } from "react-intl"; import { StreamTransform } from "core/request/AirbyteClient"; -import { DiffVerb } from "../types"; import { DiffAccordion } from "./DiffAccordion"; import { DiffHeader } from "./DiffHeader"; import styles from "./FieldSection.module.scss"; +import { DiffVerb } from "./types"; interface FieldSectionProps { streams: StreamTransform[]; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/StreamRow.module.scss b/airbyte-webapp/src/components/connection/CatalogDiffModal/StreamRow.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/StreamRow.module.scss rename to airbyte-webapp/src/components/connection/CatalogDiffModal/StreamRow.module.scss diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/StreamRow.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/StreamRow.tsx similarity index 93% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/components/StreamRow.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/StreamRow.tsx index 083699a47076..5f1f97cac192 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/components/StreamRow.tsx +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/StreamRow.tsx @@ -2,11 +2,12 @@ import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import classnames from "classnames"; +import { ModificationIcon } from "components/icons/ModificationIcon"; + import { StreamTransform } from "core/request/AirbyteClient"; -import { ModificationIcon } from "../../../../components/icons/ModificationIcon"; -import { DiffVerb } from "../types"; import styles from "./StreamRow.module.scss"; +import { DiffVerb } from "./types"; interface StreamRowProps { streamTransform: StreamTransform; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/index.stories.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/index.stories.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/index.stories.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/index.stories.tsx diff --git a/airbyte-webapp/src/components/connection/CatalogDiffModal/index.ts b/airbyte-webapp/src/components/connection/CatalogDiffModal/index.ts new file mode 100644 index 000000000000..ef0d83e8f7e7 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogDiffModal/index.ts @@ -0,0 +1 @@ +export * from "./CatalogDiffModal"; diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/types.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/types.ts similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/types.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/types.ts diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/utils.tsx b/airbyte-webapp/src/components/connection/CatalogDiffModal/utils.tsx similarity index 100% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/utils.tsx rename to airbyte-webapp/src/components/connection/CatalogDiffModal/utils.tsx diff --git a/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx b/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx index 5306123c3085..bb0e9e602a5d 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx @@ -19,7 +19,7 @@ import { ConnectionFormValues, SUPPORTED_MODES } from "views/Connection/Connecti import styles from "./CatalogSection.module.scss"; import { CatalogTreeTableRow } from "./next/CatalogTreeTableRow"; -import { StreamDetailsPanel } from "./next/StreamDetailsPanel"; +import { StreamDetailsPanel } from "./next/StreamDetailsPanel/StreamDetailsPanel"; import { StreamFieldTable } from "./StreamFieldTable"; import { StreamHeader } from "./StreamHeader"; import { flatten, getPathType } from "./utils"; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableHeader.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableHeader.tsx index 9d7991df24fa..669804acc026 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableHeader.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableHeader.tsx @@ -1,15 +1,31 @@ +import { faGear } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useFormikContext } from "formik"; import React from "react"; import { FormattedMessage } from "react-intl"; import { Cell, Header } from "components/SimpleTableComponents"; +import { Button } from "components/ui/Button"; import { CheckBox } from "components/ui/CheckBox"; import { Text } from "components/ui/Text"; import { InfoTooltip, TooltipLearnMoreLink } from "components/ui/Tooltip"; +import { NamespaceDefinitionType } from "core/request/AirbyteClient"; import { useBulkEditService } from "hooks/services/BulkEdit/BulkEditService"; import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; +import { useModalService } from "hooks/services/Modal"; import { links } from "utils/links"; +import { FormikConnectionFormValues } from "views/Connection/ConnectionForm/formConfig"; +import { + DestinationNamespaceFormValueType, + DestinationNamespaceModal, +} from "../../DestinationNamespaceModal/DestinationNamespaceModal"; +import { + DestinationStreamNamesFormValueType, + DestinationStreamNamesModal, + StreamNameDefinitionValueType, +} from "../../DestinationStreamNamesModal/DestinationStreamNamesModal"; import styles from "./CatalogTreeTableHeader.module.scss"; const TextCell: React.FC> = ({ flex, children }) => { @@ -24,7 +40,24 @@ const TextCell: React.FC> = ({ flex, export const CatalogTreeTableHeader: React.FC = () => { const { mode } = useConnectionFormService(); + const { openModal, closeModal } = useModalService(); const { onCheckAll, selectedBatchNodeIds, allChecked } = useBulkEditService(); + const formikProps = useFormikContext(); + + const destinationNamespaceChange = (value: DestinationNamespaceFormValueType) => { + formikProps.setFieldValue("namespaceDefinition", value.namespaceDefinition); + + if (value.namespaceDefinition === NamespaceDefinitionType.customformat) { + formikProps.setFieldValue("namespaceFormat", value.namespaceFormat); + } + }; + + const destinationStreamNamesChange = (value: DestinationStreamNamesFormValueType) => { + formikProps.setFieldValue( + "prefix", + value.streamNameDefinition === StreamNameDefinitionValueType.Prefix ? value.prefix : "" + ); + }; return (
@@ -68,9 +101,52 @@ export const CatalogTreeTableHeader: React.FC = () => {
+ +
); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss index 787f8b34bb1b..a7eacc813342 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss @@ -1,21 +1,18 @@ @use "scss/colors"; @use "scss/variables"; -.icon { - margin-right: 7px; - margin-top: -1px; +@mixin header-background($color, $hoverColor) { + background-color: $color; - &.plus { - color: colors.$green; - } - - &.minus { - color: colors.$red; + &:hover { + background-color: $hoverColor; + cursor: pointer; } } .streamHeaderContent { - background: colors.$white; + @include header-background(colors.$white, colors.$grey-30); + border-bottom: 1px solid colors.$grey-50; padding: 0 variables.$spacing-md; margin-bottom: 1px; @@ -26,27 +23,22 @@ overflow-y: auto; scrollbar-gutter: stable; - &:hover { - background: colors.$grey-30; - cursor: pointer; + &.removed { + @include header-background(colors.$red-30, colors.$red-40); } - &.disabledChange { - background-color: colors.$red-50; + &.added { + @include header-background(colors.$green-30, colors.$green-40); } - &.enabledChange { - background-color: colors.$green-50; + &.changed { + @include header-background(colors.$blue-30, colors.$blue-40); } &.error { border: 1px solid colors.$red; } - &.selected { - background-color: colors.$blue-transparent; - } - &.disabled { background-color: colors.$grey-50; } @@ -62,6 +54,7 @@ flex-direction: row; justify-content: flex-end; padding-left: variables.$spacing-xl + variables.$spacing-sm; + align-items: center; } .arrowCell { diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.tsx index 16708cd44184..7da5ec35ec24 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.tsx @@ -1,4 +1,4 @@ -import { faArrowRight, faMinus, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import classnames from "classnames"; import React, { useMemo } from "react"; @@ -12,9 +12,13 @@ import { Text } from "components/ui/Text"; import { useBulkEditSelect } from "hooks/services/BulkEdit/BulkEditService"; import { StreamHeaderProps } from "../StreamHeader"; +// eslint-disable-next-line css-modules/no-unused-class import styles from "./CatalogTreeTableRow.module.scss"; +import { CatalogTreeTableRowIcon } from "./CatalogTreeTableRowIcon"; import { StreamPathSelect } from "./StreamPathSelect"; import { SyncModeSelect } from "./SyncModeSelect"; +import { useCatalogTreeTableRowProps } from "./useCatalogTreeTableRowProps"; + export const CatalogTreeTableRow: React.FC = ({ stream, destName, @@ -30,12 +34,9 @@ export const CatalogTreeTableRow: React.FC = ({ // isRowExpanded, fields, onExpand, - changedSelected, - hasError, disabled, }) => { const { primaryKey, cursorField, syncMode, destinationSyncMode } = stream.config ?? {}; - const isStreamEnabled = stream.config?.selected; const { defaultCursorField } = stream.stream ?? {}; const syncSchema = useMemo( @@ -52,32 +53,15 @@ export const CatalogTreeTableRow: React.FC = ({ const fieldCount = fields?.length ?? 0; const onRowClick = fieldCount > 0 ? () => onExpand() : undefined; - const iconStyle = classnames(styles.icon, { - [styles.plus]: isStreamEnabled, - [styles.minus]: !isStreamEnabled, - }); + const { streamHeaderContentStyle, pillButtonVariant } = useCatalogTreeTableRowProps(stream); - const streamHeaderContentStyle = classnames(styles.streamHeaderContent, { - [styles.enabledChange]: changedSelected && isStreamEnabled, - [styles.disabledChange]: changedSelected && !isStreamEnabled, - [styles.selected]: isSelected, - [styles.error]: hasError, - [styles.disabled]: !changedSelected && !isStreamEnabled, - }); + const checkboxCellCustomStyle = classnames(styles.checkboxCell, styles.streamRowCheckboxCell); return ( {!disabled && ( -
- {changedSelected && ( -
- {isStreamEnabled ? ( - - ) : ( - - )} -
- )} +
+
)} @@ -104,7 +88,12 @@ export const CatalogTreeTableRow: React.FC = ({ ) : ( // todo: SyncModeSelect should probably have a Tooltip, append/dedupe ends up ellipsing - + )}
@@ -114,6 +103,7 @@ export const CatalogTreeTableRow: React.FC = ({ paths={paths} path={cursorType === "sourceDefined" ? defaultCursorField : cursorField} onPathChange={onCursorChange} + variant={pillButtonVariant} /> )} @@ -125,6 +115,7 @@ export const CatalogTreeTableRow: React.FC = ({ path={primaryKey} isMulti onPathChange={onPrimaryKeyChange} + variant={pillButtonVariant} /> )} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.module.scss new file mode 100644 index 000000000000..f14a40a0d502 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.module.scss @@ -0,0 +1,24 @@ +@use "scss/colors"; + +.icon { + margin-right: 7px; + + &.plus { + color: colors.$green; + } + + &.minus { + color: colors.$red; + } + + &.changed { + color: colors.$blue; + display: flex; + flex-direction: row; + align-items: center; + } +} + +:export { + modificationIconColor: colors.$blue; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.tsx new file mode 100644 index 000000000000..bf74cc1a35dc --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRowIcon.tsx @@ -0,0 +1,42 @@ +import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import classNames from "classnames"; + +import { ModificationIcon } from "components/icons/ModificationIcon"; + +import { SyncSchemaStream } from "core/domain/catalog"; + +import styles from "./CatalogTreeTableRowIcon.module.scss"; +import { useCatalogTreeTableRowProps } from "./useCatalogTreeTableRowProps"; + +interface CatalogTreeTableRowIconProps { + stream: SyncSchemaStream; +} +export const CatalogTreeTableRowIcon: React.FC = ({ stream }) => { + const { statusToDisplay, isSelected } = useCatalogTreeTableRowProps(stream); + + if (statusToDisplay === "added") { + return ( + + ); + } else if (statusToDisplay === "removed") { + return ( + + ); + } else if (statusToDisplay === "changed") { + return ( +
+ +
+ ); + } + return
; +}; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx index 4700294f1f55..5d82cacec05e 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx @@ -12,7 +12,7 @@ import { getIcon } from "utils/imageUtils"; import styles from "./StreamConnectionHeader.module.scss"; -const renderIcon = (icon?: string): JSX.Element =>
{getIcon(icon)}
; +export const renderIcon = (icon?: string): JSX.Element =>
{getIcon(icon)}
; export const StreamConnectionHeader: React.FC = () => { const { diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.module.scss deleted file mode 100644 index e62fa68b3b79..000000000000 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use "scss/colors"; -@use "scss/variables"; -@use "scss/z-indices"; - -.dialog { - z-index: z-indices.$modal; -} - -.container { - position: fixed; - bottom: 0; - left: variables.$width-size-menu; - z-index: 1000; - width: calc(100% - variables.$width-size-menu); - height: calc(100vh - 100px); - background: colors.$white; - border-radius: variables.$border-radius-2xl variables.$border-radius-2xl 0 0; - box-shadow: 0 0 22px rgba(colors.$dark-blue-900, 12%); -} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss new file mode 100644 index 000000000000..514e269ea2a0 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss @@ -0,0 +1,27 @@ +@use "scss/colors"; +@use "scss/variables" as vars; +@use "scss/z-indices"; + +$container-left-space: vars.$spacing-xl; +$container-right-space: vars.$spacing-xl * 2; + +.dialog { + z-index: z-indices.$modal; +} + +.container { + position: fixed; + bottom: 0; + left: vars.$width-size-menu + $container-left-space; + width: calc(100% - (vars.$width-size-menu + $container-right-space)); + z-index: 1000; + height: calc(100vh - 100px); + background: colors.$white; + border-radius: vars.$border-radius-2xl vars.$border-radius-2xl 0 0; + box-shadow: 0 0 22px rgba(colors.$dark-blue-900, 12%); +} + +.tableContainer { + height: calc(100% - 64px); + overflow: scroll; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx similarity index 68% rename from airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.tsx rename to airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx index 8ad7562424b2..aea07bbb83eb 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx @@ -1,13 +1,13 @@ import { Dialog } from "@headlessui/react"; +import React from "react"; import { Overlay } from "components/ui/Overlay"; import { AirbyteStream } from "core/request/AirbyteClient"; -import { StreamConnectionHeader } from "./StreamConnectionHeader"; import styles from "./StreamDetailsPanel.module.scss"; -import { StreamFieldsTable, StreamFieldsTableProps } from "./StreamFieldsTable"; -import { StreamPanelHeader } from "./StreamPanelHeader"; +import { StreamFieldsTable, StreamFieldsTableProps } from "./StreamFieldsTable/StreamFieldsTable"; +import { StreamPanelHeader } from "./StreamPanelHeader/StreamPanelHeader"; interface StreamDetailsPanelProps extends StreamFieldsTableProps { disabled?: boolean; @@ -39,15 +39,16 @@ export const StreamDetailsPanel: React.FC = ({ onClose={onClose} onSelectedChange={onSelectedChange} /> - - +
+ +
); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.module.scss new file mode 100644 index 000000000000..89e9e27d46c9 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.module.scss @@ -0,0 +1,13 @@ +$connector-icon-size: 28px; + +.connectorIconContainer { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; +} + +.icon { + height: $connector-icon-size; + width: $connector-icon-size; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.tsx new file mode 100644 index 000000000000..af8983df82c9 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { FormattedMessage } from "react-intl"; + +import { getIcon } from "utils/imageUtils"; + +import styles from "./ConnectorHeaderGroupIcon.module.scss"; + +interface StreamHeaderGroupIconProps { + type: "source" | "destination"; + icon?: string; +} + +export const ConnectorHeaderGroupIcon: React.FC = ({ type, icon }) => { + return ( + +
{getIcon(icon)}
+ +
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss new file mode 100644 index 000000000000..9a0f2a40bbbd --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss @@ -0,0 +1,93 @@ +@use "scss/colors"; +@use "scss/variables"; + +$cell-height: 28px; +$cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; + +.customTableStyle { + td { + border-bottom-color: colors.$grey-50; + } +} + +.headerGroupCell { + height: 58px; + background-color: colors.$white; + color: colors.$dark-blue; + font-weight: 700; + font-size: 16px; + line-height: $cell-height; + text-transform: capitalize; + + &:first-child { + padding-left: $cell-left-padding; + border-radius: 0; + } + + &:last-child { + padding-left: 0; + } +} + +.headerCell { + color: colors.$grey; + background-color: colors.$grey-50; + height: $cell-height; + font-weight: 400; + font-size: 12px; + line-height: 15px; + text-transform: capitalize; + + &:first-child { + padding-left: $cell-left-padding; + border-radius: 0; + } + + &:last-child { + padding-left: 0; + border-radius: 0; + } +} + +%bodyCell { + height: $cell-height; + padding: 0; + + &:first-child { + padding-left: $cell-left-padding; + border-radius: 0; + } +} + +.textCell { + @extend %bodyCell; + + color: colors.$dark-blue; +} + +.dataTypeCell { + @extend %bodyCell; + + color: colors.$grey-400; +} + +.arrowCell { + @extend %bodyCell; + + svg { + color: colors.$grey-200; + } +} + +.checkboxCell { + display: flex; + align-items: center; + height: $cell-height; + overflow: unset; + padding-left: 0; +} + +// need to fix styled-component z-index issue +.checkbox { + position: unset !important; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx new file mode 100644 index 000000000000..86c92a6bc33a --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx @@ -0,0 +1,185 @@ +import { createColumnHelper } from "@tanstack/react-table"; +import React, { useMemo } from "react"; +import { FormattedMessage, useIntl } from "react-intl"; + +import { pathDisplayName } from "components/connection/CatalogTree/PathPopout"; +import { ArrowRightIcon } from "components/icons/ArrowRightIcon"; +import { CheckBox } from "components/ui/CheckBox"; +import { NextTable } from "components/ui/NextTable"; +import { RadioButton } from "components/ui/RadioButton"; + +import { SyncSchemaField, SyncSchemaFieldObject } from "core/domain/catalog"; +import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; +import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; +import { useDestinationDefinition } from "services/connector/DestinationDefinitionService"; +import { useSourceDefinition } from "services/connector/SourceDefinitionService"; +import { equal } from "utils/objects"; +import { getDataType } from "utils/useTranslateDataType"; + +import { ConnectorHeaderGroupIcon } from "./ConnectorHeaderGroupIcon"; +import styles from "./StreamFieldsTable.module.scss"; + +interface TableStream { + path: string[]; + dataType: string; + cursorDefined?: boolean; + primaryKeyDefined?: boolean; +} + +export interface StreamFieldsTableProps { + config?: AirbyteStreamConfiguration; + onCursorSelect: (cursorPath: string[]) => void; + onPkSelect: (pkPath: string[]) => void; + shouldDefinePk: boolean; + shouldDefineCursor: boolean; + syncSchemaFields: SyncSchemaField[]; +} + +export const StreamFieldsTable: React.FC = ({ + config, + onPkSelect, + onCursorSelect, + shouldDefineCursor, + shouldDefinePk, + syncSchemaFields, +}) => { + const { formatMessage } = useIntl(); + + const isCursor = useMemo(() => (path: string[]) => equal(config?.cursorField, path), [config?.cursorField]); + const isPrimaryKey = useMemo( + () => (path: string[]) => !!config?.primaryKey?.some((p) => equal(p, path)), + [config?.primaryKey] + ); + + // header group icons: + const { + connection: { source, destination }, + } = useConnectionFormService(); + const sourceDefinition = useSourceDefinition(source.sourceDefinitionId); + const destinationDefinition = useDestinationDefinition(destination.destinationDefinitionId); + + // prepare data for table + const tableData: TableStream[] = useMemo( + () => + syncSchemaFields.map((stream) => ({ + path: stream.path, + dataType: getDataType(stream), + cursorDefined: shouldDefineCursor && SyncSchemaFieldObject.isPrimitive(stream), + primaryKeyDefined: shouldDefinePk && SyncSchemaFieldObject.isPrimitive(stream), + })), + [shouldDefineCursor, shouldDefinePk, syncSchemaFields] + ); + + const columnHelper = createColumnHelper(); + + const sourceColumns = useMemo( + () => [ + columnHelper.accessor("path", { + id: "sourcePath", + header: () => , + cell: ({ getValue }) => pathDisplayName(getValue()), + meta: { + thClassName: styles.headerCell, + tdClassName: styles.textCell, + }, + }), + columnHelper.accessor("dataType", { + id: "sourceDataType", + header: () => , + cell: ({ getValue }) => ( + + ), + meta: { + thClassName: styles.headerCell, + tdClassName: styles.dataTypeCell, + }, + }), + columnHelper.accessor("cursorDefined", { + id: "sourceCursorDefined", + header: () => , + cell: ({ getValue, row }) => + getValue() && ( + onCursorSelect(row.original.path)} /> + ), + meta: { + thClassName: styles.headerCell, + tdClassName: styles.checkboxCell, + }, + }), + columnHelper.accessor("primaryKeyDefined", { + id: "sourcePrimaryKeyDefined", + header: () => , + cell: ({ getValue, row }) => + getValue() && ( + onPkSelect(row.original.path)} + className={styles.checkbox} + /> + ), + meta: { + thClassName: styles.headerCell, + tdClassName: styles.textCell, + }, + }), + ], + [columnHelper, formatMessage, isCursor, isPrimaryKey, onCursorSelect, onPkSelect] + ); + + const destinationColumns = useMemo( + () => [ + columnHelper.accessor("path", { + id: "destinationPath", + header: () => , + cell: ({ getValue }) => pathDisplayName(getValue()), + meta: { + thClassName: styles.headerCell, + tdClassName: styles.textCell, + }, + }), + ], + [columnHelper] + ); + + const columns = useMemo( + () => [ + columnHelper.group({ + id: "source", + header: () => , + columns: sourceColumns, + meta: { + thClassName: styles.headerGroupCell, + }, + }), + columnHelper.group({ + id: "arrow", + header: () => , + columns: [ + { + id: "_", // leave the column name empty + cell: () => , + meta: { + thClassName: styles.headerCell, + tdClassName: styles.arrowCell, + }, + }, + ], + meta: { + thClassName: styles.headerGroupCell, + }, + }), + columnHelper.group({ + id: "destination", + header: () => , + columns: destinationColumns, + meta: { + thClassName: styles.headerGroupCell, + tdClassName: styles.bodyCell, + }, + }), + ], + [columnHelper, destinationColumns, destinationDefinition.icon, sourceColumns, sourceDefinition.icon] + ); + + return columns={columns} data={tableData} className={styles.customTableStyle} />; +}; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.module.scss similarity index 55% rename from airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.module.scss rename to airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.module.scss index 557c6a268c23..769d1246b1e4 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.module.scss @@ -2,12 +2,13 @@ @use "scss/variables"; .container { - border-radius: 10px; + border-radius: variables.$spacing-md; margin: variables.$spacing-md variables.$spacing-lg; background-color: colors.$grey-50; display: flex; flex-direction: row; justify-content: space-between; + align-items: center; & > :not(button) { padding: variables.$spacing-md; @@ -19,3 +20,23 @@ flex-direction: row; gap: variables.$spacing-xl; } + +.streamPropLabel { + display: inline; + color: colors.$grey-300; + + &::after { + content: ":"; + } +} + +.streamPropValue { + display: inline; + margin-left: variables.$spacing-sm; +} + +.crossIcon { + svg { + color: colors.$dark-blue; + } +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.tsx similarity index 56% rename from airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.tsx rename to airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.tsx index e40cdb29ba90..15ac2571deb1 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPanelHeader.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamPanelHeader/StreamPanelHeader.tsx @@ -1,8 +1,10 @@ +import React, { ReactNode } from "react"; import { FormattedMessage } from "react-intl"; import { CrossIcon } from "components/icons/CrossIcon"; import { Button } from "components/ui/Button"; import { Switch } from "components/ui/Switch"; +import { Text } from "components/ui/Text"; import { AirbyteStream, AirbyteStreamConfiguration } from "core/request/AirbyteClient"; @@ -18,19 +20,19 @@ interface StreamPanelHeaderProps { interface SomethingProps { messageId: string; - value?: string; + value?: string | ReactNode; } -export const StreamProperty: React.FC = ({ messageId, value }) => { - return ( - - - - - : {value} - - ); -}; +export const StreamProperty: React.FC = ({ messageId, value }) => ( + + + + + + {value} + + +); export const StreamPanelHeader: React.FC = ({ config, @@ -39,17 +41,27 @@ export const StreamPanelHeader: React.FC = ({ onSelectedChange, stream, }) => { + const syncMode = ( + <> + + {` | `} + + + ); return (
- + } + /> - +
-
); }; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTable.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTable.tsx deleted file mode 100644 index 52dc5610ca25..000000000000 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTable.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { SyncSchemaField, SyncSchemaFieldObject } from "core/domain/catalog"; -import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; - -import { pathDisplayName } from "../PathPopout"; -import { TreeRowWrapper } from "../TreeRowWrapper"; -import { StreamFieldsTableHeader } from "./StreamFieldsTableHeader"; -import { StreamFieldsTableRow } from "./StreamFieldsTableRow"; - -export interface StreamFieldsTableProps { - config?: AirbyteStreamConfiguration; - onCursorSelect: (cursorPath: string[]) => void; - onPkSelect: (pkPath: string[]) => void; - shouldDefinePk: boolean; - shouldDefineCursor: boolean; - syncSchemaFields: SyncSchemaField[]; -} - -export const StreamFieldsTable: React.FC = ({ - config, - onPkSelect, - onCursorSelect, - shouldDefineCursor, - shouldDefinePk, - syncSchemaFields, -}) => { - return ( - <> - - - - {syncSchemaFields.map((field) => ( - - - - ))} - - ); -}; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableHeader.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableHeader.tsx deleted file mode 100644 index 7db0ce0f52c8..000000000000 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableHeader.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from "react"; -import { FormattedMessage } from "react-intl"; - -import { HeaderCell, NameContainer } from "../styles"; - -export const StreamFieldsTableHeader: React.FC = React.memo(() => ( - <> - - - - - - - - - - - - - - - - - - - {/* - In the design, but we may be unable to get the destination data type - - - - */} - -)); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableRow.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableRow.tsx deleted file mode 100644 index ea584c08da62..000000000000 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamFieldsTableRow.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React from "react"; - -import { Cell } from "components/SimpleTableComponents"; -import { CheckBox } from "components/ui/CheckBox"; -import { RadioButton } from "components/ui/RadioButton"; - -import { SyncSchemaField } from "core/domain/catalog"; -import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; -import { equal } from "utils/objects"; -import { useTranslateDataType } from "utils/useTranslateDataType"; - -import DataTypeCell from "../DataTypeCell"; -import { pathDisplayName } from "../PathPopout"; -import { NameContainer } from "../styles"; - -interface StreamFieldsTableRowProps { - isPrimaryKeyEnabled: boolean; - isCursorEnabled: boolean; - - onPrimaryKeyChange: (pk: string[]) => void; - onCursorChange: (cs: string[]) => void; - field: SyncSchemaField; - config: AirbyteStreamConfiguration | undefined; -} - -const StreamFieldsTableRowComponent: React.FC = ({ - onPrimaryKeyChange, - onCursorChange, - field, - config, - isCursorEnabled, - isPrimaryKeyEnabled, -}) => { - const dataType = useTranslateDataType(field); - const name = pathDisplayName(field.path); - - const isCursor = equal(config?.cursorField, field.path); - const isPrimaryKey = !!config?.primaryKey?.some((p) => equal(p, field.path)); - - return ( - <> - - {name} - - {dataType} - {isCursorEnabled && onCursorChange(field.path)} />} - - {isPrimaryKeyEnabled && onPrimaryKeyChange(field.path)} />} - - - - - - {field.cleanedName} - - {/* - In the design, but we may be unable to get the destination data type - {dataType} - */} - - ); -}; - -export const StreamFieldsTableRow = React.memo(StreamFieldsTableRowComponent); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.module.scss index c498cd19a1b0..6653a7af6fe5 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.module.scss @@ -4,6 +4,10 @@ white-space: nowrap; } -.pillSelect { +.streamPathSelect { width: 100%; + min-width: 0; + display: flex; + flex-direction: row; + justify-content: space-between; } diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.tsx index bb871e8f946a..c4e7df8e7768 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamPathSelect.tsx @@ -61,7 +61,6 @@ export const StreamPathSelect: React.FC = (props) => { = (props) => { const finalValues = Array.isArray(options) ? options.map((op) => op.value) : options.value; props.onPathChange(finalValues); }} + className={styles.streamPathSelect} /> ); }; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/SyncModeSelect.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/SyncModeSelect.tsx index 37d0b9478fce..ee271bd99933 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/SyncModeSelect.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/SyncModeSelect.tsx @@ -26,7 +26,7 @@ interface SyncModeSelectProps { variant?: PillButtonVariant; } -export const SyncModeSelect: React.FC = ({ className, variant, options, onChange, value }) => { +export const SyncModeSelect: React.FC = ({ className, options, onChange, value, variant }) => { const pillSelectOptions = useMemo(() => { return options.map(({ value }) => { const { syncMode, destinationSyncMode } = value; @@ -45,11 +45,11 @@ export const SyncModeSelect: React.FC = ({ className, varia return ( ); }; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/__snapshots__/BulkEditPanel.test.tsx.snap b/airbyte-webapp/src/components/connection/CatalogTree/next/__snapshots__/BulkEditPanel.test.tsx.snap index 6c8de0e738a7..12f584eafe8c 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/__snapshots__/BulkEditPanel.test.tsx.snap +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/__snapshots__/BulkEditPanel.test.tsx.snap @@ -71,7 +71,7 @@ exports[` should render 1`] = ` class="" />
-
-
+
@@ -128,7 +128,7 @@ exports[` should render 1`] = ` class="" />
-
-
+
@@ -186,7 +186,7 @@ exports[` should render 1`] = ` class="" />
-
-
+
diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.test.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.test.tsx new file mode 100644 index 000000000000..e1a5c4710ac4 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.test.tsx @@ -0,0 +1,153 @@ +import { renderHook } from "@testing-library/react-hooks"; +import * as formik from "formik"; + +import { AirbyteStreamAndConfiguration } from "core/request/AirbyteClient"; +import * as bulkEditService from "hooks/services/BulkEdit/BulkEditService"; +import * as connectionFormService from "hooks/services/ConnectionForm/ConnectionFormService"; +import { FormikConnectionFormValues } from "views/Connection/ConnectionForm/formConfig"; + +// eslint-disable-next-line css-modules/no-unused-class +import { useCatalogTreeTableRowProps } from "./useCatalogTreeTableRowProps"; + +const mockStream: Partial = { + stream: { + name: "stream_name", + namespace: "stream_namespace", + }, + config: { selected: true, syncMode: "full_refresh", destinationSyncMode: "overwrite" }, +}; + +const mockInitialValues: Partial = { + syncCatalog: { + streams: [ + { + stream: { + name: "stream_name", + namespace: "stream_namespace", + }, + config: { selected: true, syncMode: "full_refresh", destinationSyncMode: "overwrite" }, + }, + ], + }, +}; + +const mockDisabledInitialValues: Partial = { + syncCatalog: { + streams: [ + { + ...mockInitialValues.syncCatalog?.streams[0], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + config: { ...mockInitialValues.syncCatalog!.streams[0].config!, selected: false }, + }, + ], + }, +}; + +const testSetup = (initialValues: Partial, isBulkEdit: boolean, error: unknown) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + jest.spyOn(bulkEditService, "useBulkEditSelect").mockImplementation(() => [isBulkEdit, () => null] as any); // not selected for bulk edit + jest.spyOn(connectionFormService, "useConnectionFormService").mockImplementation(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return { initialValues } as any; + }); + jest.spyOn(formik, "useField").mockImplementationOnce(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return [{}, { error }] as any; // no error + }); +}; + +describe("useCatalogTreeTableRowProps", () => { + it("should return default styles for a row that starts enabled", () => { + testSetup(mockInitialValues, false, undefined); + + const { result } = renderHook(() => useCatalogTreeTableRowProps(mockStream)); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent"); + expect(result.current.pillButtonVariant).toEqual("grey"); + }); + it("should return disabled styles for a row that starts disabled", () => { + testSetup(mockDisabledInitialValues, false, undefined); + + const { result } = renderHook(() => + useCatalogTreeTableRowProps({ + ...mockStream, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + config: { ...mockStream.config!, selected: false }, + }) + ); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent disabled"); + expect(result.current.pillButtonVariant).toEqual("grey"); + }); + it("should return added styles for a row that is added", () => { + testSetup(mockDisabledInitialValues, false, undefined); + + const { result } = renderHook(() => useCatalogTreeTableRowProps(mockStream)); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent added"); + expect(result.current.pillButtonVariant).toEqual("green"); + }); + it("should return removed styles for a row that is removed", () => { + testSetup(mockInitialValues, false, undefined); + + const { result } = renderHook(() => + useCatalogTreeTableRowProps({ + ...mockStream, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + config: { ...mockStream.config!, selected: false }, + }) + ); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent removed"); + expect(result.current.pillButtonVariant).toEqual("red"); + }); + it("should return updated styles for a row that is updated", () => { + // eslint-disable-next-line + testSetup(mockInitialValues, false, undefined); + + const { result } = renderHook(() => + useCatalogTreeTableRowProps({ + ...mockStream, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + config: { ...mockStream.config!, syncMode: "incremental", destinationSyncMode: "append_dedup" }, + }) + ); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent changed"); + expect(result.current.pillButtonVariant).toEqual("blue"); + }); + + it("should return added styles for a row that is both added and updated", () => { + testSetup(mockDisabledInitialValues, false, undefined); + + const { result } = renderHook(() => + useCatalogTreeTableRowProps({ + ...mockStream, + config: { selected: true, syncMode: "incremental", destinationSyncMode: "append_dedup" }, // selected true, new sync, mode and destination sync mode + }) + ); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent added"); + expect(result.current.pillButtonVariant).toEqual("green"); + }); + it("should return change background color if selected for bulk edit", () => { + testSetup(mockInitialValues, true, undefined); + + const { result } = renderHook(() => + useCatalogTreeTableRowProps({ + ...mockStream, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + config: { ...mockStream.config!, selected: true }, // selected true, new sync, mode and destination sync mode + }) + ); + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent changed"); + expect(result.current.pillButtonVariant).toEqual("blue"); + }); + it("should return error styles for a row that has an error", () => { + testSetup(mockInitialValues, false, "error"); + + const { result } = renderHook(() => useCatalogTreeTableRowProps(mockStream)); + + expect(result.current.streamHeaderContentStyle).toEqual("streamHeaderContent error"); + }); +}); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.tsx new file mode 100644 index 000000000000..4a881040ea07 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/useCatalogTreeTableRowProps.tsx @@ -0,0 +1,79 @@ +/* eslint-disable css-modules/no-unused-class */ +import classNames from "classnames"; +import { useField } from "formik"; +import isEqual from "lodash/isEqual"; +import { useMemo } from "react"; + +import { PillButtonVariant } from "components/ui/PillSelect/PillButton"; + +import { SyncSchemaStream } from "core/domain/catalog"; +import { useBulkEditSelect } from "hooks/services/BulkEdit/BulkEditService"; +import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; + +import styles from "./CatalogTreeTableRow.module.scss"; +type StatusToDisplay = "disabled" | "added" | "removed" | "changed" | "unchanged"; + +export const useCatalogTreeTableRowProps = (stream: SyncSchemaStream) => { + const { initialValues } = useConnectionFormService(); + const [isSelected] = useBulkEditSelect(stream.id); + + const [, { error }] = useField(`schema.streams[${stream.id}].config`); + + // in case error is an empty string + const hasError = error !== undefined; + + const isStreamEnabled = stream.config?.selected; + + const statusToDisplay = useMemo(() => { + const rowStatusChanged = + initialValues.syncCatalog.streams.find( + (item) => item.stream?.name === stream.stream?.name && item.stream?.namespace === stream.stream?.namespace + )?.config?.selected !== stream.config?.selected; + + const rowChanged = !isEqual( + initialValues.syncCatalog.streams.find( + (item) => + item.stream && + stream.stream && + item.stream.name === stream.stream.name && + item.stream.namespace === stream.stream.namespace + )?.config, + stream.config + ); + + if (!isStreamEnabled && !rowStatusChanged) { + return "disabled"; + } else if (rowStatusChanged) { + return isStreamEnabled ? "added" : "removed"; + } else if (rowChanged) { + return "changed"; + } + return "unchanged"; + }, [initialValues.syncCatalog.streams, isStreamEnabled, stream.config, stream.stream]); + + const pillButtonVariant = useMemo(() => { + if (statusToDisplay === "added" && !isSelected) { + return "green"; + } else if (statusToDisplay === "removed" && !isSelected) { + return "red"; + } else if (statusToDisplay === "changed" || isSelected) { + return "blue"; + } + return "grey"; + }, [isSelected, statusToDisplay]); + + const streamHeaderContentStyle = classNames(styles.streamHeaderContent, { + [styles.added]: statusToDisplay === "added" && !isSelected, + [styles.removed]: statusToDisplay === "removed" && !isSelected, + [styles.changed]: statusToDisplay === "changed" || isSelected, + [styles.disabled]: statusToDisplay === "disabled", + [styles.error]: hasError, + }); + + return { + streamHeaderContentStyle, + isSelected, + statusToDisplay, + pillButtonVariant, + }; +}; diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.module.scss b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.module.scss new file mode 100644 index 000000000000..7b145f2bb0b8 --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.module.scss @@ -0,0 +1,44 @@ +@use "scss/colors"; +@use "scss/variables"; + +.content { + display: flex; + height: 340px; +} + +.actions, .description { + display: flex; + flex-direction: column; + padding: variables.$spacing-xl; +} + +.actions { + flex: 0 0 300px; + + .radioButton + .radioButton { + margin-top: variables.$spacing-xl; + } + + .input { + position: relative; + margin: variables.$spacing-xl 0 0 variables.$spacing-xl; + + .errorMessage { + position: absolute; + bottom: -16px; + left: 0; + color: colors.$red-600; + } + } +} + +.description { + overflow: auto; + flex: 1 0 0; + background-color: colors.$grey-50; + + .generalInfo { + color: colors.$grey; + margin: variables.$spacing-lg 0; + } +} diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx new file mode 100644 index 000000000000..48587c2e580f --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx @@ -0,0 +1,160 @@ +import { Field, FieldProps, Form, Formik } from "formik"; +import React from "react"; +import { FormattedMessage, useIntl } from "react-intl"; +import * as yup from "yup"; + +import { LabeledRadioButton } from "components"; +import { Button } from "components/ui/Button"; +import { Input } from "components/ui/Input"; +import { ModalBody, ModalFooter } from "components/ui/Modal"; +import { Text } from "components/ui/Text"; + +import { NamespaceDefinitionType } from "core/request/AirbyteClient"; +import { FormikConnectionFormValues } from "views/Connection/ConnectionForm/formConfig"; + +import styles from "./DestinationNamespaceModal.module.scss"; +import { ExampleSettingsTable } from "./ExampleSettingsTable"; + +const destinationNamespaceValidationSchema = yup.object().shape({ + namespaceDefinition: yup + .string() + .oneOf([NamespaceDefinitionType.source, NamespaceDefinitionType.destination, NamespaceDefinitionType.customformat]) + .required("form.empty.error"), + namespaceFormat: yup.string().when("namespaceDefinition", { + is: NamespaceDefinitionType.customformat, + then: yup.string().trim().required("form.empty.error"), + }), +}); + +export interface DestinationNamespaceFormValueType { + namespaceDefinition: NamespaceDefinitionType; + namespaceFormat: string; +} + +interface DestinationNamespaceModalProps { + initialValues: Pick; + onCloseModal: () => void; + onSubmit: (values: DestinationNamespaceFormValueType) => void; +} + +export const DestinationNamespaceModal: React.FC = ({ + initialValues, + onCloseModal, + onSubmit, +}) => { + const { formatMessage } = useIntl(); + + return ( + { + onCloseModal(); + onSubmit(values); + }} + > + {({ dirty, isValid, errors, values }) => ( +
+ +
+ + {({ field }: FieldProps) => ( + + + + } + value={NamespaceDefinitionType.source} + checked={field.value === NamespaceDefinitionType.source} + /> + )} + + + {({ field }: FieldProps) => ( + + + + } + value={NamespaceDefinitionType.destination} + checked={field.value === NamespaceDefinitionType.destination} + /> + )} + + + {({ field }: FieldProps) => ( + + + + } + value={NamespaceDefinitionType.customformat} + checked={field.value === NamespaceDefinitionType.customformat} + /> + )} + +
+ + {({ field, meta }: FieldProps) => ( + + )} + + {!!errors.namespaceFormat && ( + + + + )} +
+
+
+ {values.namespaceDefinition === NamespaceDefinitionType.source && ( + + )} + {(values.namespaceDefinition === NamespaceDefinitionType.destination || + values.namespaceDefinition === NamespaceDefinitionType.customformat) && ( + + )} + + + + +
+
+ + + + + + )} +
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.module.scss b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.module.scss new file mode 100644 index 000000000000..1991e143b5f3 --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.module.scss @@ -0,0 +1,50 @@ +@use "scss/colors"; +@use "scss/variables"; + +.exampleSettingsTable { + border-spacing: 0; + border-collapse: separate; + + tr { + th, td { + padding: variables.$spacing-md; + border-style: solid; + border-color: colors.$dark-blue-50; + border-width: 0 variables.$border-thin variables.$border-thin 0; + } + + th { + border-top-width: variables.$border-thin; + background-color: colors.$dark-blue-50; + text-align: left; + + .text { + color: colors.$grey-600; + } + } + + td { + background-color: colors.$white; + + &:first-child, th:first-child { + border-left-width: variables.$border-thin; + } + } + + &:first-child th:first-child { + border-top-left-radius: variables.$border-radius-xs; + } + + &:first-child th:last-child { + border-top-right-radius: variables.$border-radius-xs; + } + + &:last-child td:first-child { + border-bottom-left-radius: variables.$border-radius-xs; + } + + &:last-child td:last-child { + border-bottom-right-radius: variables.$border-radius-xs; + } + } +} diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.tsx b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.tsx new file mode 100644 index 000000000000..097b10c19bdc --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/ExampleSettingsTable.tsx @@ -0,0 +1,43 @@ +import React from "react"; + +import { Text } from "components/ui/Text"; + +import { NamespaceDefinitionType } from "core/request/AirbyteClient"; + +import styles from "./ExampleSettingsTable.module.scss"; +import { useExampleTableData } from "./useExampleSettingsTable"; + +interface ExampleSettingsTableProps { + namespaceDefinitionType: NamespaceDefinitionType; +} + +export const ExampleSettingsTable: React.FC = ({ namespaceDefinitionType }) => { + const { columns, data } = useExampleTableData(namespaceDefinitionType); + + return ( +
+ + + {columns.map((column, index) => ( + + ))} + + + + {data.map((row, rowIndex) => ( + + {columns.map((column, dataIndex) => ( + + ))} + + ))} + +
+ + {column.displayName} + +
+ {row[column.id]} +
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/useExampleSettingsTable.ts b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/useExampleSettingsTable.ts new file mode 100644 index 000000000000..1239b6549f21 --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/useExampleSettingsTable.ts @@ -0,0 +1,160 @@ +import { useIntl } from "react-intl"; + +import { NamespaceDefinitionType } from "core/request/AirbyteClient"; + +export const useExampleTableData = ( + namespaceDefinition: NamespaceDefinitionType +): { + columns: Array<{ id: string; displayName: string }>; + data: Array>; +} => { + const { formatMessage } = useIntl(); + + switch (namespaceDefinition) { + case NamespaceDefinitionType.source: + return { + columns: [ + { + id: "sourceNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.sourceNamespace", + }), + }, + { + id: "destinationNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.destinationNamespace", + }), + }, + ], + data: [ + { + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + }, + { + sourceNamespace: "", + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.mySchema", + }), + }, + ], + }; + case NamespaceDefinitionType.destination: + return { + columns: [ + { + id: "sourceNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.sourceNamespace", + }), + }, + { + id: "destinationNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.destinationNamespace", + }), + }, + ], + data: [ + { + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.mySchema", + }), + }, + { + sourceNamespace: "", + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.mySchema", + }), + }, + ], + }; + case NamespaceDefinitionType.customformat: + return { + columns: [ + { + id: "customFormat", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.customFormat", + }), + }, + { + id: "sourceNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.sourceNamespace", + }), + }, + { + id: "destinationNamespace", + displayName: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.header.destinationNamespace", + }), + }, + ], + data: [ + { + customFormat: formatMessage( + { + id: "connectionForm.modal.destinationNamespace.table.data.custom", + }, + { symbol: (node: React.ReactNode) => `"${node}"` } + ), + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage( + { + id: "connectionForm.modal.destinationNamespace.table.data.custom", + }, + { symbol: (node: React.ReactNode) => `${node}` } + ), + }, + { + customFormat: formatMessage( + { + id: "connectionForm.modal.destinationNamespace.table.data.exampleSourceNamespace", + }, + { symbol: (node: React.ReactNode) => `{${node}}` } + ), + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + }, + { + customFormat: formatMessage( + { + id: "connectionForm.modal.destinationNamespace.table.data.exampleMySourceNamespace", + }, + { symbol: (node: React.ReactNode) => `{${node}}` } + ), + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.myPublicSchema", + }), + }, + { + customFormat: "", + sourceNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.public", + }), + destinationNamespace: formatMessage({ + id: "connectionForm.modal.destinationNamespace.table.data.mySchema", + }), + }, + ], + }; + } +}; diff --git a/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.module.scss b/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.module.scss new file mode 100644 index 000000000000..41718b70754f --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.module.scss @@ -0,0 +1,29 @@ +@use "scss/colors"; +@use "scss/variables"; + +.content { + display: flex; + flex-direction: column; + margin: variables.$spacing-xl; +} + +.description { + color: colors.$grey; + margin-bottom: variables.$spacing-xl; +} + +.radioButton + .radioButton { + margin-top: variables.$spacing-xl; +} + +.input { + position: relative; + margin: variables.$spacing-xl 0 variables.$spacing-xl variables.$spacing-xl; + + .errorMessage { + position: absolute; + bottom: -16px; + left: 0; + color: colors.$red-600; + } +} diff --git a/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.tsx b/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.tsx new file mode 100644 index 000000000000..5887e2c7e8e2 --- /dev/null +++ b/airbyte-webapp/src/components/connection/DestinationStreamNamesModal/DestinationStreamNamesModal.tsx @@ -0,0 +1,141 @@ +import { Field, FieldProps, Form, Formik } from "formik"; +import React from "react"; +import { FormattedMessage, useIntl } from "react-intl"; +import * as yup from "yup"; + +import { LabeledRadioButton } from "components"; +import { Button } from "components/ui/Button"; +import { Input } from "components/ui/Input"; +import { ModalBody, ModalFooter } from "components/ui/Modal"; +import { Text } from "components/ui/Text"; +import { InfoTooltip } from "components/ui/Tooltip"; + +import { FormikConnectionFormValues } from "views/Connection/ConnectionForm/formConfig"; + +import styles from "./DestinationStreamNamesModal.module.scss"; + +export const enum StreamNameDefinitionValueType { + Mirror = "mirror", + Prefix = "prefix", +} + +export interface DestinationStreamNamesFormValueType { + streamNameDefinition: StreamNameDefinitionValueType; + prefix: string; +} + +const destinationStreamNamesValidationSchema = yup.object().shape({ + streamNameDefinition: yup + .string() + .oneOf([StreamNameDefinitionValueType.Mirror, StreamNameDefinitionValueType.Prefix]) + .required("form.empty.error"), + prefix: yup.string().when("streamNameDefinition", { + is: StreamNameDefinitionValueType.Prefix, + then: yup.string().trim().required("form.empty.error"), + }), +}); + +interface DestinationStreamNamesModalProps { + initialValues: Pick; + onCloseModal: () => void; + onSubmit: (value: DestinationStreamNamesFormValueType) => void; +} + +export const DestinationStreamNamesModal: React.FC = ({ + initialValues, + onCloseModal, + onSubmit, +}) => { + const { formatMessage } = useIntl(); + + return ( + { + onCloseModal(); + onSubmit(values); + }} + > + {({ dirty, isValid, errors, values }) => ( +
+ + + + + + {({ field }: FieldProps) => ( + + + + } + value={StreamNameDefinitionValueType.Mirror} + checked={field.value === StreamNameDefinitionValueType.Mirror} + /> + )} + + + {({ field }: FieldProps) => ( + + + + + + + } + value={StreamNameDefinitionValueType.Prefix} + checked={field.value === StreamNameDefinitionValueType.Prefix} + /> + )} + +
+ + {({ field, meta }: FieldProps) => ( + + )} + + {!!errors.prefix && ( + + + + )} +
+
+ + + + +
+ )} +
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/JobProgress/JobProgress.module.scss b/airbyte-webapp/src/components/connection/JobProgress/JobProgress.module.scss new file mode 100644 index 000000000000..21e0315ae22d --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/JobProgress.module.scss @@ -0,0 +1,23 @@ +@use "scss/variables"; +@use "scss/colors"; + +.estimationStats { + display: flex; + justify-content: space-between; +} + +.estimationDetails { + display: flex; + gap: variables.$spacing-lg; + margin: variables.$spacing-md 0; + + .icon { + color: colors.$grey-400; + margin-right: variables.$spacing-sm; + } +} + +.streams { + margin: variables.$spacing-md 0 0; + width: 100%; +} diff --git a/airbyte-webapp/src/components/connection/JobProgress/JobProgress.tsx b/airbyte-webapp/src/components/connection/JobProgress/JobProgress.tsx new file mode 100644 index 000000000000..07d546402350 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/JobProgress.tsx @@ -0,0 +1,126 @@ +import { faDatabase, faDiagramNext } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import classNames from "classnames"; +import { FormattedMessage, useIntl } from "react-intl"; + +import { getJobStatus } from "components/JobItem/JobItem"; +import { Text } from "components/ui/Text"; + +import { AttemptRead, AttemptStatus, SynchronousJobRead } from "core/request/AirbyteClient"; +import { JobsWithJobs } from "pages/ConnectionPage/pages/ConnectionItemPage/JobsList"; +import { formatBytes } from "utils/numberHelper"; + +import styles from "./JobProgress.module.scss"; +import { ProgressLine } from "./JobProgressLine"; +import { StreamProgress } from "./StreamProgress"; +import { progressBarCalculations } from "./utils"; + +function isJobsWithJobs(job: JobsWithJobs | SynchronousJobRead): job is JobsWithJobs { + return "attempts" in job; +} + +interface ProgressBarProps { + job: JobsWithJobs | SynchronousJobRead; + expanded?: boolean; +} + +export const JobProgress: React.FC = ({ job, expanded }) => { + const { formatMessage, formatNumber } = useIntl(); + + let latestAttempt: AttemptRead | undefined; + if (isJobsWithJobs(job) && job.attempts) { + latestAttempt = job.attempts[job.attempts.length - 1]; + } + if (!latestAttempt) { + return null; + } + + const jobStatus = getJobStatus(job); + if (["failed", "succeeded", "cancelled"].includes(jobStatus)) { + return null; + } + + const { + displayProgressBar, + totalPercentRecords, + timeRemaining, + numeratorBytes, + numeratorRecords, + denominatorRecords, + denominatorBytes, + elapsedTimeMS, + } = progressBarCalculations(latestAttempt); + + let timeRemainingString = ""; + if (elapsedTimeMS && timeRemaining) { + const minutesRemaining = Math.ceil(timeRemaining / 1000 / 60); + const hoursRemaining = Math.ceil(minutesRemaining / 60); + if (minutesRemaining <= 60) { + timeRemainingString = formatMessage({ id: "connection.progress.minutesRemaining" }, { value: minutesRemaining }); + } else { + timeRemainingString = formatMessage({ id: "connection.progress.hoursRemaining" }, { value: hoursRemaining }); + } + } + + return ( + + {displayProgressBar && ( + + )} + {latestAttempt?.status === AttemptStatus.running && ( + <> + {displayProgressBar && ( +
+ {timeRemaining < Infinity && timeRemaining > 0 && timeRemainingString} + {formatNumber(totalPercentRecords, { style: "percent", maximumFractionDigits: 0 })} +
+ )} + {expanded && ( + <> + {denominatorRecords > 0 && denominatorBytes > 0 && ( +
+ + + + + + + + +
+ )} + {latestAttempt.streamStats && ( +
+ {latestAttempt.streamStats + ?.map((stats) => ({ + ...stats, + done: (stats.stats.recordsEmitted ?? 0) >= (stats.stats.estimatedRecords ?? Infinity), + })) + // Move finished streams to the end of the list + .sort((a, b) => Number(a.done) - Number(b.done)) + .map((stream) => { + return ; + })} +
+ )} + + )} + + )} +
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.module.scss b/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.module.scss new file mode 100644 index 000000000000..d23bb032cb3d --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.module.scss @@ -0,0 +1,24 @@ +@use "scss/colors"; + +.lineOuter { + height: 5px; + width: 100%; + background-color: colors.$grey-100; + border-radius: 10px; + margin-top: 5px; + margin-bottom: 5px; +} + +.lineInner { + height: 100%; + border-radius: 10px; + transition: width 5s ease-in-out; + + &.warning { + background-color: colors.$yellow-400; + } + + &.default { + background-color: colors.$blue-200; + } +} diff --git a/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.tsx b/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.tsx new file mode 100644 index 000000000000..028b730261ed --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/JobProgressLine.tsx @@ -0,0 +1,29 @@ +// Inspired by https://dev.to/ramonak/react-how-to-create-a-custom-progress-bar-component-in-5-minutes-2lcl + +import classNames from "classnames"; +import { useIntl } from "react-intl"; + +import styles from "./JobProgressLine.module.scss"; + +interface ProgressLineProps { + type?: "default" | "warning"; + percent: number; +} + +export const ProgressLine: React.FC = ({ type = "default", percent }) => { + const { formatMessage } = useIntl(); + return ( +
+
+
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.module.scss b/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.module.scss new file mode 100644 index 000000000000..856d53279020 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.module.scss @@ -0,0 +1,73 @@ +@use "scss/variables"; +@use "scss/colors"; + +.stream { + display: inline-block; + padding: variables.$spacing-xs variables.$spacing-md; + background: colors.$blue-50; + border-radius: 16px; + margin-right: variables.$spacing-md; + margin-bottom: variables.$spacing-sm; + white-space: nowrap; + color: colors.$grey-700; + line-height: 16px; +} + +.wrapper { + display: flex; + align-items: center; + gap: variables.$spacing-sm; + min-height: 16px + 2 * variables.$spacing-xs; +} + +.progress { + justify-content: center; + align-items: center; + min-width: 16px; + margin: variables.$spacing-xs; + aspect-ratio: 1 / 1; + display: flex; + + .check { + fill: colors.$white; + display: none; + } + + .fg { + stroke: colors.$blue; + } + + .bg { + fill: colors.$white; + } + + &.done { + .bg { + fill: colors.$green; + } + + .fg { + display: none; + } + + .check { + display: block; + } + } +} + +.metrics { + margin: variables.$spacing-md 0 0; + display: grid; + grid-template-columns: max-content auto; + gap: variables.$spacing-md; + + dt { + grid-column-start: 1; + } + + dd { + margin: 0; + grid-column-start: 2; + } +} diff --git a/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.tsx b/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.tsx new file mode 100644 index 000000000000..b6b62d8cfc61 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/StreamProgress.tsx @@ -0,0 +1,96 @@ +import classNames from "classnames"; +import { FormattedMessage, FormattedNumber, useIntl } from "react-intl"; + +import { Text } from "components/ui/Text"; +import { Tooltip } from "components/ui/Tooltip"; + +import { AttemptStreamStats } from "core/request/AirbyteClient"; + +import styles from "./StreamProgress.module.scss"; + +interface StreamProgressProps { + stream: AttemptStreamStats; +} + +const CircleProgress: React.FC<{ percent: number }> = ({ percent }) => { + const svgClassName = classNames(styles.progress, { + [styles.done]: percent >= 1, + }); + + return ( + + + + + + ); +}; + +export const StreamProgress: React.FC = ({ stream }) => { + const { formatNumber } = useIntl(); + const { recordsEmitted, estimatedRecords } = stream.stats; + + const progress = estimatedRecords ? (recordsEmitted ?? 0) / estimatedRecords : undefined; + + return ( + + + {stream.streamName} {progress !== undefined && } + + + } + > + + + +
+
+ +
+
+ {progress !== undefined ? ( + + ) : ( + + )} +
+ {(estimatedRecords || recordsEmitted) && ( + <> +
+ +
+
+ {estimatedRecords ? ( + + ) : ( + + )} +
+ + )} +
+
+ ); +}; diff --git a/airbyte-webapp/src/components/connection/JobProgress/index.tsx b/airbyte-webapp/src/components/connection/JobProgress/index.tsx new file mode 100644 index 000000000000..5e1783a45577 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/index.tsx @@ -0,0 +1 @@ +export * from "./JobProgress"; diff --git a/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts b/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts new file mode 100644 index 000000000000..17b9d0861115 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts @@ -0,0 +1,61 @@ +import { AttemptRead, AttemptStats, AttemptStatus, AttemptStreamStats } from "core/request/AirbyteClient"; + +import { progressBarCalculations } from "./utils"; + +describe("#progressBarCalculations", () => { + it("for an attempt with no throughput information", () => { + const attempt = makeAttempt(); + const { displayProgressBar, totalPercentRecords } = progressBarCalculations(attempt); + + expect(displayProgressBar).toEqual(false); + expect(totalPercentRecords).toEqual(0); + }); + + it("for an attempt with total stats", () => { + const totalStats: AttemptStats = { recordsEmitted: 1, estimatedRecords: 100, bytesEmitted: 1, estimatedBytes: 50 }; + const attempt = makeAttempt(totalStats); + const { displayProgressBar, totalPercentRecords, elapsedTimeMS, timeRemaining } = progressBarCalculations(attempt); + + expect(displayProgressBar).toEqual(true); + expect(totalPercentRecords).toEqual(0.01); + expect(elapsedTimeMS).toEqual(10 * 1000); + expect(timeRemaining).toEqual(990 * 1000); + }); + + it("for an attempt with per-stream stats", () => { + const totalStats: AttemptStats = { recordsEmitted: 3, estimatedRecords: 300, bytesEmitted: 3, estimatedBytes: 300 }; + const streamStatsA: AttemptStreamStats = { + streamName: "A", + stats: { recordsEmitted: 1, estimatedRecords: 100, bytesEmitted: 1, estimatedBytes: 100 }, + }; + const streamStatsB: AttemptStreamStats = { + streamName: "B", + stats: { recordsEmitted: 2, estimatedRecords: 100, bytesEmitted: 2, estimatedBytes: 100 }, + }; + const streamStatsC: AttemptStreamStats = { + streamName: "C", + stats: {}, + }; + + const attempt = makeAttempt(totalStats, [streamStatsA, streamStatsB, streamStatsC]); + const { displayProgressBar, totalPercentRecords, elapsedTimeMS, timeRemaining } = progressBarCalculations(attempt); + + expect(displayProgressBar).toEqual(true); + expect(totalPercentRecords).toEqual(0.01); + expect(elapsedTimeMS).toEqual(10 * 1000); + expect(timeRemaining).toEqual(990 * 1000); + }); +}); + +const makeAttempt = ( + totalStats: AttemptStats = {}, + streamStats: AttemptStreamStats[] = [], + // API returns time in seconds + createdAt = Date.now() / 1000 - 10, + updatedAt = Date.now() / 1000, + id = 123, + status: AttemptStatus = "running" +) => { + const attempt: AttemptRead = { id, status, createdAt, updatedAt, totalStats, streamStats }; + return attempt; +}; diff --git a/airbyte-webapp/src/components/connection/JobProgress/utils.ts b/airbyte-webapp/src/components/connection/JobProgress/utils.ts new file mode 100644 index 000000000000..1f3a81e44d07 --- /dev/null +++ b/airbyte-webapp/src/components/connection/JobProgress/utils.ts @@ -0,0 +1,52 @@ +import { AttemptRead, AttemptStatus } from "core/request/AirbyteClient"; + +export const progressBarCalculations = (latestAttempt: AttemptRead) => { + let numeratorRecords = 0; + let denominatorRecords = 0; + let totalPercentRecords = 0; + let numeratorBytes = 0; + let denominatorBytes = 0; + let elapsedTimeMS = 0; + let timeRemaining = 0; + let displayProgressBar = true; + + if ( + latestAttempt.totalStats?.recordsEmitted !== undefined && + latestAttempt.totalStats?.estimatedRecords !== undefined && + latestAttempt.totalStats?.bytesEmitted !== undefined && + latestAttempt.totalStats?.estimatedBytes !== undefined + ) { + numeratorRecords = latestAttempt.totalStats.recordsEmitted; + denominatorRecords = latestAttempt.totalStats.estimatedRecords; + numeratorBytes = latestAttempt.totalStats.bytesEmitted; + denominatorBytes = latestAttempt.totalStats.estimatedBytes; + } else if (latestAttempt.streamStats) { + for (const stream of latestAttempt.streamStats) { + numeratorRecords += stream.stats.recordsEmitted ?? 0; + denominatorRecords += stream.stats.estimatedRecords ?? 0; + numeratorBytes += stream.stats.bytesEmitted ?? 0; + denominatorBytes += stream.stats.estimatedBytes ?? 0; + } + } + + totalPercentRecords = denominatorRecords > 0 ? numeratorRecords / denominatorRecords : 0; + + // chose to estimate time remaining based on records rather than bytes + if (latestAttempt.status === AttemptStatus.running && denominatorRecords > 0) { + elapsedTimeMS = Date.now() - latestAttempt.createdAt * 1000; + timeRemaining = Math.floor(elapsedTimeMS / totalPercentRecords) * (1 - totalPercentRecords); // in ms + } else { + displayProgressBar = false; + } + + return { + displayProgressBar, + totalPercentRecords, + timeRemaining, + numeratorBytes, + numeratorRecords, + denominatorRecords, + denominatorBytes, + elapsedTimeMS, + }; +}; diff --git a/airbyte-webapp/src/components/connection/UpdateConnectionDataResidency/UpdateConnectionDataResidency.tsx b/airbyte-webapp/src/components/connection/UpdateConnectionDataResidency/UpdateConnectionDataResidency.tsx index 3f2cbfadb03c..bff661856ad9 100644 --- a/airbyte-webapp/src/components/connection/UpdateConnectionDataResidency/UpdateConnectionDataResidency.tsx +++ b/airbyte-webapp/src/components/connection/UpdateConnectionDataResidency/UpdateConnectionDataResidency.tsx @@ -5,6 +5,7 @@ import { DataGeographyDropdown } from "components/common/DataGeographyDropdown"; import { ControlLabels } from "components/LabeledControl"; import { Card } from "components/ui/Card"; import { Spinner } from "components/ui/Spinner"; +import { ToastType } from "components/ui/Toast"; import { Geography } from "core/request/AirbyteClient"; import { useConnectionEditService } from "hooks/services/ConnectionEdit/ConnectionEditService"; @@ -32,8 +33,8 @@ export const UpdateConnectionDataResidency: React.FC = () => { } catch (e) { registerNotification({ id: "connection.geographyUpdateError", - title: formatMessage({ id: "connection.geographyUpdateError" }), - isError: true, + text: formatMessage({ id: "connection.geographyUpdateError" }), + type: ToastType.ERROR, }); } setSelectedValue(undefined); diff --git a/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx b/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx index 91df9c5330c6..37a67a28b64f 100644 --- a/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx @@ -6,7 +6,7 @@ import { useDebounce, useLocalStorage } from "react-use"; import { CodeEditor } from "components/ui/CodeEditor"; -import { StreamsListRequestBodyManifest } from "core/request/ConnectorBuilderClient"; +import { ConnectorManifest } from "core/request/ConnectorBuilderClient"; import { useManifestTemplate } from "services/connectorBuilder/ConnectorBuilderApiService"; import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService"; @@ -30,7 +30,7 @@ export const YamlEditor: React.FC = () => { const yamlEditorModel = yamlEditorRef.current.getModel(); try { - const json = load(yamlValue) as StreamsListRequestBodyManifest; + const json = load(yamlValue) as ConnectorManifest; setJsonManifest(json); setYamlIsValid(true); diff --git a/airbyte-webapp/src/components/destination/DestinationForm/DestinationForm.tsx b/airbyte-webapp/src/components/destination/DestinationForm/DestinationForm.tsx index 7a47baafbbed..e5979698ab07 100644 --- a/airbyte-webapp/src/components/destination/DestinationForm/DestinationForm.tsx +++ b/airbyte-webapp/src/components/destination/DestinationForm/DestinationForm.tsx @@ -20,7 +20,7 @@ interface DestinationFormProps { serviceType: string; destinationDefinitionId?: string; connectionConfiguration?: ConnectionConfiguration; - }) => void; + }) => Promise; destinationDefinitions: DestinationDefinitionRead[]; hasSuccess?: boolean; error?: FormError | null; diff --git a/airbyte-webapp/src/components/icons/ArrowRightIcon.tsx b/airbyte-webapp/src/components/icons/ArrowRightIcon.tsx new file mode 100644 index 000000000000..d1d897f27739 --- /dev/null +++ b/airbyte-webapp/src/components/icons/ArrowRightIcon.tsx @@ -0,0 +1,8 @@ +export const ArrowRightIcon = ({ color = "currentColor" }: { color?: string }) => ( + + + +); diff --git a/airbyte-webapp/src/components/icons/ModificationIcon.tsx b/airbyte-webapp/src/components/icons/ModificationIcon.tsx index 0804f327b6c3..efe57b2db19a 100644 --- a/airbyte-webapp/src/components/icons/ModificationIcon.tsx +++ b/airbyte-webapp/src/components/icons/ModificationIcon.tsx @@ -1,17 +1,22 @@ -export const ModificationIcon: React.FC = () => { +import { theme } from "theme"; +interface ModificationIconProps { + color?: string; +} + +export const ModificationIcon: React.FC = ({ color = theme.blue100 }) => { return ( ); diff --git a/airbyte-webapp/src/components/ui/Button/Button.module.scss b/airbyte-webapp/src/components/ui/Button/Button.module.scss index 1358b7fbc546..55dfdaa9362c 100644 --- a/airbyte-webapp/src/components/ui/Button/Button.module.scss +++ b/airbyte-webapp/src/components/ui/Button/Button.module.scss @@ -13,6 +13,7 @@ font-weight: 600; cursor: pointer; transition: 0.2s ease-in; + white-space: nowrap; &.full { width: 100%; diff --git a/airbyte-webapp/src/components/ui/DatePicker/DatePicker.module.scss b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.module.scss new file mode 100644 index 000000000000..0de73d5ca554 --- /dev/null +++ b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.module.scss @@ -0,0 +1,146 @@ +/* stylelint-disable selector-class-pattern, no-descending-specificity */ + +@use "scss/colors"; +@use "scss/fonts"; +@use "scss/variables"; +@use "scss/z-indices"; + +.wrapper { + position: relative; +} + +.datepickerButtonContainer { + position: absolute; + right: 0; + top: 0; + display: flex; + height: 100%; + align-items: center; + justify-content: center; + border: none; +} + +.datepickerButton svg { + font-size: 14px; +} + +.popup { + z-index: z-indices.$datepicker; +} + +.input { + padding-right: 25px; +} + +:global(.react-datepicker) { + display: flex; + color: colors.$dark-blue-900; + font-family: fonts.$primary; + border: variables.$border-thick solid colors.$grey-100; + border-radius: variables.$border-radius-md; + box-shadow: 2px 2px 20px -6px colors.$grey-200; +} + +/** Main calendar area **/ +:global(.react-datepicker__header) { + background-color: colors.$grey-50; + border-top-right-radius: variables.$border-radius-md; + border-top-left-radius: variables.$border-radius-md; + border-bottom: none; +} + +:global(.react-datepicker__header.react-datepicker__header--has-time-select) { + border-top-right-radius: 0; +} + +:global(.react-datepicker__header:not(.react-datepicker__header--has-time-select)) { + border-top-right-radius: variables.$border-radius-md; +} + +:global(.react-datepicker__day-name) { + color: colors.$grey-300; +} + +:global(.react-datepicker__current-month) { + color: colors.$dark-blue-900; + font-weight: 500; + margin-bottom: variables.$spacing-md; +} + +:global(.react-datepicker__day) { + color: colors.$dark-blue-900; + background-color: transparent; + border-radius: variables.$border-radius-xs; + + &:hover { + background-color: colors.$grey-100; + } +} + +:global(.react-datepicker__day--outside-month) { + color: colors.$grey-300; +} + +:global(.react-datepicker__day--today) { + background-color: colors.$grey-50; + font-weight: 700; +} + +:global(.react-datepicker__day--selected) { + color: colors.$white; + background-color: colors.$blue-400; + font-weight: 700; + + &:hover { + background-color: colors.$blue-500; + } +} + +:global(.react-datepicker__navigation-icon::before) { + border-width: 2px 2px 0 0; +} + +/** Time **/ +:global(.react-datepicker__time-container) { + border-left-color: colors.$grey-100; + border-left-width: variables.$border-thick; + border-bottom-right-radius: variables.$border-radius-md; + overflow: hidden; +} + +:global(.react-datepicker-time__header) { + font-weight: 500; + color: colors.$dark-blue-900; +} + +:global(.react-datepicker__time-list-item) { + background-color: transparent; + display: flex; + justify-content: center; + align-items: center; + + &:hover { + background-color: colors.$grey-100; + } +} + +:global(.react-datepicker__time-container + .react-datepicker__time + .react-datepicker__time-box + ul.react-datepicker__time-list + li.react-datepicker__time-list-item) { + justify-content: center; +} + +:global(.react-datepicker__time-container + .react-datepicker__time + .react-datepicker__time-box + ul.react-datepicker__time-list + li.react-datepicker__time-list-item--selected) { + color: colors.$white; + background-color: colors.$blue-400; + + &:hover { + background-color: colors.$blue-500; + } +} diff --git a/airbyte-webapp/src/components/ui/DatePicker/DatePicker.test.tsx b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.test.tsx new file mode 100644 index 000000000000..5b6ca56dac31 --- /dev/null +++ b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.test.tsx @@ -0,0 +1,147 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import dayjs from "dayjs"; +import { TestWrapper } from "test-utils/testutils"; +import timezoneMock from "timezone-mock"; + +import { DatePicker, toEquivalentLocalTime } from "./DatePicker"; + +describe(`${toEquivalentLocalTime.name}`, () => { + // Seems silly, but dayjs has a bug when formatting years, so this is a useful test: + // https://github.com/iamkun/dayjs/issues/1745 + it("handles a date in the year 1", () => { + const TEST_UTC_TIMESTAMP = "0001-12-01T09:00:00Z"; + + const result = toEquivalentLocalTime(TEST_UTC_TIMESTAMP); + + expect(result).toEqual(undefined); + }); + + it("handles an invalid date", () => { + const TEST_UTC_TIMESTAMP = "not a date"; + + const result = toEquivalentLocalTime(TEST_UTC_TIMESTAMP); + + expect(result).toEqual(undefined); + }); + + it("outputs the same YYYY-MM-DDTHH:mm:ss", () => { + timezoneMock.register("Etc/GMT+10"); + const TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES = 600; // corresponds to GMT+10 + const TEST_UTC_TIMESTAMP = "2000-01-01T12:00:00Z"; + + const result = toEquivalentLocalTime(TEST_UTC_TIMESTAMP); + + // Regardless of the timezone, the local time should be the same + expect(dayjs(result).format().substring(0, 19)).toEqual(TEST_UTC_TIMESTAMP.substring(0, 19)); + expect(result?.getTimezoneOffset()).toEqual(TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES); + }); + + it("converts utc time to equivalent local time in PST", () => { + timezoneMock.register("US/Pacific"); + const TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES = 480; // corresponds to the registered mock timezone + const TEST_UTC_TIMESTAMP = "2022-01-01T00:00:00Z"; + + const expectedDateObject = dayjs + .utc(TEST_UTC_TIMESTAMP) + .add(TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES, "minutes") + .toDate(); + + expect(toEquivalentLocalTime(TEST_UTC_TIMESTAMP)).toEqual(expectedDateObject); + }); + + it("converts utc time to equivalent local time in EST", () => { + timezoneMock.register("US/Eastern"); + const TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES = 300; // corresponds to the registered mock timezone + const TEST_UTC_TIMESTAMP = "2022-01-01T00:00:00Z"; + + const expectedDateObject = dayjs + .utc(TEST_UTC_TIMESTAMP) + .add(TEST_TIMEZONE_UTC_OFFSET_IN_MINUTES, "minutes") + .toDate(); + + expect(toEquivalentLocalTime(TEST_UTC_TIMESTAMP)).toEqual(expectedDateObject); + }); + + it("keeps a utc timestamp exactly the same", () => { + timezoneMock.register("UTC"); + const TEST_UTC_TIMESTAMP = "2022-01-01T00:00:00Z"; + + const expectedDateObject = dayjs.utc(TEST_UTC_TIMESTAMP).toDate(); + + expect(toEquivalentLocalTime(TEST_UTC_TIMESTAMP)).toEqual(expectedDateObject); + }); + + afterEach(() => { + // Return global Date() object to system behavior + timezoneMock.unregister(); + }); +}); + +describe(`${DatePicker.name}`, () => { + it("allows typing a date manually", async () => { + const MOCK_DESIRED_DATETIME = "2010-09-12T00:00:00Z"; + let mockValue = ""; + render( + + { + // necessary for controlled inputs https://github.com/testing-library/user-event/issues/387#issuecomment-819868799 + mockValue = mockValue + value; + }} + value={mockValue} + /> + + ); + + const input = screen.getByTestId("input"); + await userEvent.type(input, MOCK_DESIRED_DATETIME, { delay: 1 }); + + expect(mockValue).toEqual(MOCK_DESIRED_DATETIME); + }); + + it("allows selecting a date from the datepicker", async () => { + jest.useFakeTimers().setSystemTime(new Date("2010-09-05")); + const MOCK_DESIRED_DATETIME = "2010-09-12"; + let mockValue = ""; + render( + + { + // necessary for controlled inputs https://github.com/testing-library/user-event/issues/387#issuecomment-819868799 + mockValue = mockValue + value; + }} + value={mockValue} + /> + + ); + + const datepicker = screen.getByLabelText("Open datepicker"); + userEvent.click(datepicker); + const date = screen.getByLabelText("Choose Sunday, September 12th, 2010"); + userEvent.click(date); + + expect(mockValue).toEqual(MOCK_DESIRED_DATETIME); + jest.useRealTimers(); + }); + + it("focuses the input after selecting a date from the datepicker", async () => { + jest.useFakeTimers().setSystemTime(new Date("2010-09-05")); + let mockValue = ""; + render( + + (mockValue = value)} value={mockValue} /> + + ); + + const datepicker = screen.getByLabelText("Open datepicker"); + userEvent.click(datepicker); + const date = screen.getByLabelText("Choose Sunday, September 12th, 2010"); + userEvent.click(date); + + const input = screen.getByTestId("input"); + + expect(input).toHaveFocus(); + jest.useRealTimers(); + }); +}); diff --git a/airbyte-webapp/src/components/ui/DatePicker/DatePicker.tsx b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.tsx new file mode 100644 index 000000000000..c64055111126 --- /dev/null +++ b/airbyte-webapp/src/components/ui/DatePicker/DatePicker.tsx @@ -0,0 +1,164 @@ +import { faCalendarAlt } from "@fortawesome/free-regular-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import en from "date-fns/locale/en-US"; +import dayjs from "dayjs"; +import React, { useCallback, useEffect, useMemo, useRef } from "react"; +import ReactDatePicker, { registerLocale } from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import { useIntl } from "react-intl"; + +import { Button } from "../Button"; +import { Input } from "../Input"; +import styles from "./DatePicker.module.scss"; + +/** + * Converts a UTC string into a JS Date object with the same local time + * + * Necessary because react-datepicker does not allow us to set the timezone to UTC, only the current browser time. + * In order to display the UTC timezone in the datepicker, we need to convert it into the local time: + * + * 2022-01-01T09:00:00Z - the UTC format that airbyte-server expects (e.g. 9:00am) + * 2022-01-01T10:00:00+01:00 - what react-datepicker might convert this date into and display (e.g. 10:00am - bad!) + * 2022-01-01T09:00:00+01:00 - what we give react-datepicker instead, to trick it (User sees 9:00am - good!) + */ +export const toEquivalentLocalTime = (input: string): Date | undefined => { + if (!input) { + return undefined; + } + + const date = dayjs.utc(input); + + if (!date?.isValid()) { + return undefined; + } + + // Get the user's UTC offset based on the local time + const browserUtcOffset = dayjs().utcOffset(); + + // Convert the selected date into a string which we can use to initialize a new date object. + // The second parameter to utcOffset() keeps the same local time, only changing the timezone. + const dateInUtcAsString = date.utcOffset(browserUtcOffset, true).format(); + + const equivalentDate = dayjs(dateInUtcAsString); + + // dayjs does not 0-pad years when formatting, so it's possible to have an invalid date here + // https://github.com/iamkun/dayjs/issues/1745 + if (!equivalentDate.isValid()) { + return undefined; + } + + return equivalentDate.toDate(); +}; + +export interface DatePickerProps { + error?: boolean; + value: string; + onChange: (value: string) => void; + withTime?: boolean; + disabled?: boolean; + onBlur?: () => void; + placeholder?: string; +} + +interface DatePickerButtonTriggerProps { + onClick?: () => void; +} + +const DatepickerButton = React.forwardRef(({ onClick }, ref) => { + const { formatMessage } = useIntl(); + + return ( +
); -}; +}); diff --git a/airbyte-webapp/src/components/ui/NextTable/NextTable.module.scss b/airbyte-webapp/src/components/ui/NextTable/NextTable.module.scss new file mode 100644 index 000000000000..0cd535690266 --- /dev/null +++ b/airbyte-webapp/src/components/ui/NextTable/NextTable.module.scss @@ -0,0 +1,74 @@ +@use "scss/colors"; +@use "scss/variables" as vars; + +// ------- -------- +.table { + border-spacing: 0; + width: 100%; + max-width: 100%; + border-radius: vars.$border-radius-md; +} + +.thead { + position: sticky; + top: 0; +} + +// --------- --------- +.tr { + background: colors.$white; + cursor: auto; + + &:hover { + background-color: colors.$grey-50; + } +} + +// ---------
--------- +.th { + background: colors.$grey-50; + color: colors.$grey; + text-transform: uppercase; + border-bottom: none; + text-align: left; + font-size: 10px; + line-height: 12px; + font-weight: 600; + + &:first-child { + padding-left: calc(vars.$spacing-2xl + vars.$spacing-sm); + border-radius: vars.$border-radius-md 0 0; + } + + &:last-child { + padding-left: vars.$spacing-lg; + border-radius: 0 vars.$border-radius-md 0 0; + } +} + +// ---------
--------- + +.td { + padding: vars.$spacing-lg calc(vars.$spacing-md + vars.$spacing-xs); + font-size: 12px; + line-height: 15px; + font-weight: normal; + color: colors.$dark-blue; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border-bottom: vars.$border-thin solid colors.$grey-100; + width: auto; + + tr:last-child > & { + border-bottom: none; + + &:first-child { + border-radius: 0 0 0 vars.$border-radius-md; + } + + &:last-child { + border-radius: 0 0 vars.$border-radius-md; + } + } +} diff --git a/airbyte-webapp/src/components/ui/NextTable/NextTable.test.tsx b/airbyte-webapp/src/components/ui/NextTable/NextTable.test.tsx new file mode 100644 index 000000000000..563087563f0c --- /dev/null +++ b/airbyte-webapp/src/components/ui/NextTable/NextTable.test.tsx @@ -0,0 +1,41 @@ +import { ColumnDef } from "@tanstack/react-table"; +import { render } from "@testing-library/react"; + +import { NextTable } from "./NextTable"; + +interface Item { + name: string; + value: number; +} + +describe("", () => { + it("should should render the table with passed data", () => { + const data: Item[] = [ + { name: "2017", value: 100 }, + { name: "2018", value: 300 }, + { name: "2019", value: 500 }, + { name: "2020", value: 400 }, + { name: "2021", value: 200 }, + ]; + + const columns: Array> = [ + { + header: "Name", + accessorKey: "name", + cell: ({ getValue }) => {getValue()}, + }, + { + header: "Value", + accessorKey: "value", + cell: ({ getValue }) => getValue(), + }, + ]; + + const { getByText, container } = render( columns={columns} data={data} />); + expect(getByText(/2019/)).toBeInTheDocument(); + expect(getByText(/500/)).toBeInTheDocument(); + + expect(container.querySelectorAll("thead tr")).toHaveLength(1); + expect(container.querySelectorAll("tbody tr")).toHaveLength(data.length); + }); +}); diff --git a/airbyte-webapp/src/components/ui/NextTable/NextTable.tsx b/airbyte-webapp/src/components/ui/NextTable/NextTable.tsx new file mode 100644 index 000000000000..0c3276a6d195 --- /dev/null +++ b/airbyte-webapp/src/components/ui/NextTable/NextTable.tsx @@ -0,0 +1,54 @@ +import { ColumnDef, flexRender, useReactTable, getCoreRowModel } from "@tanstack/react-table"; +import classNames from "classnames"; +import { PropsWithChildren } from "react"; + +import styles from "./NextTable.module.scss"; + +export interface TableProps { + data: TData[]; + columns: Array>; + onClickRow?: (data: unknown) => void; + className?: string; +} + +export const NextTable = ({ columns, data, onClickRow, className }: PropsWithChildren>) => { + const table = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + }); + + return ( + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + ))} + + ))} + + + {table.getRowModel().rows.map((row) => ( + onClickRow?.(row.original)}> + {row.getVisibleCells().map((cell) => ( + + ))} + + ))} + +
+ {flexRender(header.column.columnDef.header, header.getContext())} +
+ {flexRender(cell.column.columnDef.cell, cell.getContext())} +
+ ); +}; diff --git a/airbyte-webapp/src/components/ui/NextTable/index.stories.tsx b/airbyte-webapp/src/components/ui/NextTable/index.stories.tsx new file mode 100644 index 000000000000..f50a67933058 --- /dev/null +++ b/airbyte-webapp/src/components/ui/NextTable/index.stories.tsx @@ -0,0 +1,47 @@ +import { ComponentMeta, Story } from "@storybook/react"; +import { ColumnDef } from "@tanstack/react-table"; + +import { NextTable, TableProps } from "./NextTable"; + +interface Item { + name: string; + value: number; +} + +export default { + title: "UI/NextTable", + component: NextTable, + argTypes: {}, +} as ComponentMeta; + +const Template = + (): Story> => + (args) => + {...args} />; + +const data: Item[] = [ + { name: "2017", value: 100 }, + { name: "2018", value: 300 }, + { name: "2019", value: 500 }, + { name: "2020", value: 400 }, + { name: "2021", value: 200 }, +]; + +const columns: Array> = [ + { + header: "Name", + accessorKey: "name", + cell: ({ getValue }) => {getValue()}, + }, + { + header: "Value", + accessorKey: "value", + cell: ({ getValue }) => getValue(), + }, +]; + +export const Primary = Template().bind({}); +Primary.args = { + data, + columns, +}; diff --git a/airbyte-webapp/src/components/ui/NextTable/index.ts b/airbyte-webapp/src/components/ui/NextTable/index.ts new file mode 100644 index 000000000000..5b167c2bf40c --- /dev/null +++ b/airbyte-webapp/src/components/ui/NextTable/index.ts @@ -0,0 +1 @@ +export * from "./NextTable"; diff --git a/airbyte-webapp/src/components/ui/RadioButton/index.stories.tsx b/airbyte-webapp/src/components/ui/RadioButton/index.stories.tsx new file mode 100644 index 000000000000..a0ab8d854877 --- /dev/null +++ b/airbyte-webapp/src/components/ui/RadioButton/index.stories.tsx @@ -0,0 +1,17 @@ +import { ComponentMeta, ComponentStory } from "@storybook/react"; + +import { RadioButton } from "./RadioButton"; + +export default { + title: "Ui/RadioButton", + component: RadioButton, + argTypes: { + disabled: { control: "boolean" }, + checked: { control: "boolean" }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ; + +export const Default = Template.bind({}); +Default.args = {}; diff --git a/airbyte-webapp/src/components/ui/TagInput/TagInput.module.scss b/airbyte-webapp/src/components/ui/TagInput/TagInput.module.scss index 161854402449..3e5ae82b39cd 100644 --- a/airbyte-webapp/src/components/ui/TagInput/TagInput.module.scss +++ b/airbyte-webapp/src/components/ui/TagInput/TagInput.module.scss @@ -3,6 +3,11 @@ :export { backgroundColor: colors.$dark-blue-800; + inputBackgroundColor: colors.$grey-50; + focusedBorderColor: colors.$blue-400; + hoveredBorderColor: colors.$grey-100; + errorBorderColor: colors.$red-100; + errorHoveredBorderColor: colors.$red-300; fontColor: colors.$white; borderRadius: variables.$border-radius-md; paddingLeft: variables.$spacing-sm; diff --git a/airbyte-webapp/src/components/ui/TagInput/TagInput.tsx b/airbyte-webapp/src/components/ui/TagInput/TagInput.tsx index 8a368bae2bde..68b554dce6f3 100644 --- a/airbyte-webapp/src/components/ui/TagInput/TagInput.tsx +++ b/airbyte-webapp/src/components/ui/TagInput/TagInput.tsx @@ -1,6 +1,6 @@ import uniqueId from "lodash/uniqueId"; import { KeyboardEventHandler, useMemo, useState } from "react"; -import { ActionMeta, MultiValue, OnChangeValue } from "react-select"; +import { ActionMeta, GroupBase, MultiValue, OnChangeValue, StylesConfig } from "react-select"; import CreatableSelect from "react-select/creatable"; import styles from "./TagInput.module.scss"; @@ -9,9 +9,8 @@ const components = { DropdownIndicator: null, }; -const customStyles = { - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- react-select's typing is lacking here - multiValue: (provided: any) => ({ +const customStyles: StylesConfig> = { + multiValue: (provided) => ({ ...provided, maxWidth: "100%", display: "flex", @@ -20,17 +19,35 @@ const customStyles = { borderRadius: `${styles.borderRadius}`, paddingLeft: `${styles.paddingLeft}`, }), - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same as above - multiValueLabel: (provided: any) => ({ + multiValueLabel: (provided) => ({ ...provided, color: `${styles.fontColor}`, fontWeight: 500, }), - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- same as above - multiValueRemove: (provided: any) => ({ + multiValueRemove: (provided) => ({ ...provided, borderRadius: `${styles.borderRadius}`, + cursor: "pointer", }), + clearIndicator: (provided) => ({ + ...provided, + cursor: "pointer", + }), + control: (provided, state) => { + const isInvalid = state.selectProps["aria-invalid"]; + const regularBorderColor = isInvalid ? styles.errorBorderColor : "transparent"; + const hoveredBorderColor = isInvalid ? styles.errorHoveredBorderColor : styles.hoveredBorderColor; + return { + ...provided, + backgroundColor: styles.inputBackgroundColor, + boxShadow: "none", + borderColor: state.isFocused ? styles.focusedBorderColor : regularBorderColor, + ":hover": { + cursor: "text", + borderColor: state.isFocused ? styles.focusedBorderColor : hoveredBorderColor, + }, + }; + }, }; interface Tag { @@ -56,7 +73,7 @@ const generateStringFromTag = (tag: Tag): string => tag.label; const delimiters = [",", ";"]; -export const TagInput: React.FC = ({ onChange, fieldValue, name, disabled, id }) => { +export const TagInput: React.FC = ({ onChange, fieldValue, name, disabled, id, error }) => { const tags = useMemo(() => fieldValue.map(generateTagFromString), [fieldValue]); // input value is a tag draft @@ -113,13 +130,26 @@ export const TagInput: React.FC = ({ onChange, fieldValue, name, } }; + /** + * Add current input value as new tag when leaving the control. + * This needs to be implemented outside of the onBlur prop of react-select because it's not default behavior. + */ + const onBlurControl = () => { + if (inputValue) { + onChange([...fieldValue, inputValue]); + setInputValue(""); + } + }; + return ( -
+
handleDelete} diff --git a/airbyte-webapp/src/components/ui/Text/Text.tsx b/airbyte-webapp/src/components/ui/Text/Text.tsx index b7ea9f6a45c9..2290ee5f083a 100644 --- a/airbyte-webapp/src/components/ui/Text/Text.tsx +++ b/airbyte-webapp/src/components/ui/Text/Text.tsx @@ -12,9 +12,15 @@ interface TextProps { as?: TextElementType; size?: TextSize; bold?: boolean; + inverseColor?: boolean; } -const getTextClassNames = ({ size, centered, bold }: Required>) => { +const getTextClassNames = ({ + size, + centered, + bold, + inverseColor, +}: Required>) => { const sizes: Record = { xs: styles.xs, sm: styles.sm, @@ -22,7 +28,11 @@ const getTextClassNames = ({ size, centered, bold }: Required> = React.memo( @@ -33,9 +43,10 @@ export const Text: React.FC> = React.memo( children, className: classNameProp, size = "md", + inverseColor = false, ...remainingProps }) => { - const className = classNames(getTextClassNames({ centered, size, bold }), classNameProp); + const className = classNames(getTextClassNames({ centered, size, bold, inverseColor }), classNameProp); return React.createElement(as, { ...remainingProps, diff --git a/airbyte-webapp/src/components/ui/Text/text.module.scss b/airbyte-webapp/src/components/ui/Text/text.module.scss index b60be9d3e8c2..dde05c971575 100644 --- a/airbyte-webapp/src/components/ui/Text/text.module.scss +++ b/airbyte-webapp/src/components/ui/Text/text.module.scss @@ -4,6 +4,10 @@ color: colors.$dark-blue; margin: 0; padding: 0; + + &.inverse { + color: colors.$white; + } } .sm, diff --git a/airbyte-webapp/src/components/ui/Toast/ErrorSign.tsx b/airbyte-webapp/src/components/ui/Toast/ErrorSign.tsx deleted file mode 100644 index d0e0e7fb7842..000000000000 --- a/airbyte-webapp/src/components/ui/Toast/ErrorSign.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { faExclamation } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React from "react"; -import styled from "styled-components"; - -const ErrorIcon = styled.div` - width: 28px; - min-width: 28px; - height: 28px; - border-radius: 50%; - margin-right: 11px; - display: flex; - justify-content: center; - align-items: center; - background: ${({ theme }) => theme.dangerColor}; - border: 1px solid ${({ theme }) => theme.mediumPrimaryColor20}; -`; - -const ExclamationLight = styled(FontAwesomeIcon)` - font-size: 16px; - color: ${({ theme }) => theme.whiteColor}; -`; - -export const ErrorSign: React.FC = () => ( - - - -); diff --git a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss index 0bf06de4cd58..42d4ac5840fe 100644 --- a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss +++ b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss @@ -1,3 +1,98 @@ +@use "scss/colors"; +@use "scss/variables" as vars; +@use "scss/z-indices"; +@use "scss/mixins"; + +$toast-icon-size: 13px; +$toast-icon-container-size: 34px; +$toast-bottom-margin: 27px; + +@keyframes slide-up-animations { + 0% { + transform: translate(-50%, -100%); + bottom: -60px; + } + + 100% { + transform: translate(-50%, 0); + bottom: $toast-bottom-margin; + } +} + +@mixin type($name, $color, $background) { + &.#{$name} { + background-color: $background; + border: 1px solid $color; + + .iconContainer { + background-color: $color; + } + + .toastIcon { + color: $color; + } + } +} + +.toastContainer { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: vars.$spacing-md; + max-width: vars.$width-max-notification; + position: fixed; + box-sizing: border-box; + bottom: $toast-bottom-margin; + left: 50%; + transform: translate(-50%, 0); + z-index: z-indices.$notification; + padding: vars.$spacing-md; + border-radius: vars.$border-radius-md; + animation: slide-up-animations 0.25s ease-out; + + @include mixins.shadow; + + @include type("info", colors.$blue-400, colors.$blue-50); + @include type("warning", colors.$yellow-500, colors.$yellow-50); + @include type("success", colors.$green-200, colors.$green-50); + @include type("error", colors.$red-300, colors.$red-50); +} + +.iconContainer { + width: $toast-icon-container-size; + height: $toast-icon-container-size; + max-height: $toast-icon-container-size; + min-width: $toast-icon-container-size; + padding: vars.$border-radius-md; + border-radius: vars.$border-radius-md; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; +} + +.toastIcon { + width: $toast-icon-size; + height: $toast-icon-size; + background: colors.$white; + border-radius: 50%; +} + +.textContainer { + align-self: center; +} + +.text { + line-height: 17px; + text-align: left; +} + +.actionButton { + margin-top: vars.$spacing-xs; +} + .closeButton { - margin-left: 10px; + svg { + color: colors.$dark-blue-900; + } } diff --git a/airbyte-webapp/src/components/ui/Toast/Toast.tsx b/airbyte-webapp/src/components/ui/Toast/Toast.tsx index c0eec9417009..ef018b6e1869 100644 --- a/airbyte-webapp/src/components/ui/Toast/Toast.tsx +++ b/airbyte-webapp/src/components/ui/Toast/Toast.tsx @@ -1,86 +1,64 @@ -import { faTimes } from "@fortawesome/free-solid-svg-icons"; +import { faCheck, faExclamation, faTimes } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import classNames from "classnames"; import React from "react"; -import styled, { keyframes } from "styled-components"; -import { H5 } from "components/base/Titles"; +import { CrossIcon } from "components/icons/CrossIcon"; +import { Text } from "components/ui/Text"; import { Button } from "../Button"; -import { ErrorSign } from "./ErrorSign"; import styles from "./Toast.module.scss"; -interface ToastProps { - title: string | React.ReactNode; - text?: string | React.ReactNode; - hasError?: boolean; - onClose?: () => void; +export const enum ToastType { + WARNING = "warning", + SUCCESS = "success", + ERROR = "error", + INFO = "info", } -export const SlideUpAnimation = keyframes` - 0% { - translate(-50%, -100%); - bottom: -49px; - } - 100% { - translate(-50%, 0); - bottom: 49px; - } -`; - -const Singleton = styled.div<{ hasError?: boolean }>` - position: fixed; - bottom: 49px; - left: 50%; - transform: translate(-50%, 0); - z-index: 20; - - padding: 25px 25px 22px; - - background: ${({ theme, hasError }) => (hasError ? theme.lightDangerColor : theme.lightPrimaryColor)}; - border: 1px solid ${({ theme }) => theme.greyColor20}; - box-shadow: 0 1px 2px ${({ theme }) => theme.shadowColor}; - border-radius: 8px; - - display: flex; - flex-direction: row; - align-items: center; - - animation: ${SlideUpAnimation} 0.25s linear; -`; - -const Title = styled(H5)<{ hasError?: boolean }>` - color: ${({ theme, hasError }) => (hasError ? theme.dangerColor : theme.primaryColor)}; - - font-style: normal; - font-weight: bold; - font-size: 15px; - line-height: 18px; -`; +export interface ToastProps { + text: string | React.ReactNode; + type?: ToastType; + onAction?: () => void; + actionBtnText?: string; + onClose?: () => void; +} -const Text = styled.div` - color: ${({ theme }) => theme.mediumPrimaryColor}; +const ICON_MAPPING = { + [ToastType.WARNING]: faExclamation, + [ToastType.ERROR]: faTimes, + [ToastType.SUCCESS]: faCheck, + [ToastType.INFO]: faExclamation, +}; - font-style: normal; - font-weight: normal; - font-size: 14px; - line-height: 17px; - margin-top: 5px; -`; +const STYLES_BY_TYPE: Readonly> = { + [ToastType.WARNING]: styles.warning, + [ToastType.ERROR]: styles.error, + [ToastType.SUCCESS]: styles.success, + [ToastType.INFO]: styles.info, +}; -export const Toast: React.FC = (props) => ( - - {props.hasError && } -
- {props.title} - {props.text && {props.text}} +export const Toast: React.FC = ({ type = ToastType.INFO, onAction, actionBtnText, onClose, text }) => { + return ( +
+
+ +
+
+ {text && ( + + {text} + + )} +
+ {onAction && ( + + )} + {onClose && ( +
- {props.onClose && ( -
+ + } > {children} diff --git a/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx b/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx index 662857acb611..c2ae41260d6c 100644 --- a/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx +++ b/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx @@ -66,7 +66,7 @@ export const Tooltip: React.FC> = (props) return ( <> -
> = (props) onMouseOut={onMouseOut} > {control} -
+ {canShowTooltip && createPortal(
; + +interface FormItem extends FormRelevantJSONSchema { fieldKey: string; path: string; isRequired: boolean; - order?: number; - title?: string; - description?: string; - airbyte_hidden?: boolean; } -export interface FormBaseItem extends FormItem, AirbyteJSONSchema { +export interface FormBaseItem extends FormItem { _type: "formItem"; type: JSONSchema7TypeName; isSecret?: boolean; multiline?: boolean; - default?: JSONSchema7Type; } export interface FormGroupItem extends FormItem { _type: "formGroup"; jsonSchema: AirbyteJSONSchema; properties: FormBlock[]; - isLoading?: boolean; - examples?: JSONSchema7Type; } export interface FormConditionItem extends FormItem { diff --git a/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.test.ts b/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.test.ts index 2677b69e5025..a53dc531cb32 100644 --- a/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.test.ts +++ b/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.test.ts @@ -1,3 +1,5 @@ +import { FormGroupItem } from "core/form/types"; + import { jsonSchemaToUiWidget } from "./schemaToUiWidget"; import { AirbyteJSONSchemaDefinition } from "./types"; @@ -115,6 +117,55 @@ it("should reformat jsonSchema to internal widget representation", () => { expect(builtSchema).toEqual(expected); }); +it("should turn single enum into const but keep multi value enum", () => { + const schema: AirbyteJSONSchemaDefinition = { + type: "object", + required: ["a", "b", "c"], + properties: { + a: { type: "string", enum: ["val1", "val2"] }, + b: { type: "string", enum: ["val1"], default: "val1" }, + c: { type: "string", const: "val3" }, + }, + }; + + const builtSchema = jsonSchemaToUiWidget(schema, "key"); + + const expectedProperties = [ + { + _type: "formItem", + enum: ["val1", "val2"], + fieldKey: "a", + isRequired: true, + isSecret: false, + multiline: false, + path: "key.a", + type: "string", + }, + { + _type: "formItem", + const: "val1", + default: "val1", + fieldKey: "b", + isRequired: true, + isSecret: false, + multiline: false, + path: "key.b", + type: "string", + }, + { + _type: "formItem", + const: "val3", + fieldKey: "c", + isRequired: true, + isSecret: false, + multiline: false, + path: "key.c", + type: "string", + }, + ]; + expect((builtSchema as FormGroupItem).properties).toEqual(expectedProperties); +}); + it("should reformat jsonSchema to internal widget representation with parent schema", () => { const schema: AirbyteJSONSchemaDefinition = { type: "object", diff --git a/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.ts b/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.ts index 67ba062d869d..360105af13b0 100644 --- a/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.ts +++ b/airbyte-webapp/src/core/jsonSchema/schemaToUiWidget.ts @@ -1,3 +1,5 @@ +import pick from "lodash/pick"; + import { FormBlock } from "core/form/types"; import { isDefined } from "utils/common"; @@ -94,6 +96,7 @@ export const jsonSchemaToUiWidget = ( isRequired, isSecret: !!jsonSchema.airbyte_secret, multiline: !!jsonSchema.multiline, + format: jsonSchema.format, type: (Array.isArray(jsonSchema.type) ? jsonSchema.type[0] : jsonSchema.type) ?? "null", }; }; @@ -108,7 +111,7 @@ function isKeyRequired(key: string, parentSchema?: AirbyteJSONSchemaDefinition): return isRequired; } -const defaultFields: Array = [ +const defaultFields = [ "default", "examples", "description", @@ -116,24 +119,21 @@ const defaultFields: Array = [ "order", "const", "title", + "enum", // airbyte specific fields "airbyte_hidden", -]; +] as const; -const pickDefaultFields = (schema: AirbyteJSONSchema): Partial => { - const partialSchema: Partial = { - ...Object.fromEntries(Object.entries(schema).filter(([k]) => defaultFields.includes(k as keyof AirbyteJSONSchema))), - }; +const pickDefaultFields = (schema: AirbyteJSONSchema) => { + const partialSchema = pick(schema, defaultFields); if (typeof schema.items === "object" && !Array.isArray(schema.items) && schema.items.enum) { partialSchema.enum = schema.items.enum; - } else if (schema.enum) { - if (schema.enum?.length === 1 && isDefined(schema.default)) { - partialSchema.const = schema.default; - } else { - partialSchema.enum = schema.enum; - } + } else if (schema.enum && schema.enum?.length === 1 && isDefined(schema.default)) { + partialSchema.const = schema.default; + // remove enum key as it has been "picked" already above + delete partialSchema.enum; } return partialSchema; diff --git a/airbyte-webapp/src/core/jsonSchema/schemaToYup.test.ts b/airbyte-webapp/src/core/jsonSchema/schemaToYup.test.ts index 095b6370aec4..ca85400f3b69 100644 --- a/airbyte-webapp/src/core/jsonSchema/schemaToYup.test.ts +++ b/airbyte-webapp/src/core/jsonSchema/schemaToYup.test.ts @@ -73,6 +73,9 @@ it("should build schema for conditional case", () => { start_date: { type: "string", }, + max_objects: { + type: "number", + }, credentials: { type: "object", oneOf: [ @@ -104,6 +107,7 @@ it("should build schema for conditional case", () => { const expectedSchema = yup.object().shape({ start_date: yup.string().trim().required("form.empty.error").transform(String), + max_objects: yup.number().transform((x) => x), credentials: yup.object().shape({ api_key: yup.string().trim().required("form.empty.error").transform(String), }), diff --git a/airbyte-webapp/src/core/jsonSchema/schemaToYup.ts b/airbyte-webapp/src/core/jsonSchema/schemaToYup.ts index fcb3d645d8ed..433199089f67 100644 --- a/airbyte-webapp/src/core/jsonSchema/schemaToYup.ts +++ b/airbyte-webapp/src/core/jsonSchema/schemaToYup.ts @@ -68,6 +68,7 @@ export const buildYupFormForJsonSchema = ( schema = yup.boolean(); break; case "integer": + case "number": schema = yup.number().transform((value) => (isNaN(value) ? undefined : value)); if (jsonSchema?.minimum !== undefined) { diff --git a/airbyte-webapp/src/views/Connection/CatalogDiffModal/useConfirmCatalogDiff.tsx b/airbyte-webapp/src/hooks/connection/useConfirmCatalogDiff.tsx similarity index 91% rename from airbyte-webapp/src/views/Connection/CatalogDiffModal/useConfirmCatalogDiff.tsx rename to airbyte-webapp/src/hooks/connection/useConfirmCatalogDiff.tsx index 9261d31175d6..3fc149c8383f 100644 --- a/airbyte-webapp/src/views/Connection/CatalogDiffModal/useConfirmCatalogDiff.tsx +++ b/airbyte-webapp/src/hooks/connection/useConfirmCatalogDiff.tsx @@ -1,11 +1,11 @@ import { useEffect } from "react"; import { useIntl } from "react-intl"; +import { CatalogDiffModal } from "components/connection/CatalogDiffModal/CatalogDiffModal"; + import { useConnectionEditService } from "hooks/services/ConnectionEdit/ConnectionEditService"; import { useModalService } from "hooks/services/Modal"; -import { CatalogDiffModal } from "./CatalogDiffModal"; - export const useConfirmCatalogDiff = () => { const { formatMessage } = useIntl(); const { openModal } = useModalService(); diff --git a/airbyte-webapp/src/hooks/connection/useIsAutoDetectSchemaChangesEnabled.ts b/airbyte-webapp/src/hooks/connection/useIsAutoDetectSchemaChangesEnabled.ts new file mode 100644 index 000000000000..3ea709e447b2 --- /dev/null +++ b/airbyte-webapp/src/hooks/connection/useIsAutoDetectSchemaChangesEnabled.ts @@ -0,0 +1,6 @@ +import { useExperiment } from "hooks/services/Experiment"; + +const isEnabledInEnv = process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES === "true"; + +export const useIsAutoDetectSchemaChangesEnabled = () => + useExperiment("connection.autoDetectSchemaChanges", isEnabledInEnv); diff --git a/airbyte-webapp/src/hooks/connection/useSchemaChanges.ts b/airbyte-webapp/src/hooks/connection/useSchemaChanges.ts index 0499a997203d..dffa32a442e2 100644 --- a/airbyte-webapp/src/hooks/connection/useSchemaChanges.ts +++ b/airbyte-webapp/src/hooks/connection/useSchemaChanges.ts @@ -2,11 +2,13 @@ import { useMemo } from "react"; import { SchemaChange } from "core/request/AirbyteClient"; +import { useIsAutoDetectSchemaChangesEnabled } from "./useIsAutoDetectSchemaChangesEnabled"; + export const useSchemaChanges = (schemaChange: SchemaChange) => { - const isSchemaChangesFeatureEnabled = process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES === "true"; + const isSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); return useMemo(() => { - const hasSchemaChanges = isSchemaChangesFeatureEnabled && schemaChange !== SchemaChange.no_change; + const hasSchemaChanges = isSchemaChangesEnabled && schemaChange !== SchemaChange.no_change; const hasBreakingSchemaChange = hasSchemaChanges && schemaChange === SchemaChange.breaking; const hasNonBreakingSchemaChange = hasSchemaChanges && schemaChange === SchemaChange.non_breaking; @@ -16,5 +18,5 @@ export const useSchemaChanges = (schemaChange: SchemaChange) => { hasBreakingSchemaChange, hasNonBreakingSchemaChange, }; - }, [isSchemaChangesFeatureEnabled, schemaChange]); + }, [isSchemaChangesEnabled, schemaChange]); }; diff --git a/airbyte-webapp/src/hooks/services/ConnectionForm/ConnectionFormService.tsx b/airbyte-webapp/src/hooks/services/ConnectionForm/ConnectionFormService.tsx index d42b21461dcf..958dbef75cdb 100644 --- a/airbyte-webapp/src/hooks/services/ConnectionForm/ConnectionFormService.tsx +++ b/airbyte-webapp/src/hooks/services/ConnectionForm/ConnectionFormService.tsx @@ -39,12 +39,14 @@ export const tidyConnectionFormValues = ( workspaceId: string, mode: ConnectionFormMode, allowSubOneHourCronExpressions: boolean, + isAutoDetectSchemaChangesEnabled: boolean, operations?: OperationRead[] ): ValuesProps => { // TODO (https://github.com/airbytehq/airbyte/issues/17279): We should try to fix the types so we don't need the casting. const formValues: ConnectionFormValues = createConnectionValidationSchema({ mode, allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled, }).cast(values, { context: { isRequest: true }, }) as unknown as ConnectionFormValues; @@ -55,7 +57,6 @@ export const tidyConnectionFormValues = ( // Have to set this to undefined to override the existing scheduleData formValues.scheduleData = undefined; } - return formValues; }; diff --git a/airbyte-webapp/src/hooks/services/Experiment/experiments.ts b/airbyte-webapp/src/hooks/services/Experiment/experiments.ts index afbc1d57e990..3321bdf58102 100644 --- a/airbyte-webapp/src/hooks/services/Experiment/experiments.ts +++ b/airbyte-webapp/src/hooks/services/Experiment/experiments.ts @@ -1,5 +1,7 @@ /* eslint sort-keys: "error" */ /** + * Experiments are short-term flags for A/B testing or staged rollouts of features. + * * When adding a new feature flag in LaunchDarkly to consume in code you'll need to make * sure to update the typing here. */ @@ -10,6 +12,7 @@ export interface Experiments { "connector.orderOverwrite": Record; "connector.frequentlyUsedDestinationIds": string[]; "connector.startWithDestinationId": string; + "connector.form.useDatepicker": boolean; "authPage.rightSideUrl": string | undefined; "authPage.hideSelfHostedCTA": boolean; "authPage.signup.hideName": boolean; @@ -23,4 +26,5 @@ export interface Experiments { "authPage.oauth.position": "top" | "bottom"; "connection.onboarding.sources": string; "connection.onboarding.destinations": string; + "connection.autoDetectSchemaChanges": boolean; } diff --git a/airbyte-webapp/src/hooks/services/Feature/types.tsx b/airbyte-webapp/src/hooks/services/Feature/types.tsx index a7a252416f69..af4ce8c61921 100644 --- a/airbyte-webapp/src/hooks/services/Feature/types.tsx +++ b/airbyte-webapp/src/hooks/services/Feature/types.tsx @@ -1,3 +1,8 @@ +/** + * FeatureItems are for permanent flags to differentiate features between environments (e.g. Cloud vs. OSS), + * workspaces, specific user groups, etc. + */ + export enum FeatureItem { AllowUploadCustomImage = "ALLOW_UPLOAD_CUSTOM_IMAGE", AllowCustomDBT = "ALLOW_CUSTOM_DBT", diff --git a/airbyte-webapp/src/hooks/services/Health/HealthPollService.tsx b/airbyte-webapp/src/hooks/services/Health/HealthPollService.tsx index 28f5428e012e..000714fc210d 100644 --- a/airbyte-webapp/src/hooks/services/Health/HealthPollService.tsx +++ b/airbyte-webapp/src/hooks/services/Health/HealthPollService.tsx @@ -6,6 +6,9 @@ import { HealthService } from "core/health/HealthService"; import { useGetService } from "core/servicesProvider"; import { useNotificationService } from "hooks/services/Notification/NotificationService"; +import { ToastType } from "../../../components/ui/Toast"; +import { Notification } from "../Notification"; + const HEALTH_NOTIFICATION_ID = "health.error"; const HEALTHCHECK_MAX_COUNT = 3; @@ -17,10 +20,10 @@ function useApiHealthPoll(): void { const { registerNotification, unregisterNotificationById } = useNotificationService(); useEffect(() => { - const errorNotification = { + const errorNotification: Notification = { id: HEALTH_NOTIFICATION_ID, - title: formatMessage({ id: "notifications.error.health" }), - isError: true, + text: formatMessage({ id: "notifications.error.health" }), + type: ToastType.ERROR, }; const interval = setInterval(async () => { diff --git a/airbyte-webapp/src/hooks/services/Notification/NotificationService.tsx b/airbyte-webapp/src/hooks/services/Notification/NotificationService.tsx index c1ac44317ada..3ec22bf99413 100644 --- a/airbyte-webapp/src/hooks/services/Notification/NotificationService.tsx +++ b/airbyte-webapp/src/hooks/services/Notification/NotificationService.tsx @@ -33,9 +33,8 @@ const NotificationService = ({ children }: { children: React.ReactNode }) => { {firstNotification ? ( // Show only first notification void; } export interface NotificationServiceApi { diff --git a/airbyte-webapp/src/hooks/services/useConnectorAuth.tsx b/airbyte-webapp/src/hooks/services/useConnectorAuth.tsx index 8e52c24b194c..a7e415cca2e6 100644 --- a/airbyte-webapp/src/hooks/services/useConnectorAuth.tsx +++ b/airbyte-webapp/src/hooks/services/useConnectorAuth.tsx @@ -2,6 +2,8 @@ import { useCallback, useMemo, useRef } from "react"; import { useIntl } from "react-intl"; import { useAsyncFn, useEffectOnce, useEvent } from "react-use"; +import { ToastType } from "components/ui/Toast"; + import { useConfig } from "config"; import { ConnectorDefinitionSpecification, ConnectorSpecification } from "core/domain/connector"; import { DestinationAuthService } from "core/domain/connector/DestinationAuthService"; @@ -107,7 +109,7 @@ export function useConnectorAuth(): { notificationService.registerNotification({ id: "oauthConnector.credentialsMissing", // Since it's dev only we don't need i18n on this string - title: "OAuth is not enabled for this connector on this environment.", + text: "OAuth is not enabled for this connector on this environment.", }); } else { // Log error to our monitoring, this should never happen and means OAuth credentials @@ -119,8 +121,8 @@ export function useConnectorAuth(): { }); notificationService.registerNotification({ id: "oauthConnector.credentialsMissing", - title: formatMessage({ id: "connector.oauthCredentialsMissing" }), - isError: true, + text: formatMessage({ id: "connector.oauthCredentialsMissing" }), + type: ToastType.ERROR, }); } } diff --git a/airbyte-webapp/src/hooks/useLoadingState.tsx b/airbyte-webapp/src/hooks/useLoadingState.tsx index cb002923d061..1074019eda54 100644 --- a/airbyte-webapp/src/hooks/useLoadingState.tsx +++ b/airbyte-webapp/src/hooks/useLoadingState.tsx @@ -1,7 +1,8 @@ import { useState } from "react"; import { useIntl } from "react-intl"; -import { useNotificationService } from "./services/Notification"; +import { ToastType } from "../components/ui/Toast"; +import { Notification, useNotificationService } from "./services/Notification"; const useLoadingState = (): { isLoading: boolean; @@ -13,13 +14,11 @@ const useLoadingState = (): { const [isLoading, setIsLoading] = useState(false); const [showFeedback, setShowFeedback] = useState(false); - const errorNotificationId = "error.somethingWentWrong"; - const errorNotification = (message: string) => ({ - isError: true, - title: formatMessage({ id: `notifications.${errorNotificationId}` }), - text: message, - id: errorNotificationId, - }); + const errorNotification: Notification = { + id: "notifications.error.somethingWentWrong", + text: formatMessage({ id: `notifications.error.somethingWentWrong` }), + type: ToastType.ERROR, + }; const startAction = async ({ action, feedbackAction }: { action: () => void; feedbackAction?: () => void }) => { try { @@ -37,11 +36,9 @@ const useLoadingState = (): { feedbackAction(); } }, 2000); - } catch (error) { - const message = error?.message || formatMessage({ id: "notifications.error.noMessage" }); - + } catch { setIsLoading(false); - registerNotification(errorNotification(message)); + registerNotification(errorNotification); } }; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 1c517233789e..2f841fc67ebc 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -53,6 +53,7 @@ "form.cursorField": "Cursor field", "form.dataSync": "Activate the streams you want to sync", "form.dataSync.readonly": "Activated streams", + "form.apply": "Apply", "form.cancel": "Cancel", "form.canceling": "Canceling", "form.submit": "Submit", @@ -60,6 +61,8 @@ "form.change": "Change", "form.add": "Add", "form.saveChanges": "Save changes", + "form.openDatepicker": "Open datepicker", + "form.datepickerTimeCaption": "Time (UTC)", "form.saveChangesAndTest": "Save changes and test", "form.sourceRetest": "Retest source", "form.destinationRetest": "Retest destination", @@ -148,6 +151,35 @@ "connectionForm.defaultSyncMode.message": "Set how Airbyte reads from the source and writes to the destination, across all streams when the option is available.", "connectionForm.bulkEdit.cancel": "Cancel", "connectionForm.bulkEdit.apply": "Apply", + "connectionForm.nonBreakingChangesPreference.label": "Non-breaking schema updates detected*", + "connectionForm.nonBreakingChangesPreference.message": "Set how Airbyte handles syncs when it detects a non-breaking schema change in the source", + "connectionForm.nonBreakingChangesPreference.ignore": "Ignore", + "connectionForm.nonBreakingChangesPreference.disable": "Pause sync", + + "connectionForm.modal.destinationNamespace.title": "Destination namespace", + "connectionForm.modal.destinationNamespace.option.source": "Mirror source structure", + "connectionForm.modal.destinationNamespace.option.destination": "Destination default", + "connectionForm.modal.destinationNamespace.option.customFormat": "Custom format", + "connectionForm.modal.destinationNamespace.input.placeholder": "My namespace", + "connectionForm.modal.destinationNamespace.option.source.description": "Replicate to the default namespace in the destination, which will differ based on your destination.", + "connectionForm.modal.destinationNamespace.option.destination.description": "All stream will be replicated and store in the default namespace defined on the destination settings page.", + "connectionForm.modal.destinationNamespace.description": "The following table summarises how this works. We assume an example of replication configurations between a Postgres Source and Snowflake Destination (with settings of schema = \"my_schema\"):", + "connectionForm.modal.destinationNamespace.table.header.sourceNamespace": "Source namespace", + "connectionForm.modal.destinationNamespace.table.header.destinationNamespace": "Destination namespace", + "connectionForm.modal.destinationNamespace.table.header.customFormat": "Custom format=", + "connectionForm.modal.destinationNamespace.table.data.public": "public", + "connectionForm.modal.destinationNamespace.table.data.mySchema": "my_schema", + "connectionForm.modal.destinationNamespace.table.data.myPublicSchema": "my_public_schema", + "connectionForm.modal.destinationNamespace.table.data.exampleSourceNamespace": "\"$SOURCE_NAMESPACE\"", + "connectionForm.modal.destinationNamespace.table.data.exampleMySourceNamespace": "\"my_$SOURCE_NAMESPACE_schema\"", + "connectionForm.modal.destinationNamespace.table.data.custom": "custom", + + "connectionForm.modal.destinationStreamNames.title": "Destination stream names", + "connectionForm.modal.destinationStreamNames.radioButton.mirror": "Mirror source name", + "connectionForm.modal.destinationStreamNames.radioButton.prefix": "Add a prefix", + "connectionForm.modal.destinationStreamNames.input.placeholder": "prefix", + "connectionForm.modal.destinationStreamNames.description": "Define the final table name in the destination", + "connectionForm.modal.destinationStreamNames.prefix.message": "Add a prefix to stream names (ex. “airbyte_” causes “projects” => “airbyte_projects”)", "connectorForm.authenticate": "Authenticate your {connector} account", "connectorForm.signInWithGoogle": "Sign in with Google", @@ -371,8 +403,20 @@ "connection.linkedJobNotFound": "Job not found", "connection.returnToSyncHistory": "Return to Sync History", - "connection.schemaChange.breaking": "Breaking schema updates detected.", - "connection.schemaChange.nonBreaking": "Non-breaking schema updates detected.", + "connection.progress.percentage": "{percent} percent progress", + "connection.progress.minutesRemaining": "~{value, plural, one {# minute remaining} other {# minutes remaining}}", + "connection.progress.hoursRemaining": "~{value, plural, one {# hour remaining} other {# hours remaining}}", + "connection.progress.streamTooltipTitle": "Stream {stream}", + "connection.progress.streamRecordsWithoutEstimate": "{current, plural, one {# record} other {# records}} synced", + "connection.progress.streamRecordsWithEstimate": "{current} of {estimated} synced", + "connection.progress.unknown": "No estimate", + "connection.progress.records": "Records", + "connection.progress.progress": "Progress", + "connection.progress.recordsSynced": "{synced, number} / {total, number} {synced, plural, one {record synced} other {records synced}} ({speed, number} records/sec)", + "connection.progress.bytesSynced": "{synced} / {total} synced ({speed}/sec)", + + "connection.schemaChange.breaking": "Breaking schema updates detected", + "connection.schemaChange.nonBreaking": "Non-breaking schema updates detected", "connection.schemaChange.reviewAction": "Review changes", "form.frequency": "Replication frequency*", @@ -527,6 +571,7 @@ "connector.connectorsInDevelopment.docLink": "See our documentation for more details.", "connector.setupGuide": "Setup Guide", "connector.setupGuide.notFound": "No Setup Guide found for this connector.", + "connector.optionsHeader": "Options", "connector.exampleValues": "Example {count, plural, one {value} other {values}}", "connector.oauthCredentialsMissing": "OAuth login is temporarily unavailable for this connector. Please try again later.", diff --git a/airbyte-webapp/src/packages/cloud/App.tsx b/airbyte-webapp/src/packages/cloud/App.tsx index 18f6d7e5116c..c15afc866725 100644 --- a/airbyte-webapp/src/packages/cloud/App.tsx +++ b/airbyte-webapp/src/packages/cloud/App.tsx @@ -44,6 +44,7 @@ const Services: React.FC> = ({ children }) => ( FeatureItem.AllowOAuthConnector, FeatureItem.AllowSync, FeatureItem.AllowChangeDataGeographies, + FeatureItem.AllowDBTCloudIntegration, ]} > diff --git a/airbyte-webapp/src/packages/cloud/views/FirebaseActionRoute.tsx b/airbyte-webapp/src/packages/cloud/views/FirebaseActionRoute.tsx index 244d7ea78c3f..a41f6c84db18 100644 --- a/airbyte-webapp/src/packages/cloud/views/FirebaseActionRoute.tsx +++ b/airbyte-webapp/src/packages/cloud/views/FirebaseActionRoute.tsx @@ -4,8 +4,9 @@ import { Navigate, useNavigate } from "react-router-dom"; import { useAsync } from "react-use"; import LoadingPage from "components/LoadingPage"; +import { ToastType } from "components/ui/Toast"; -import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics"; +import { PageTrackingCodes, useTrackPage } from "hooks/services/Analytics"; import { useNotificationService } from "hooks/services/Notification"; import { useQuery } from "hooks/useQuery"; import { useAuthService } from "packages/cloud/services/auth/AuthService"; @@ -38,8 +39,8 @@ export const VerifyEmailAction: React.FC = () => { // Show a notification that the mail got verified successfully registerNotification({ id: "auth/email-verified", - title: formatMessage({ id: "verifyEmail.notification" }), - isError: false, + text: formatMessage({ id: "verifyEmail.notification" }), + type: ToastType.SUCCESS, }); // Navigate the user to the homepage navigate("/"); diff --git a/airbyte-webapp/src/packages/cloud/views/auth/ConfirmPasswordResetPage/ConfirmPasswordResetPage.tsx b/airbyte-webapp/src/packages/cloud/views/auth/ConfirmPasswordResetPage/ConfirmPasswordResetPage.tsx index f383b991cecb..295990e98a69 100644 --- a/airbyte-webapp/src/packages/cloud/views/auth/ConfirmPasswordResetPage/ConfirmPasswordResetPage.tsx +++ b/airbyte-webapp/src/packages/cloud/views/auth/ConfirmPasswordResetPage/ConfirmPasswordResetPage.tsx @@ -7,6 +7,7 @@ import * as yup from "yup"; import { LabeledInput, Link } from "components"; import { Button } from "components/ui/Button"; +import { ToastType } from "components/ui/Toast"; import { useNotificationService } from "hooks/services/Notification/NotificationService"; import { useQuery } from "hooks/useQuery"; @@ -46,8 +47,8 @@ const ResetPasswordConfirmPage: React.FC = () => { await confirmPasswordReset(query.oobCode, newPassword); registerNotification({ id: "confirmResetPassword.success", - title: formatMessage({ id: "confirmResetPassword.success" }), - isError: false, + text: formatMessage({ id: "confirmResetPassword.success" }), + type: ToastType.SUCCESS, }); navigate(CloudRoutes.Login); } catch (err) { @@ -57,37 +58,37 @@ const ResetPasswordConfirmPage: React.FC = () => { case AuthErrorCodes.EXPIRED_OOB_CODE: registerNotification({ id: "confirmResetPassword.error.expiredActionCode", - title: formatMessage({ + text: formatMessage({ id: "confirmResetPassword.error.expiredActionCode", }), - isError: true, + type: ToastType.ERROR, }); break; case AuthErrorCodes.INVALID_OOB_CODE: registerNotification({ id: "confirmResetPassword.error.invalidActionCode", - title: formatMessage({ + text: formatMessage({ id: "confirmResetPassword.error.invalidActionCode", }), - isError: true, + type: ToastType.ERROR, }); break; case AuthErrorCodes.WEAK_PASSWORD: registerNotification({ id: "confirmResetPassword.error.weakPassword", - title: formatMessage({ + text: formatMessage({ id: "confirmResetPassword.error.weakPassword", }), - isError: true, + type: ToastType.WARNING, }); break; default: registerNotification({ id: "confirmResetPassword.error.default", - title: formatMessage({ + text: formatMessage({ id: "confirmResetPassword.error.default", }), - isError: true, + type: ToastType.ERROR, }); } } diff --git a/airbyte-webapp/src/packages/cloud/views/auth/ResetPasswordPage/ResetPasswordPage.tsx b/airbyte-webapp/src/packages/cloud/views/auth/ResetPasswordPage/ResetPasswordPage.tsx index 2e477ba4afb8..b63fdbe6ae6b 100644 --- a/airbyte-webapp/src/packages/cloud/views/auth/ResetPasswordPage/ResetPasswordPage.tsx +++ b/airbyte-webapp/src/packages/cloud/views/auth/ResetPasswordPage/ResetPasswordPage.tsx @@ -6,6 +6,7 @@ import * as yup from "yup"; import { LabeledInput, Link } from "components"; import { HeadTitle } from "components/common/HeadTitle"; import { Button } from "components/ui/Button"; +import { ToastType } from "components/ui/Toast"; import { PageTrackingCodes, useTrackPage } from "hooks/services/Analytics"; import { useNotificationService } from "hooks/services/Notification/NotificationService"; @@ -42,8 +43,8 @@ const ResetPasswordPage: React.FC = () => { await requirePasswordReset(email); registerNotification({ id: "resetPassword.emailSent", - title: formatMessage({ id: "login.resetPassword.emailSent" }), - isError: false, + text: formatMessage({ id: "login.resetPassword.emailSent" }), + type: ToastType.SUCCESS, }); } catch (err) { err.message.includes("user-not-found") diff --git a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx index 68ed96d4b74f..b0cd3aca2156 100644 --- a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx +++ b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx @@ -5,6 +5,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import styled from "styled-components"; import { InfoBox } from "components/ui/InfoBox"; +import { ToastType } from "components/ui/Toast"; import { useNotificationService } from "hooks/services/Notification"; import { useAuthService } from "packages/cloud/services/auth/AuthService"; @@ -16,7 +17,6 @@ interface Props { const ResendEmailLink = styled.button` appearance: none; background: none; - padding: none; border: none; font-size: inherit; text-decoration: underline; @@ -48,28 +48,28 @@ export const EmailVerificationHint: React.FC = ({ className }) => { case AuthErrorCodes.NETWORK_REQUEST_FAILED: registerNotification({ id: error.code, - title: formatMessage({ + text: formatMessage({ id: FirebaseAuthMessageId.NetworkFailure, }), - isError: true, + type: ToastType.ERROR, }); break; case AuthErrorCodes.TOO_MANY_ATTEMPTS_TRY_LATER: registerNotification({ id: error.code, - title: formatMessage({ + text: formatMessage({ id: FirebaseAuthMessageId.TooManyRequests, }), - isError: true, + type: ToastType.WARNING, }); break; default: registerNotification({ id: error.code, - title: formatMessage({ + text: formatMessage({ id: FirebaseAuthMessageId.DefaultError, }), - isError: true, + type: ToastType.ERROR, }); } } diff --git a/airbyte-webapp/src/packages/cloud/views/users/InviteUsersModal/InviteUsersModal.tsx b/airbyte-webapp/src/packages/cloud/views/users/InviteUsersModal/InviteUsersModal.tsx index 82ea74f3acac..e32c31e126b3 100644 --- a/airbyte-webapp/src/packages/cloud/views/users/InviteUsersModal/InviteUsersModal.tsx +++ b/airbyte-webapp/src/packages/cloud/views/users/InviteUsersModal/InviteUsersModal.tsx @@ -12,6 +12,7 @@ import { Button } from "components/ui/Button"; import { DropDown } from "components/ui/DropDown"; import { Input } from "components/ui/Input"; import { Modal } from "components/ui/Modal"; +import { ToastType } from "components/ui/Toast"; import { Action, Namespace } from "core/analytics"; import { useAnalyticsService } from "hooks/services/Analytics"; @@ -88,8 +89,9 @@ export const InviteUsersModal: React.FC<{ { onSuccess: () => { registerNotification({ - title: formatMessage({ id: "addUsers.success.title" }), + text: formatMessage({ id: "addUsers.success.title" }), id: "invite-users-success", + type: ToastType.SUCCESS, }); props.onClose(); }, diff --git a/airbyte-webapp/src/packages/cloud/views/workspaces/DataResidencyView/DataResidencyView.tsx b/airbyte-webapp/src/packages/cloud/views/workspaces/DataResidencyView/DataResidencyView.tsx index a72be59554d0..5ce15d43b9c7 100644 --- a/airbyte-webapp/src/packages/cloud/views/workspaces/DataResidencyView/DataResidencyView.tsx +++ b/airbyte-webapp/src/packages/cloud/views/workspaces/DataResidencyView/DataResidencyView.tsx @@ -6,6 +6,7 @@ import { ControlLabels } from "components"; import { DataGeographyDropdown } from "components/common/DataGeographyDropdown"; import { Button } from "components/ui/Button"; import { Text } from "components/ui/Text"; +import { ToastType } from "components/ui/Toast"; import { Geography } from "core/request/AirbyteClient"; import { PageTrackingCodes, useTrackPage } from "hooks/services/Analytics"; @@ -44,8 +45,8 @@ export const DataResidencyView: React.FC = () => { } catch (e) { registerNotification({ id: "workspaceSettings.defaultGeographyError", - title: formatMessage({ id: "settings.defaultDataResidencyUpdateError" }), - isError: true, + text: formatMessage({ id: "settings.defaultDataResidencyUpdateError" }), + type: ToastType.ERROR, }); } }; diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/ConnectionReplicationTab.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/ConnectionReplicationTab.tsx index 72b0c8cd7efe..296b737565ae 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/ConnectionReplicationTab.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/ConnectionReplicationTab.tsx @@ -9,6 +9,8 @@ import LoadingSchema from "components/LoadingSchema"; import { Action, Namespace } from "core/analytics"; import { getFrequencyFromScheduleData } from "core/analytics/utils"; import { toWebBackendConnectionUpdate } from "core/domain/connection"; +import { useConfirmCatalogDiff } from "hooks/connection/useConfirmCatalogDiff"; +import { useIsAutoDetectSchemaChangesEnabled } from "hooks/connection/useIsAutoDetectSchemaChangesEnabled"; import { PageTrackingCodes, useAnalyticsService, useTrackPage } from "hooks/services/Analytics"; import { useConnectionEditService } from "hooks/services/ConnectionEdit/ConnectionEditService"; import { @@ -20,7 +22,6 @@ import { useModalService } from "hooks/services/Modal"; import { useConnectionService, ValuesProps } from "hooks/services/useConnectionHook"; import { useCurrentWorkspaceId } from "services/workspaces/WorkspacesService"; import { equal } from "utils/objects"; -import { useConfirmCatalogDiff } from "views/Connection/CatalogDiffModal/useConfirmCatalogDiff"; import EditControls from "views/Connection/ConnectionForm/components/EditControls"; import { ConnectionFormFields } from "views/Connection/ConnectionForm/ConnectionFormFields"; import { @@ -32,6 +33,7 @@ import styles from "./ConnectionReplicationTab.module.scss"; import { ResetWarningModal } from "./ResetWarningModal"; export const ConnectionReplicationTab: React.FC = () => { + const isAutoDetectSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); const analyticsService = useAnalyticsService(); const connectionService = useConnectionService(); const workspaceId = useCurrentWorkspaceId(); @@ -84,6 +86,7 @@ export const ConnectionReplicationTab: React.FC = () => { workspaceId, mode, allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled, connection.operations ); @@ -139,18 +142,19 @@ export const ConnectionReplicationTab: React.FC = () => { } }, [ - connection.connectionId, - connection.catalogDiff, + workspaceId, + mode, + allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled, connection.operations, + connection.catalogDiff?.transforms, connection.syncCatalog.streams, + connection.connectionId, + setSubmitError, connectionService, - formatMessage, - mode, openModal, + formatMessage, saveConnection, - setSubmitError, - workspaceId, - allowSubOneHourCronExpressions, ] ); @@ -168,7 +172,11 @@ export const ConnectionReplicationTab: React.FC = () => { diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.module.scss b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.module.scss index ac6d0e4a050c..7c881807207f 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.module.scss +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.module.scss @@ -15,5 +15,8 @@ color: colors.$grey-300; display: inline-block; text-align: left; - cursor: pointer; + + &:not(.disabled) { + cursor: pointer; + } } diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.tsx index 210ea47c71c5..73f2b03ae284 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/EnabledControl.tsx @@ -1,3 +1,4 @@ +import classNames from "classnames"; import React from "react"; import { FormattedMessage } from "react-intl"; import { useAsyncFn } from "react-use"; @@ -48,13 +49,18 @@ export const EnabledControl: React.FC = ({ disabled }) => { updateConnection, ]); + const isSwitchDisabled = disabled || connectionUpdating; + return (
-
diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.module.scss b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.module.scss index 6d072a9776dc..5418431559b8 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.module.scss +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.module.scss @@ -8,6 +8,14 @@ &:hover { background-color: colors.$grey-50; + + &.breaking { + background-color: colors.$red-100; + } + + &.nonBreaking { + background-color: colors.$yellow-100; + } } } diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.test.tsx b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.test.tsx index 8c92f0ba616d..bc5b1eccf19e 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.test.tsx +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/StatusMainInfo.test.tsx @@ -26,18 +26,14 @@ jest.doMock("views/Connection/ConnectionForm/components/refreshSourceSchemaWithC useRefreshSourceSchemaWithConfirmationOnDirty: jest.fn(), })); +jest.mock("hooks/connection/useIsAutoDetectSchemaChangesEnabled", () => ({ + useIsAutoDetectSchemaChangesEnabled: () => true, +})); + // eslint-disable-next-line @typescript-eslint/no-var-requires const { StatusMainInfo } = require("./StatusMainInfo"); describe("", () => { - beforeAll(() => { - process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES = "true"; - }); - - afterAll(() => { - delete process.env.REACT_APP_AUTO_DETECT_SCHEMA_CHANGES; - }); - beforeEach(() => { mockUseConnectionEditService.mockReturnValue({ connection: mockConnection, diff --git a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/__snapshots__/ConnectionReplicationTab.test.tsx.snap b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/__snapshots__/ConnectionReplicationTab.test.tsx.snap index a15c78337bce..0879fe8c9611 100644 --- a/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/__snapshots__/ConnectionReplicationTab.test.tsx.snap +++ b/airbyte-webapp/src/pages/ConnectionPage/pages/ConnectionItemPage/__snapshots__/ConnectionReplicationTab.test.tsx.snap @@ -388,13 +388,13 @@ exports[`ConnectionReplicationTab should render 1`] = ` class="" > Source -
-
-
-
-
-
+ + +
Sync mode -
-
-
-
-
-
+ + +
Cursor field -
-
-
-
-
-
+ + +
Primary key -
-
-
-
-
-
+ + +
Destination -
-
-
-
-
-
+ + +
{ registerNotification({ id: "admin.logs.error", - title: formatMessage({ id: "admin.logs.error" }), - isError: true, + text: formatMessage({ id: "admin.logs.error" }), + type: ToastType.ERROR, }); } }; diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/NotificationPage/components/WebHookForm.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/NotificationPage/components/WebHookForm.tsx index ca50fc542bbc..de597f65ea17 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/NotificationPage/components/WebHookForm.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/NotificationPage/components/WebHookForm.tsx @@ -9,11 +9,12 @@ import * as yup from "yup"; import { Label, LabeledSwitch } from "components"; import { DocsIcon } from "components/icons/DocsIcon"; import { PlayIcon } from "components/icons/PlayIcon"; -import { Row, Cell } from "components/SimpleTableComponents"; +import { Cell, Row } from "components/SimpleTableComponents"; import { Button } from "components/ui/Button"; import { Heading } from "components/ui/Heading"; import { Input } from "components/ui/Input"; import { Text } from "components/ui/Text"; +import { ToastType } from "components/ui/Toast"; import { Tooltip } from "components/ui/Tooltip"; import useWorkspace, { WebhookPayload } from "hooks/services/useWorkspace"; @@ -59,16 +60,16 @@ export const WebHookForm: React.FC = ({ webhook }) => { case true: { registerNotification({ id: "settings.webhook.test.passed", - title: formatMessage({ id: "settings.webhook.test.passed" }), - isError: false, + text: formatMessage({ id: "settings.webhook.test.passed" }), + type: ToastType.SUCCESS, }); break; } case false: { registerNotification({ id: "settings.webhook.test.failed", - title: formatMessage({ id: "settings.webhook.test.failed" }), - isError: true, + text: formatMessage({ id: "settings.webhook.test.failed" }), + type: ToastType.ERROR, }); break; } @@ -83,8 +84,8 @@ export const WebHookForm: React.FC = ({ webhook }) => { case false: { registerNotification({ id: "settings.webhook.save.failed", - title: formatMessage({ id: "settings.webhook.save.failed" }), - isError: true, + text: formatMessage({ id: "settings.webhook.save.failed" }), + type: ToastType.ERROR, }); break; } diff --git a/airbyte-webapp/src/pages/SourcesPage/pages/CreateSourcePage/components/SourceForm.tsx b/airbyte-webapp/src/pages/SourcesPage/pages/CreateSourcePage/components/SourceForm.tsx index 4a4962912253..3a36bd080e36 100644 --- a/airbyte-webapp/src/pages/SourcesPage/pages/CreateSourcePage/components/SourceForm.tsx +++ b/airbyte-webapp/src/pages/SourcesPage/pages/CreateSourcePage/components/SourceForm.tsx @@ -16,7 +16,7 @@ interface SourceFormProps { serviceType: string; sourceDefinitionId?: string; connectionConfiguration?: ConnectionConfiguration; - }) => void; + }) => Promise; sourceDefinitions: SourceDefinitionReadWithLatestTag[]; hasSuccess?: boolean; error?: FormError | null; diff --git a/airbyte-webapp/src/scss/_colors.scss b/airbyte-webapp/src/scss/_colors.scss index 6c849f2d0ad2..282110f01ebb 100644 --- a/airbyte-webapp/src/scss/_colors.scss +++ b/airbyte-webapp/src/scss/_colors.scss @@ -52,6 +52,8 @@ $orange-800: #d83c24; $orange-900: #bf2f1b; $orange: $orange-400; +$green-30: #f4fcfd; +$green-40: #f0fcfd; $green-50: #dcf6f8; $green-100: #a7e9ec; $green-200: #67dae1; @@ -64,6 +66,8 @@ $green-800: #007c84; $green-900: #005959; $green: $green-200; +$red-30: #fff4f6; +$red-40: #ffeff2; $red-50: #ffe4e8; $red-100: #ffbac6; $red-200: #ff8da1; diff --git a/airbyte-webapp/src/scss/_variables.scss b/airbyte-webapp/src/scss/_variables.scss index 4b747c904771..e0ac714ca4ab 100644 --- a/airbyte-webapp/src/scss/_variables.scss +++ b/airbyte-webapp/src/scss/_variables.scss @@ -24,6 +24,7 @@ $main-page-content-min-width: 960px; $width-size-menu: 93px; $width-wide-menu: 200px; +$width-max-notification: 600px; $width-modal-sm: 492px; $width-modal-md: 585px; diff --git a/airbyte-webapp/src/scss/_z-indices.scss b/airbyte-webapp/src/scss/_z-indices.scss index 09cb6dfd3cf1..04b4b250ca99 100644 --- a/airbyte-webapp/src/scss/_z-indices.scss +++ b/airbyte-webapp/src/scss/_z-indices.scss @@ -1,5 +1,7 @@ -$tooltip: 9999 + 2; +$tooltip: 9999 + 3; +$datepicker: 9999 + 2; $modal: 9999 + 1; $sidebar: 9999; $panelSplitter: 0; $dropdownMenu: 2; +$notification: 20; diff --git a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts index 2f2674c1c3f4..f4f9f2c810cc 100644 --- a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts +++ b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts @@ -6,7 +6,7 @@ import { StreamReadRequestBody, StreamsListRequestBody, StreamsListRequestBodyConfig, - StreamsListRequestBodyManifest, + ConnectorManifest, } from "core/request/ConnectorBuilderClient"; import { useSuspenseQuery } from "services/connector/useSuspenseQuery"; import { useInitService } from "services/useInitService"; @@ -14,7 +14,7 @@ import { useInitService } from "services/useInitService"; const connectorBuilderKeys = { all: ["connectorBuilder"] as const, read: (streamName: string) => [...connectorBuilderKeys.all, "read", { streamName }] as const, - list: (manifest: StreamsListRequestBodyManifest, config: StreamsListRequestBodyConfig) => + list: (manifest: ConnectorManifest, config: StreamsListRequestBodyConfig) => [...connectorBuilderKeys.all, "list", { manifest, config }] as const, template: ["template"] as const, }; diff --git a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderStateService.tsx b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderStateService.tsx index e5e9bcbeb659..1169e3a2a46e 100644 --- a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderStateService.tsx +++ b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderStateService.tsx @@ -4,14 +4,22 @@ import { useIntl } from "react-intl"; import { StreamReadRequestBodyConfig, StreamsListReadStreamsItem, - StreamsListRequestBodyManifest, + ConnectorManifest, } from "core/request/ConnectorBuilderClient"; import { useAppMonitoringService } from "hooks/services/AppMonitoringService"; import { useListStreams } from "./ConnectorBuilderApiService"; +const DEFAULT_JSON_MANIFEST_VALUES: ConnectorManifest = { + version: "0.1.0", + check: { + stream_names: [], + }, + streams: [], +}; + interface Context { - jsonManifest: StreamsListRequestBodyManifest; + jsonManifest: ConnectorManifest; yamlEditorIsMounted: boolean; yamlIsValid: boolean; streams: StreamsListReadStreamsItem[]; @@ -19,7 +27,7 @@ interface Context { selectedStream?: StreamsListReadStreamsItem; configString: string; configJson: StreamReadRequestBodyConfig; - setJsonManifest: (jsonValue: StreamsListRequestBodyManifest) => void; + setJsonManifest: (jsonValue: ConnectorManifest) => void; setYamlEditorIsMounted: (value: boolean) => void; setYamlIsValid: (value: boolean) => void; setSelectedStream: (streamName: string) => void; @@ -32,7 +40,7 @@ export const ConnectorBuilderStateProvider: React.FC({}); + const [jsonManifest, setJsonManifest] = useState(DEFAULT_JSON_MANIFEST_VALUES); const [yamlIsValid, setYamlIsValid] = useState(true); const [yamlEditorIsMounted, setYamlEditorIsMounted] = useState(false); diff --git a/airbyte-webapp/src/setupTests.ts b/airbyte-webapp/src/setupTests.ts index 2ff0ca3314a2..020722b63d84 100644 --- a/airbyte-webapp/src/setupTests.ts +++ b/airbyte-webapp/src/setupTests.ts @@ -4,6 +4,7 @@ // learn more: https://github.com/testing-library/jest-dom import "@testing-library/jest-dom/extend-expect"; import "@testing-library/jest-dom"; +import "./globals"; // fix for react-slick global.matchMedia = diff --git a/airbyte-webapp/src/types/react-table.d.ts b/airbyte-webapp/src/types/react-table.d.ts new file mode 100644 index 000000000000..da1739be7a7c --- /dev/null +++ b/airbyte-webapp/src/types/react-table.d.ts @@ -0,0 +1,13 @@ +import "@tanstack/react-table"; + +/** + * This extends to ColumnMeta interface to support optional
and styling + * More info: https://tanstack.com/table/v8/docs/api/core/table#meta + * Undocumented 'meta' access: https://github.com/TanStack/table/issues/3983#issuecomment-1142334750 + */ +declare module "@tanstack/table-core" { + interface ColumnMeta { + thClassName?: string; + tdClassName?: string; + } +} diff --git a/airbyte-webapp/src/utils/numberHelper.test.tsx b/airbyte-webapp/src/utils/numberHelper.test.tsx new file mode 100644 index 000000000000..44d61eafcce8 --- /dev/null +++ b/airbyte-webapp/src/utils/numberHelper.test.tsx @@ -0,0 +1,35 @@ +import { render, screen } from "@testing-library/react"; +import { IntlProvider } from "react-intl"; + +import * as en from "../locales/en.json"; +import { formatBytes } from "./numberHelper"; + +const _render = (args: Parameters) => + render( + +
{formatBytes(...args)}
+
+ ); + +describe("#formatBytes", () => { + const cases: Array<[number | undefined, string]> = [ + [undefined, "0 Bytes"], + [0, "0 Bytes"], + [-1, "0 Bytes"], + [12, "12 Bytes"], + [1024 * 1 + 1, "1 KB"], + [1024 * 10 + 1, "10 KB"], + [1024 * 1024 + 1, "1 MB"], + [1024 * 1024 * 10 + 1, "10 MB"], + [1024 * 1024 * 1024 + 1, "1 GB"], + [1024 * 1024 * 1024 * 10 + 1, "10 GB"], + [1024 * 1024 * 1024 * 1024 + 1, "1 TB"], + [1024 * 1024 * 1024 * 1024 * 10 + 1, "10 TB"], + ]; + + it.each(cases)("formats %p as %p", (number, string) => { + _render([number]); + const el = screen.getByTestId("test"); + expect(el).toHaveTextContent(string); + }); +}); diff --git a/airbyte-webapp/src/utils/numberHelper.tsx b/airbyte-webapp/src/utils/numberHelper.tsx new file mode 100644 index 000000000000..d44f6875e4c2 --- /dev/null +++ b/airbyte-webapp/src/utils/numberHelper.tsx @@ -0,0 +1,19 @@ +import { FormattedMessage } from "react-intl"; + +export const formatBytes = (bytes?: number) => { + if (bytes && bytes < 0) { + bytes = 0; + } + + if (!bytes) { + return ; + } + + const k = 1024; + const dm = 2; + const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + const result = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)); + + return ; +}; diff --git a/airbyte-webapp/src/utils/useTranslateDataType.ts b/airbyte-webapp/src/utils/useTranslateDataType.ts index cb77df68e53f..e9b2b8e19047 100644 --- a/airbyte-webapp/src/utils/useTranslateDataType.ts +++ b/airbyte-webapp/src/utils/useTranslateDataType.ts @@ -9,18 +9,20 @@ export interface AirbyteConnectorData { oneOf?: unknown[]; } +const getType = (data: AirbyteConnectorData): string => { + if (data.oneOf || data.anyOf) { + return "union"; + } + if (!data.anyOf && !data.oneOf && !data.airbyte_type && !data.format && !data.type) { + return "unknown"; + } + return data.airbyte_type ?? data.format ?? data.type; +}; + export const useTranslateDataType = (props: AirbyteConnectorData) => { const { formatMessage } = useIntl(); - const dataType = useMemo(() => { - if (props.oneOf || props.anyOf) { - return "union"; - } - if (!props.anyOf && !props.oneOf && !props.airbyte_type && !props.format && !props.type) { - return "unknown"; - } - return props.airbyte_type ?? props.format ?? props.type; - }, [props.airbyte_type, props.anyOf, props.format, props.oneOf, props.type]); - const dataTypeFormatted = useMemo( + const dataType = useMemo(() => getType(props), [props]); + return useMemo( () => formatMessage({ id: `airbyte.datatype.${dataType}`, @@ -28,6 +30,9 @@ export const useTranslateDataType = (props: AirbyteConnectorData) => { }), [dataType, formatMessage] ); +}; - return dataTypeFormatted; +// another ver of useTranslateDataType - without hook and return just string. The old one is left for backward compatibility +export const getDataType = (data: AirbyteConnectorData): string => { + return `airbyte.datatype.${getType(data)}`; }; diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/ConnectionFormFields.tsx b/airbyte-webapp/src/views/Connection/ConnectionForm/ConnectionFormFields.tsx index 4b042987cca1..e8c4cc692b41 100644 --- a/airbyte-webapp/src/views/Connection/ConnectionForm/ConnectionFormFields.tsx +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/ConnectionFormFields.tsx @@ -13,11 +13,13 @@ import { Heading } from "components/ui/Heading"; import { Input } from "components/ui/Input"; import { NamespaceDefinitionType } from "core/request/AirbyteClient"; +import { useIsAutoDetectSchemaChangesEnabled } from "hooks/connection/useIsAutoDetectSchemaChangesEnabled"; import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; import { useFormChangeTrackerService } from "hooks/services/FormChangeTracker"; import { ValuesProps } from "hooks/services/useConnectionHook"; import { NamespaceDefinitionField } from "./components/NamespaceDefinitionField"; +import { NonBreakingChangesPreferenceField } from "./components/NonBreakingChangesPreferenceField"; import { useRefreshSourceSchemaWithConfirmationOnDirty } from "./components/refreshSourceSchemaWithConfirmationOnDirty"; import { Section } from "./components/Section"; import { SyncCatalogField } from "./components/SyncCatalogField"; @@ -32,6 +34,8 @@ interface ConnectionFormFieldsProps { } export const ConnectionFormFields: React.FC = ({ values, isSubmitting, dirty }) => { + const isSchemaChangesEnabled = useIsAutoDetectSchemaChangesEnabled(); + const { mode, formId } = useConnectionFormService(); const { formatMessage } = useIntl(); const { clearFormChange } = useFormChangeTrackerService(); @@ -46,6 +50,8 @@ export const ConnectionFormFields: React.FC = ({ valu clearFormChange(formId); }); + const isNewStreamsTableEnabled = process.env.REACT_APP_NEW_STREAMS_TABLE ?? false; + return ( <> {/* FormChangeTracker is here as it has access to everything it needs without being repeated */} @@ -53,69 +59,74 @@ export const ConnectionFormFields: React.FC = ({ valu
}> + {isSchemaChangesEnabled && ( + + )}
-
- - - - - - - {values.namespaceDefinition === NamespaceDefinitionType.customformat && ( - - {({ field, meta }: FieldProps) => ( + {!isNewStreamsTableEnabled && ( +
+ + + + + + + {values.namespaceDefinition === NamespaceDefinitionType.customformat && ( + + {({ field, meta }: FieldProps) => ( +
+
+ } + message={} + /> +
+
+ +
+
+ )} +
+ )} + + {({ field }: FieldProps) => (
} - message={} + label={formatMessage({ + id: "form.prefix", + })} + message={formatMessage({ + id: "form.prefix.message", + })} />
-
+
)} - )} - - {({ field }: FieldProps) => ( -
-
- -
-
- -
-
- )} -
-
+
+ )}
Heroku Postgres", "namespaceDefinition": "source", "namespaceFormat": "\${SOURCE_NAMESPACE}", + "nonBreakingChangesPreference": "ignore", "normalization": "basic", "prefix": "", "scheduleData": null, @@ -538,6 +539,7 @@ Object { "geography": "auto", "namespaceDefinition": "source", "namespaceFormat": "\${SOURCE_NAMESPACE}", + "nonBreakingChangesPreference": "ignore", "normalization": "basic", "prefix": "", "scheduleData": null, @@ -1071,6 +1073,7 @@ Object { "name": "Scrafty <> Heroku Postgres", "namespaceDefinition": "source", "namespaceFormat": "\${SOURCE_NAMESPACE}", + "nonBreakingChangesPreference": "ignore", "normalization": "basic", "prefix": "", "scheduleData": null, diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.test.ts b/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.test.ts index a4d7b5929c89..daaacdc0afc2 100644 --- a/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.test.ts +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.test.ts @@ -66,6 +66,56 @@ describe("calculateInitialCatalog", () => { }); }); + it("should not select Incremental | Append Dedup if no source defined primary key is available", () => { + const { config, stream: sourceDefinedStream } = mockSyncSchemaStream; + + const values = calculateInitialCatalog( + { + streams: [ + { + id: "1", + stream: { + ...sourceDefinedStream, + name: "test", + sourceDefinedCursor: true, + defaultCursorField: ["id"], + supportedSyncModes: [SyncMode.full_refresh, SyncMode.incremental], + sourceDefinedPrimaryKey: undefined, + }, + config: { + ...config, + destinationSyncMode: DestinationSyncMode.overwrite, + syncMode: SyncMode.full_refresh, + }, + }, + { + id: "2", + stream: { + ...sourceDefinedStream, + name: "test", + sourceDefinedCursor: true, + defaultCursorField: ["updated_at"], + supportedSyncModes: [SyncMode.full_refresh, SyncMode.incremental], + sourceDefinedPrimaryKey: [], + }, + config: { + ...config, + destinationSyncMode: DestinationSyncMode.append_dedup, + syncMode: SyncMode.full_refresh, + }, + }, + ], + }, + [DestinationSyncMode.append_dedup, DestinationSyncMode.overwrite], + false + ); + + values.streams.forEach((stream) => { + expect(stream).toHaveProperty("config.syncMode", SyncMode.full_refresh); + expect(stream).toHaveProperty("config.destinationSyncMode", DestinationSyncMode.overwrite); + }); + }); + it("should select 'Incremental(cursor defined) => Append Dedup'", () => { const { config, stream: sourceDefinedStream } = mockSyncSchemaStream; @@ -79,7 +129,11 @@ describe("calculateInitialCatalog", () => { name: "test", sourceDefinedCursor: true, defaultCursorField: ["id"], - supportedSyncModes: [SyncMode.incremental], + supportedSyncModes: [SyncMode.full_refresh, SyncMode.incremental], + sourceDefinedPrimaryKey: [ + ["primary", "field1"], + ["primary", "field2"], + ], }, config: { ...config, @@ -94,7 +148,11 @@ describe("calculateInitialCatalog", () => { name: "test", sourceDefinedCursor: true, defaultCursorField: ["updated_at"], - supportedSyncModes: [SyncMode.incremental], + supportedSyncModes: [SyncMode.full_refresh, SyncMode.incremental], + sourceDefinedPrimaryKey: [ + ["primary", "field1"], + ["primary", "field2"], + ], }, config: { ...config, @@ -110,6 +168,10 @@ describe("calculateInitialCatalog", () => { sourceDefinedCursor: true, defaultCursorField: ["name"], supportedSyncModes: [SyncMode.incremental], + sourceDefinedPrimaryKey: [ + ["primary", "field1"], + ["primary", "field2"], + ], }, config: { ...config, diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.ts b/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.ts index 983c83eebc22..a9b6dc54b937 100644 --- a/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.ts +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/calculateInitialCatalog.ts @@ -81,13 +81,14 @@ const getOptimalSyncMode = ( return streamNode; } const { - stream: { supportedSyncModes, sourceDefinedCursor }, + stream: { supportedSyncModes, sourceDefinedCursor, sourceDefinedPrimaryKey }, } = streamNode; if ( supportedSyncModes.includes(SyncMode.incremental) && supportedDestinationSyncModes.includes(DestinationSyncMode.append_dedup) && - sourceDefinedCursor + sourceDefinedCursor && + sourceDefinedPrimaryKey?.length ) { return updateStreamConfig({ syncMode: SyncMode.incremental, diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.module.scss b/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.module.scss new file mode 100644 index 000000000000..048cc29205f6 --- /dev/null +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.module.scss @@ -0,0 +1,31 @@ +@use "scss/colors"; +@use "scss/variables"; + +.flexRow { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + gap: variables.$spacing-md; +} + +.connectorLabel { + max-width: 328px; + margin-right: variables.$spacing-xl; + vertical-align: top; +} + +.leftFieldCol { + flex: 1; + max-width: 640px; + padding-right: 30px; +} + +.rightFieldCol { + flex: 1; + max-width: 300px; +} + +.disabled { + pointer-events: none; +} diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.tsx b/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.tsx new file mode 100644 index 000000000000..bbaf9f786e3c --- /dev/null +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/components/NonBreakingChangesPreferenceField.tsx @@ -0,0 +1,54 @@ +import classNames from "classnames"; +import { FieldProps } from "formik"; +import { useMemo } from "react"; +import { useIntl } from "react-intl"; + +import { ControlLabels } from "components"; +import { DropDown } from "components/ui/DropDown"; + +import { NonBreakingChangesPreference } from "core/request/AirbyteClient"; +import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; + +import styles from "./NonBreakingChangesPreferenceField.module.scss"; + +export const NonBreakingChangesPreferenceField: React.FC> = ({ field, form }) => { + const { formatMessage } = useIntl(); + + const preferenceOptions = useMemo(() => { + const values = Object.values(NonBreakingChangesPreference); + return values.map((value) => ({ + value, + label: formatMessage({ id: `connectionForm.nonBreakingChangesPreference.${value}` }), + testId: `nonBreakingChangesPreference-${value}`, + })); + }, [formatMessage]); + + const { mode } = useConnectionFormService(); + + return ( +
+
+ +
+
+ form.setFieldValue(field.name, value)} + /> +
+
+ ); +}; diff --git a/airbyte-webapp/src/views/Connection/ConnectionForm/formConfig.tsx b/airbyte-webapp/src/views/Connection/ConnectionForm/formConfig.tsx index 6aab43856633..b47150dd6e24 100644 --- a/airbyte-webapp/src/views/Connection/ConnectionForm/formConfig.tsx +++ b/airbyte-webapp/src/views/Connection/ConnectionForm/formConfig.tsx @@ -19,6 +19,7 @@ import { DestinationSyncMode, Geography, NamespaceDefinitionType, + NonBreakingChangesPreference, OperationCreate, OperationRead, OperatorType, @@ -36,6 +37,7 @@ export interface FormikConnectionFormValues { name?: string; scheduleType?: ConnectionScheduleType | null; scheduleData?: ConnectionScheduleData | null; + nonBreakingChangesPreference?: NonBreakingChangesPreference | null; prefix: string; syncCatalog: SyncSchema; namespaceDefinition?: NamespaceDefinitionType; @@ -80,11 +82,13 @@ export function useDefaultTransformation(): OperationCreate { interface CreateConnectionValidationSchemaArgs { allowSubOneHourCronExpressions: boolean; mode: ConnectionFormMode; + isAutoDetectSchemaChangesEnabled: boolean; } export const createConnectionValidationSchema = ({ mode, allowSubOneHourCronExpressions, + isAutoDetectSchemaChangesEnabled, }: CreateConnectionValidationSchemaArgs) => yup .object({ @@ -126,6 +130,10 @@ export const createConnectionValidationSchema = ({ .defined("form.empty.error"), }); }), + nonBreakingChangesPreference: isAutoDetectSchemaChangesEnabled + ? yup.mixed().oneOf(Object.values(NonBreakingChangesPreference)).required("form.empty.error") + : yup.mixed().notRequired(), + namespaceDefinition: yup .string() .oneOf([ @@ -292,6 +300,7 @@ export const useInitialValues = ( syncCatalog: initialSchema, scheduleType: connection.connectionId ? connection.scheduleType : ConnectionScheduleType.basic, scheduleData: connection.connectionId ? connection.scheduleData ?? null : DEFAULT_SCHEDULE, + nonBreakingChangesPreference: connection.nonBreakingChangesPreference ?? NonBreakingChangesPreference.ignore, prefix: connection.prefix || "", namespaceDefinition: connection.namespaceDefinition || NamespaceDefinitionType.source, namespaceFormat: connection.namespaceFormat ?? SOURCE_NAMESPACE_TAG, @@ -321,6 +330,7 @@ export const useInitialValues = ( connection.name, connection.namespaceDefinition, connection.namespaceFormat, + connection.nonBreakingChangesPreference, connection.operations, connection.prefix, connection.scheduleData, diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx index 8162ef054f29..d862c8eaa071 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx @@ -149,6 +149,8 @@ export const ConnectorCard: React.FC { { + onSubmit={async (values) => { result = values; }} selectedConnectorDefinitionSpecification={ @@ -381,7 +381,7 @@ describe("Service Form", () => { const renderConnectorForm = (props: ConnectorFormProps) => render(); // eslint-disable-next-line @typescript-eslint/no-empty-function - const onSubmitClb = () => {}; + const onSubmitClb = async () => {}; const connectorDefSpec = { connectionSpecification: schema, sourceDefinitionId: "test-service-type", diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx index 20a2ecd54803..5c3d739bf8b5 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx @@ -89,7 +89,7 @@ export interface ConnectorFormProps { formId?: string; selectedConnectorDefinition?: ConnectorDefinition; selectedConnectorDefinitionSpecification?: ConnectorDefinitionSpecification; - onSubmit: (values: ConnectorFormValues) => Promise | void; + onSubmit: (values: ConnectorFormValues) => Promise; isLoading?: boolean; isEditMode?: boolean; formValues?: Partial; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap index 156cf2188e81..1233916b162d 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap @@ -90,7 +90,7 @@ exports[` should renders with mock data without > Google Sheets
-
should renders with mock data without > Alpha
-
+ @@ -141,7 +141,7 @@ exports[` should renders with mock data without > BigQuery -
should renders with mock data without fill-rule="evenodd" /> -
+ @@ -288,7 +288,7 @@ exports[` should renders with mock data without > Postgres -
should renders with mock data without > Alpha
-
+ diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/Control.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/Control.tsx index 669ebdbbf253..2208ee16b979 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/Control.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/Control.tsx @@ -1,6 +1,7 @@ import { Field, useField } from "formik"; import React from "react"; +import { DatePicker } from "components/ui/DatePicker"; import { DropDown } from "components/ui/DropDown"; import { Input } from "components/ui/Input"; import { Multiselect } from "components/ui/Multiselect"; @@ -9,6 +10,7 @@ import { TagInput } from "components/ui/TagInput/TagInput"; import { TextArea } from "components/ui/TextArea"; import { FormBaseItem } from "core/form/types"; +import { useExperiment } from "hooks/services/Experiment"; import { isDefined } from "utils/common"; import ConfirmationControl from "./ConfirmationControl"; @@ -33,6 +35,7 @@ export const Control: React.FC = ({ error, }) => { const [field, meta, helpers] = useField(name); + const useDatepickerExperiment = useExperiment("connector.form.useDatepicker", true); if (property.type === "array" && !property.enum) { return ( @@ -42,7 +45,7 @@ export const Control: React.FC = ({ name={name} fieldValue={field.value || []} onChange={(tagLabels) => helpers.setValue(tagLabels)} - // error={!!meta.error} + error={!!meta.error} disabled={disabled} /> )} @@ -66,6 +69,26 @@ export const Control: React.FC = ({ ); } + if ( + property.type === "string" && + (property.format === "date-time" || property.format === "date") && + useDatepickerExperiment + ) { + return ( + { + helpers.setTouched(true); + helpers.setValue(value); + }} + value={field.value} + disabled={disabled} + onBlur={() => helpers.setTouched(true)} + /> + ); + } + const value = field.value ?? property.default; if (property.enum) { return ( diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.module.scss index 9215d04fa872..c8f21baff30b 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.module.scss +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.module.scss @@ -4,36 +4,51 @@ .container { display: flex; flex-direction: column; - gap: 10px; + gap: variables.$spacing-md; } .descriptionHeader { margin-top: 0; - margin-bottom: 5px; + margin-bottom: variables.$spacing-sm; } .description ul { - padding-left: 25px; - margin-bottom: 5px; - margin-top: 5px; + padding-left: variables.$spacing-xl; + margin-bottom: variables.$spacing-sm; + margin-top: variables.$spacing-sm; +} + +.optionsHeader { + margin-top: 0; + margin-bottom: variables.$spacing-sm; +} + +.options { + padding-left: variables.$spacing-xl; + margin-bottom: 0; + margin-top: variables.$spacing-sm; +} + +.options li { + margin-top: variables.$spacing-sm; } .exampleHeader { margin-block-start: 0; - margin-bottom: 5px; + margin-bottom: variables.$spacing-sm; } .exampleContainer { display: flex; flex-flow: row wrap; - row-gap: 7px; - column-gap: 7px; + row-gap: variables.$spacing-sm; + column-gap: variables.$spacing-sm; } .exampleItem { width: max-content; max-width: 100%; - padding: 3px 6px; + padding: variables.$spacing-xs variables.$spacing-sm; background-color: colors.$dark-blue-400; border-radius: variables.$border-radius-md; } diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.tsx index df51042dfe03..0b9134c276df 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/LabelInfo.tsx @@ -10,6 +10,7 @@ interface LabelInfoProps { label: React.ReactNode; examples?: JSONSchema7Type; description?: string; + options?: Array<{ title: string; description?: string }>; } const Description: React.FC> = ({ label, description }) => { @@ -20,12 +21,39 @@ const Description: React.FC> = ({ return (
{/* don't use here, because we want the default parent styling for this header */} -

{label}

+

{label}

); }; +const Options: React.FC> = ({ options }) => { + if (!options) { + return null; + } + + return ( +
+

+ +

+
    + {options.map((option) => ( +
  • + {option.title} + {option.description && ( + <> + {" "} + - + + )} +
  • + ))} +
+
+ ); +}; + const Examples: React.FC> = ({ examples }) => { if (!examples) { return null; @@ -48,10 +76,11 @@ const Examples: React.FC> = ({ examples }) => { ); }; -export const LabelInfo: React.FC = ({ label, examples, description }) => { +export const LabelInfo: React.FC = ({ label, examples, description, options }) => { return (
+
); diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.stories.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.stories.tsx index ff77000ea784..89dc7813d5b4 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.stories.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.stories.tsx @@ -33,3 +33,44 @@ Primary.args = { optional: true, children: , }; + +export const ConditionLabel = Template.bind({}); +ConditionLabel.args = { + // a "form field" from the useBuildForm() hook + property: { + isRequired: false, + _type: "formCondition", + fieldKey: "field_key", + path: "section.Fieldname", + conditions: { + one: { + isRequired: true, + type: "string", + _type: "formItem", + fieldKey: "field_key", + path: "section.Fieldname", + title: "Title of first option", + description: "Description of the item", + }, + two: { + isRequired: true, + type: "string", + _type: "formItem", + fieldKey: "field_key", + path: "section.Fieldname", + }, + three: { + isRequired: true, + type: "string", + _type: "formItem", + fieldKey: "field_key", + path: "section.Fieldname", + description: + "Sometimes the description can be a bit longer - in this case there is a lot of text in here and so on.", + }, + }, + }, + label: "Property name", + description: "The description of the property, placed in the info tooltip", + children: , +}; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.tsx index 9584d37b3399..89ae592a617a 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Property/PropertyLabel.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useMemo } from "react"; import { ControlLabels } from "components/LabeledControl"; @@ -27,13 +27,28 @@ export const PropertyLabel: React.FC const examples = property._type === "formItem" || property._type === "formGroup" ? property.examples : undefined; const descriptionToDisplay = description ?? property.description; + const optionDescriptions = useMemo(() => { + if (property._type !== "formCondition") { + return; + } + return Object.entries(property.conditions).map(([key, condition]) => ({ + title: condition.title || key, + description: condition.description, + })); + }, [property]); + return ( + ) } optional={optional ?? !property.isRequired} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ArraySection.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ArraySection.tsx index 16643306d7a0..655adbbce883 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ArraySection.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ArraySection.tsx @@ -8,6 +8,7 @@ import { TooltipTable } from "components/ui/Tooltip"; import { FormBlock, FormGroupItem, FormObjectArrayItem } from "core/form/types"; import { GroupLabel } from "./GroupLabel"; +import { SectionContainer } from "./SectionContainer"; import { VariableInputFieldForm } from "./VariableInputFieldForm"; interface ArraySectionProps { @@ -67,45 +68,47 @@ export const ArraySection: React.FC = ({ formField, path, dis const clearEditIndex = () => setEditIndex(undefined); return ( - } - > - + ( - ( - { - const updatedValue = - editIndex !== undefined && editIndex < items.length - ? items.map((item: unknown, index: number) => (index === editIndex ? updatedItem : item)) - : [...items, updatedItem]; + key={`form-variable-fields-${formField?.fieldKey}`} + label={} + > + ( + ( + { + const updatedValue = + editIndex !== undefined && editIndex < items.length + ? items.map((item: unknown, index: number) => (index === editIndex ? updatedItem : item)) + : [...items, updatedItem]; - fieldHelper.setValue(updatedValue); - clearEditIndex(); - }} - onCancel={clearEditIndex} - /> - )} - /> - )} - /> - + fieldHelper.setValue(updatedValue); + clearEditIndex(); + }} + onCancel={clearEditIndex} + /> + )} + /> + )} + /> + + ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.module.scss deleted file mode 100644 index abd86c78739e..000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "scss/colors"; - -.groupDropdown { - margin-left: auto; - padding: 0 2px; - background-color: colors.$white; - min-width: calc(50% - 100px); -} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.tsx index 39aa98598b9a..6550a2602b59 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/ConditionSection.tsx @@ -9,9 +9,9 @@ import { isDefined } from "utils/common"; import { useConnectorForm } from "../../connectorFormContext"; import { ConnectorFormValues } from "../../types"; -import styles from "./ConditionSection.module.scss"; import { FormSection } from "./FormSection"; import { GroupLabel } from "./GroupLabel"; +import { SectionContainer } from "./SectionContainer"; interface ConditionSectionProps { formField: FormConditionItem; @@ -63,13 +63,12 @@ export const ConditionSection: React.FC = ({ formField, p ); return ( - - + + } + dropdown={ = ({ formField, p isDisabled={disabled} error={typeof meta.error === "string" && !!meta.error} /> - - } - > - - + } + > + + + ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.module.scss deleted file mode 100644 index 10dc11765f1a..000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.module.scss +++ /dev/null @@ -1,12 +0,0 @@ -@use "../../../../../scss/colors"; -@use "../../../../../scss/variables"; - -.groupLabel { - width: auto; - height: 100%; - padding-right: variables.$spacing-md; - display: flex; - align-items: center; - background-color: colors.$white; - white-space: nowrap; -} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.tsx index c283a3d05cb6..8323d152a46a 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/GroupLabel.tsx @@ -1,19 +1,11 @@ import { FormConditionItem, FormObjectArrayItem } from "core/form/types"; import { PropertyLabel } from "../Property/PropertyLabel"; -import styles from "./GroupLabel.module.scss"; interface GroupLabelProps { formField: FormConditionItem | FormObjectArrayItem; } export const GroupLabel: React.FC = ({ formField }) => { - return ( - - ); + return ; }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/StartWithDestination/__snapshots__/StartWithDestinationCard.test.tsx.snap b/airbyte-webapp/src/views/Connector/ConnectorForm/components/StartWithDestination/__snapshots__/StartWithDestinationCard.test.tsx.snap index 7ed2232c68c7..747127951891 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/StartWithDestination/__snapshots__/StartWithDestinationCard.test.tsx.snap +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/StartWithDestination/__snapshots__/StartWithDestinationCard.test.tsx.snap @@ -35,7 +35,7 @@ exports[` should renders without crash with provided > Don’t have your own destination yet? -
should renders without crash with provided > Alpha
-
+
console.log(v), + onSubmit: async (v) => console.log(v), availableServices: [TempConnector], }, decorators: [withMock], diff --git a/airbyte-webapp/src/views/common/ErrorOccurredView/ErrorOccurredView.tsx b/airbyte-webapp/src/views/common/ErrorOccurredView/ErrorOccurredView.tsx index cc6a3a6e2a1e..316b7e33ebcf 100644 --- a/airbyte-webapp/src/views/common/ErrorOccurredView/ErrorOccurredView.tsx +++ b/airbyte-webapp/src/views/common/ErrorOccurredView/ErrorOccurredView.tsx @@ -14,7 +14,7 @@ interface ErrorOccurredViewProps { export const ErrorOccurredView: React.FC = ({ message, onCtaButtonClick, ctaButtonText }) => { return ( -
+
diff --git a/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml b/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml index d3c24d7aa12f..9bd4abf2ef6a 100644 --- a/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml +++ b/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml @@ -21,6 +21,10 @@ properties: supportsDbt: type: boolean default: false + integrationType: + type: string protocolVersion: type: object existingJavaType: io.airbyte.commons.version.Version + isCustomConnector: + type: boolean diff --git a/airbyte-workers/Dockerfile b/airbyte-workers/Dockerfile index caf2e27bdb06..dcfe175248bf 100644 --- a/airbyte-workers/Dockerfile +++ b/airbyte-workers/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.23 +ARG VERSION=0.40.24 ENV APPLICATION airbyte-workers ENV VERSION ${VERSION} @@ -20,8 +20,5 @@ WORKDIR /app # Move worker app ADD bin/${APPLICATION}-${VERSION}.tar /app -# Grab well-known types file -COPY WellKnownTypes.json /app - # wait for upstream dependencies to become available before starting server ENTRYPOINT ["/bin/bash", "-c", "${APPLICATION}-${VERSION}/bin/${APPLICATION}"] diff --git a/airbyte-workers/build.gradle b/airbyte-workers/build.gradle index 8c36042c85f1..681fe2f30933 100644 --- a/airbyte-workers/build.gradle +++ b/airbyte-workers/build.gradle @@ -1,6 +1,3 @@ -import groovy.yaml.YamlSlurper -import groovy.json.JsonBuilder - plugins { id 'application' id 'airbyte-integration-test-java' @@ -120,20 +117,8 @@ task cloudStorageIntegrationTest(type: Test) { } } -task generateWellKnownTypes() { - doLast { - def wellKnownTypesYaml = project(':airbyte-protocol').file('protocol-models/src/main/resources/airbyte_protocol/well_known_types.yaml').text - def parsedYaml = new YamlSlurper().parseText(wellKnownTypesYaml) - def wellKnownTypesJson = new JsonBuilder(parsedYaml).toPrettyString() - def targetFile = project.file("${buildDir}/docker/WellKnownTypes.json") - targetFile.getParentFile().mkdirs() - targetFile.text = wellKnownTypesJson - } -} - tasks.named("buildDockerImage") { dependsOn copyGeneratedTar - dependsOn generateWellKnownTypes } Task publishArtifactsTask = getPublishArtifactsTask("$rootProject.ext.version", project) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java index b8821c67ae0e..7c333e8a0b75 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java @@ -24,6 +24,7 @@ import io.airbyte.workers.temporal.sync.NormalizationActivity; import io.airbyte.workers.temporal.sync.NormalizationSummaryCheckActivity; import io.airbyte.workers.temporal.sync.PersistStateActivity; +import io.airbyte.workers.temporal.sync.RefreshSchemaActivity; import io.airbyte.workers.temporal.sync.ReplicationActivity; import io.airbyte.workers.temporal.sync.WebhookOperationActivity; import io.micronaut.context.annotation.Factory; @@ -110,9 +111,11 @@ public List syncActivities( final DbtTransformationActivity dbtTransformationActivity, final PersistStateActivity persistStateActivity, final NormalizationSummaryCheckActivity normalizationSummaryCheckActivity, - final WebhookOperationActivity webhookOperationActivity) { + final WebhookOperationActivity webhookOperationActivity, + final ConfigFetchActivity configFetchActivity, + final RefreshSchemaActivity refreshSchemaActivity) { return List.of(replicationActivity, normalizationActivity, dbtTransformationActivity, persistStateActivity, normalizationSummaryCheckActivity, - webhookOperationActivity); + webhookOperationActivity, configFetchActivity, refreshSchemaActivity); } @Singleton diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java index 19168b4678da..c35c88dc1e10 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java @@ -9,6 +9,8 @@ import com.auth0.jwt.algorithms.Algorithm; import com.google.auth.oauth2.ServiceAccountCredentials; import io.airbyte.api.client.AirbyteApiClient; +import io.airbyte.api.client.generated.SourceApi; +import io.airbyte.api.client.invoker.generated.ApiClient; import io.airbyte.commons.temporal.config.WorkerMode; import io.micronaut.context.BeanProvider; import io.micronaut.context.annotation.Factory; @@ -35,26 +37,34 @@ public class ApiClientBeanFactory { private static final int JWT_TTL_MINUTES = 5; @Singleton - public AirbyteApiClient airbyteApiClient( - @Value("${airbyte.internal.api.auth-header.name}") final String airbyteApiAuthHeaderName, - @Value("${airbyte.internal.api.host}") final String airbyteApiHost, - @Named("internalApiAuthToken") final BeanProvider internalApiAuthToken, - @Named("internalApiScheme") final String internalApiScheme) { - return new AirbyteApiClient( - new io.airbyte.api.client.invoker.generated.ApiClient() - .setScheme(internalApiScheme) - .setHost(parseHostName(airbyteApiHost)) - .setPort(parsePort(airbyteApiHost)) - .setBasePath("/api") - .setHttpClientBuilder(HttpClient.newBuilder().version(Version.HTTP_1_1)) - .setRequestInterceptor(builder -> { - builder.setHeader("User-Agent", "WorkerApp"); - // internalApiAuthToken is in BeanProvider because we want to create a new token each - // time we send a request. - if (!airbyteApiAuthHeaderName.isBlank()) { - builder.setHeader(airbyteApiAuthHeaderName, internalApiAuthToken.get()); - } - })); + public ApiClient apiClient(@Value("${airbyte.internal.api.auth-header.name}") final String airbyteApiAuthHeaderName, + @Value("${airbyte.internal.api.host}") final String airbyteApiHost, + @Named("internalApiAuthToken") final BeanProvider internalApiAuthToken, + @Named("internalApiScheme") final String internalApiScheme) { + return new io.airbyte.api.client.invoker.generated.ApiClient() + .setScheme(internalApiScheme) + .setHost(parseHostName(airbyteApiHost)) + .setPort(parsePort(airbyteApiHost)) + .setBasePath("/api") + .setHttpClientBuilder(HttpClient.newBuilder().version(Version.HTTP_1_1)) + .setRequestInterceptor(builder -> { + builder.setHeader("User-Agent", "WorkerApp"); + // internalApiAuthToken is in BeanProvider because we want to create a new token each + // time we send a request. + if (!airbyteApiAuthHeaderName.isBlank()) { + builder.setHeader(airbyteApiAuthHeaderName, internalApiAuthToken.get()); + } + }); + } + + @Singleton + public AirbyteApiClient airbyteApiClient(ApiClient apiClient) { + return new AirbyteApiClient(apiClient); + } + + @Singleton + public SourceApi sourceApi(final ApiClient apiClient) { + return new SourceApi(apiClient); } @Singleton diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/config/JobErrorReportingBeanFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/config/JobErrorReportingBeanFactory.java index f9f6c8aeb03d..44b1e323408f 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/config/JobErrorReportingBeanFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/config/JobErrorReportingBeanFactory.java @@ -13,7 +13,6 @@ import io.airbyte.persistence.job.errorreporter.LoggingJobErrorReportingClient; import io.airbyte.persistence.job.errorreporter.SentryExceptionHelper; import io.airbyte.persistence.job.errorreporter.SentryJobErrorReportingClient; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; import io.micronaut.context.annotation.Factory; import io.micronaut.context.annotation.Requires; import io.micronaut.context.annotation.Value; @@ -59,8 +58,6 @@ public JobErrorReporter jobErrorReporter( configRepository, deploymentMode, airbyteVersion, - NormalizationRunnerFactory.BASE_NORMALIZATION_IMAGE_NAME, - NormalizationRunnerFactory.NORMALIZATION_VERSION, webUrlHelper, jobErrorReportingClient.orElseGet(() -> new LoggingJobErrorReportingClient())); } diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/config/WorkerConfigurationBeanFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/config/WorkerConfigurationBeanFactory.java index fbee2323e0f9..aeaf2b044df6 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/config/WorkerConfigurationBeanFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/config/WorkerConfigurationBeanFactory.java @@ -85,6 +85,18 @@ public Map specJobKubeAnnotations(@Value("${airbyte.worker.spec. return splitKVPairsFromEnvString(kubeAnnotations); } + @Singleton + @Named("isolatedNodeSelectors") + public Map isolatedNodeSelectors(@Value("${airbyte.worker.isolated.kube.node-selectors}") final String kubeNodeSelectors) { + return splitKVPairsFromEnvString(kubeNodeSelectors); + } + + @Singleton + @Named("useIsolatedNodeSelector") + public boolean useIsolatedNodeSelector(@Value("${airbyte.worker.isolated.kube.use-isolated-node-selector}") final boolean kubeNodeSelectors) { + return kubeNodeSelectors; + } + @Singleton @Named("specJobKubeNodeSelectors") public Map specJobKubeNodeSelectors(@Value("${airbyte.worker.spec.kube.node-selectors}") final String kubeNodeSelectors) { @@ -198,6 +210,12 @@ public ResourceRequirements replicationResourceRequirements( .withMemoryLimit(memoryLimit); } + void validateIsolatedPoolConfigInitialization(boolean useIsolatedNodeSelector, Map isolatedNodeSelectors) { + if (useIsolatedNodeSelector && isolatedNodeSelectors.isEmpty()) { + throw new RuntimeException("Isolated Node selectors is empty while useIsolatedNodeSelector is set to true."); + } + } + @Singleton @Requires(env = WorkerMode.CONTROL_PLANE) @Named("checkWorkerConfigs") @@ -206,6 +224,8 @@ public WorkerConfigs checkWorkerConfigs( @Named("checkResourceRequirements") final ResourceRequirements resourceRequirements, final List jobKubeTolerations, @Named("checkJobKubeNodeSelectors") final Map nodeSelectors, + @Named("isolatedNodeSelectors") final Map isolatedNodeSelectors, + @Named("useIsolatedNodeSelector") final boolean useIsolatedNodeSelector, @Named("checkJobKubeAnnotations") final Map annotations, @Value("${airbyte.worker.job.kube.main.container.image-pull-secret}") final String mainContainerImagePullSecret, @Value("${airbyte.worker.job.kube.main.container.image-pull-policy}") final String mainContainerImagePullPolicy, @@ -214,11 +234,13 @@ public WorkerConfigs checkWorkerConfigs( @Value("${airbyte.worker.job.kube.images.busybox}") final String busyboxImage, @Value("${airbyte.worker.job.kube.images.curl}") final String curlImage, @Named("jobDefaultEnvMap") final Map jobDefaultEnvMap) { + validateIsolatedPoolConfigInitialization(useIsolatedNodeSelector, isolatedNodeSelectors); return new WorkerConfigs( workerEnvironment, resourceRequirements, jobKubeTolerations, nodeSelectors, + useIsolatedNodeSelector ? Optional.of(isolatedNodeSelectors) : Optional.empty(), annotations, mainContainerImagePullSecret, mainContainerImagePullPolicy, @@ -236,6 +258,8 @@ public WorkerConfigs defaultWorkerConfigs( @Named("defaultResourceRequirements") final ResourceRequirements resourceRequirements, final List jobKubeTolerations, @Named("defaultJobKubeNodeSelectors") final Map nodeSelectors, + @Named("isolatedNodeSelectors") final Map isolatedNodeSelectors, + @Named("useIsolatedNodeSelector") final boolean useIsolatedNodeSelector, @Named("defaultJobKubeAnnotations") final Map annotations, @Value("${airbyte.worker.job.kube.main.container.image-pull-secret}") final String mainContainerImagePullSecret, @Value("${airbyte.worker.job.kube.main.container.image-pull-policy}") final String mainContainerImagePullPolicy, @@ -244,11 +268,13 @@ public WorkerConfigs defaultWorkerConfigs( @Value("${airbyte.worker.job.kube.images.busybox}") final String busyboxImage, @Value("${airbyte.worker.job.kube.images.curl}") final String curlImage, @Named("jobDefaultEnvMap") final Map jobDefaultEnvMap) { + validateIsolatedPoolConfigInitialization(useIsolatedNodeSelector, isolatedNodeSelectors); return new WorkerConfigs( workerEnvironment, resourceRequirements, jobKubeTolerations, nodeSelectors, + useIsolatedNodeSelector ? Optional.of(isolatedNodeSelectors) : Optional.empty(), annotations, mainContainerImagePullSecret, mainContainerImagePullPolicy, @@ -267,6 +293,8 @@ public WorkerConfigs discoverWorkerConfigs( @Named("defaultResourceRequirements") final ResourceRequirements resourceRequirements, final List jobKubeTolerations, @Named("discoverJobKubeNodeSelectors") final Map nodeSelectors, + @Named("isolatedNodeSelectors") final Map isolatedNodeSelectors, + @Named("useIsolatedNodeSelector") final boolean useIsolatedNodeSelector, @Named("discoverJobKubeAnnotations") final Map annotations, @Value("${airbyte.worker.job.kube.main.container.image-pull-secret}") final String mainContainerImagePullSecret, @Value("${airbyte.worker.job.kube.main.container.image-pull-policy}") final String mainContainerImagePullPolicy, @@ -275,11 +303,13 @@ public WorkerConfigs discoverWorkerConfigs( @Value("${airbyte.worker.job.kube.images.busybox}") final String busyboxImage, @Value("${airbyte.worker.job.kube.images.curl}") final String curlImage, @Named("jobDefaultEnvMap") final Map jobDefaultEnvMap) { + validateIsolatedPoolConfigInitialization(useIsolatedNodeSelector, isolatedNodeSelectors); return new WorkerConfigs( workerEnvironment, resourceRequirements, jobKubeTolerations, nodeSelectors, + useIsolatedNodeSelector ? Optional.of(isolatedNodeSelectors) : Optional.empty(), annotations, mainContainerImagePullSecret, mainContainerImagePullPolicy, @@ -297,6 +327,8 @@ public WorkerConfigs replicationWorkerConfigs( @Named("replicationResourceRequirements") final ResourceRequirements resourceRequirements, final List jobKubeTolerations, @Named("defaultJobKubeNodeSelectors") final Map nodeSelectors, + @Named("isolatedNodeSelectors") final Map isolatedNodeSelectors, + @Named("useIsolatedNodeSelector") final boolean useIsolatedNodeSelector, @Named("defaultJobKubeAnnotations") final Map annotations, @Value("${airbyte.worker.job.kube.main.container.image-pull-secret}") final String mainContainerImagePullSecret, @Value("${airbyte.worker.job.kube.main.container.image-pull-policy}") final String mainContainerImagePullPolicy, @@ -305,11 +337,13 @@ public WorkerConfigs replicationWorkerConfigs( @Value("${airbyte.worker.job.kube.images.busybox}") final String busyboxImage, @Value("${airbyte.worker.job.kube.images.curl}") final String curlImage, @Named("jobDefaultEnvMap") final Map jobDefaultEnvMap) { + validateIsolatedPoolConfigInitialization(useIsolatedNodeSelector, isolatedNodeSelectors); return new WorkerConfigs( workerEnvironment, resourceRequirements, jobKubeTolerations, nodeSelectors, + useIsolatedNodeSelector ? Optional.of(isolatedNodeSelectors) : Optional.empty(), annotations, mainContainerImagePullSecret, mainContainerImagePullPolicy, @@ -328,6 +362,8 @@ public WorkerConfigs specWorkerConfigs( @Named("defaultResourceRequirements") final ResourceRequirements resourceRequirements, final List jobKubeTolerations, @Named("specJobKubeNodeSelectors") final Map nodeSelectors, + @Named("isolatedNodeSelectors") final Map isolatedNodeSelectors, + @Named("useIsolatedNodeSelector") final boolean useIsolatedNodeSelector, @Named("specJobKubeAnnotations") final Map annotations, @Value("${airbyte.worker.job.kube.main.container.image-pull-secret}") final String mainContainerImagePullSecret, @Value("${airbyte.worker.job.kube.main.container.image-pull-policy}") final String mainContainerImagePullPolicy, @@ -336,11 +372,13 @@ public WorkerConfigs specWorkerConfigs( @Value("${airbyte.worker.job.kube.images.busybox}") final String busyboxImage, @Value("${airbyte.worker.job.kube.images.curl}") final String curlImage, @Named("jobDefaultEnvMap") final Map jobDefaultEnvMap) { + validateIsolatedPoolConfigInitialization(useIsolatedNodeSelector, isolatedNodeSelectors); return new WorkerConfigs( workerEnvironment, resourceRequirements, jobKubeTolerations, nodeSelectors, + useIsolatedNodeSelector ? Optional.of(isolatedNodeSelectors) : Optional.empty(), annotations, mainContainerImagePullSecret, mainContainerImagePullPolicy, diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/run/TemporalWorkerRunFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/run/TemporalWorkerRunFactory.java index c746f952378f..739ba9d8efc0 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/run/TemporalWorkerRunFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/run/TemporalWorkerRunFactory.java @@ -65,7 +65,9 @@ public CheckedSupplier, Exception> createSupplier(fin .withOperationSequence(resetConnection.getOperationSequence()) .withResourceRequirements(resetConnection.getResourceRequirements()) .withSourceResourceRequirements(resetConnection.getResourceRequirements()) - .withDestinationResourceRequirements(resetConnection.getResourceRequirements()); + .withDestinationResourceRequirements(resetConnection.getResourceRequirements()) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(resetConnection.getIsDestinationCustomConnector()); final TemporalResponse output = temporalClient.submitSync(job.getId(), attemptId, config, connectionId); return toOutputAndStatus(output); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java index 167ae3ac7282..ba21f2af375a 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java @@ -130,7 +130,8 @@ private CheckedSupplier Math.toIntExact(launcherConfig.getAttemptId()), launcherConfig.getDockerImage(), processFactory, - workerConfigs.getResourceRequirements()); + workerConfigs.getResourceRequirements(), + launcherConfig.getIsCustomConnector()); final AirbyteStreamFactory streamFactory = launcherConfig.getProtocolVersion() != null ? new VersionedAirbyteStreamFactory<>(serDeProvider, migratorFactory, launcherConfig.getProtocolVersion()) : new DefaultAirbyteStreamFactory(); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java index 9ba130aed131..5a36c144fc43 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java @@ -124,7 +124,7 @@ private CheckedSupplier return () -> { final IntegrationLauncher integrationLauncher = new AirbyteIntegrationLauncher(launcherConfig.getJobId(), launcherConfig.getAttemptId().intValue(), launcherConfig.getDockerImage(), - processFactory, workerConfigs.getResourceRequirements()); + processFactory, workerConfigs.getResourceRequirements(), launcherConfig.getIsCustomConnector()); final AirbyteStreamFactory streamFactory = new VersionedAirbyteStreamFactory<>(serDeProvider, migratorFactory, launcherConfig.getProtocolVersion()); return new DefaultDiscoverCatalogWorker(configRepository, integrationLauncher, streamFactory); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivity.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivity.java index f5eba653530c..f936f9d93788 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivity.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivity.java @@ -5,12 +5,14 @@ package io.airbyte.workers.temporal.scheduling.activities; import io.airbyte.config.StandardSync; +import io.airbyte.config.StandardSync.Status; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.validation.json.JsonValidationException; import io.temporal.activity.ActivityInterface; import io.temporal.activity.ActivityMethod; import java.io.IOException; import java.time.Duration; +import java.util.Optional; import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Data; @@ -19,6 +21,12 @@ @ActivityInterface public interface ConfigFetchActivity { + @ActivityMethod + Optional getSourceId(UUID connectionId); + + @ActivityMethod + Optional getStatus(UUID connectionId); + @Data @NoArgsConstructor @AllArgsConstructor diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java index 7653502fc257..d8776e6ae55f 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java @@ -176,4 +176,26 @@ public GetMaxAttemptOutput getMaxAttempt() { return new GetMaxAttemptOutput(syncJobMaxAttempts); } + @Override + public Optional getSourceId(UUID connectionId) { + try { + final StandardSync standardSync = getStandardSync(connectionId); + return Optional.ofNullable(standardSync.getSourceId()); + } catch (JsonValidationException | ConfigNotFoundException | IOException e) { + log.info("Encountered an error fetching the connection's Source ID: ", e); + return Optional.empty(); + } + } + + @Override + public Optional getStatus(UUID connectionId) { + try { + final StandardSync standardSync = getStandardSync(connectionId); + return Optional.ofNullable(standardSync.getStatus()); + } catch (JsonValidationException | ConfigNotFoundException | IOException e) { + log.info("Encountered an error fetching the connection's status: ", e); + return Optional.empty(); + } + } + } diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java index 8081cedd4dfc..02c46c8f3a03 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java @@ -76,7 +76,9 @@ public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { .withConfiguredAirbyteCatalog(resetConnection.getConfiguredAirbyteCatalog()) .withOperationSequence(resetConnection.getOperationSequence()) .withResourceRequirements(resetConnection.getResourceRequirements()) - .withState(resetConnection.getState()); + .withState(resetConnection.getState()) + .withIsSourceCustomConnector(resetConnection.getIsSourceCustomConnector()) + .withIsDestinationCustomConnector(resetConnection.getIsDestinationCustomConnector()); } else { throw new IllegalStateException( String.format("Unexpected config type %s for job %d. The only supported config types for this activity are (%s)", @@ -95,21 +97,25 @@ public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { .findFirst(); final String destinationNormalizationDockerImage = optionalDestinationDefinition.map(standardDestinationDefinition -> String.format("%s:%s", standardDestinationDefinition.getNormalizationRepository(), standardDestinationDefinition.getNormalizationTag())).orElse(null); - final boolean supportDbt = optionalDestinationDefinition.isPresent() ? optionalDestinationDefinition.get().getSupportsDbt() : false; + final boolean supportstDbt = optionalDestinationDefinition.isPresent() ? optionalDestinationDefinition.get().getSupportsDbt() : false; + final String integrationType = optionalDestinationDefinition.map(StandardDestinationDefinition::getIntegrationType).orElse(null); final IntegrationLauncherConfig sourceLauncherConfig = new IntegrationLauncherConfig() .withJobId(String.valueOf(jobId)) .withAttemptId((long) attempt) .withDockerImage(config.getSourceDockerImage()) - .withProtocolVersion(config.getSourceProtocolVersion()); + .withProtocolVersion(config.getSourceProtocolVersion()) + .withIsCustomConnector(config.getIsSourceCustomConnector()); final IntegrationLauncherConfig destinationLauncherConfig = new IntegrationLauncherConfig() .withJobId(String.valueOf(jobId)) .withAttemptId((long) attempt) .withDockerImage(config.getDestinationDockerImage()) .withProtocolVersion(config.getDestinationProtocolVersion()) + .withIsCustomConnector(config.getIsDestinationCustomConnector()) .withNormalizationDockerImage(destinationNormalizationDockerImage) - .withSupportsDbt(supportDbt); + .withSupportsDbt(supportstDbt) + .withIntegrationType(integrationType); final StandardSyncInput syncInput = new StandardSyncInput() .withNamespaceDefinition(config.getNamespaceDefinition()) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java index 456af1507218..617727bb4643 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java @@ -156,6 +156,7 @@ public JobCreationOutput createNewJob(final JobCreationInput input) { final Optional jobIdOptional = jobCreator.createResetConnectionJob(destination, standardSync, destinationImageName, new Version(destinationDef.getProtocolVersion()), + destinationDef.getCustom(), standardSyncOperations, streamsToReset); final long jobId = jobIdOptional.isEmpty() diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java index 340eafae4d45..280196052ddb 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java @@ -83,7 +83,8 @@ public ConnectorJobOutput run(final JobRunConfig jobRunConfig, final Integration ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, jobRunConfig.getAttemptId(), DOCKER_IMAGE_KEY, launcherConfig.getDockerImage(), JOB_ID_KEY, jobRunConfig.getJobId())); - final Supplier inputSupplier = () -> new JobGetSpecConfig().withDockerImage(launcherConfig.getDockerImage()); + final Supplier inputSupplier = + () -> new JobGetSpecConfig().withDockerImage(launcherConfig.getDockerImage()).withIsCustomConnector(launcherConfig.getIsCustomConnector()); final ActivityExecutionContext context = Activity.getExecutionContext(); @@ -111,7 +112,8 @@ private CheckedSupplier, Exception> launcherConfig.getAttemptId().intValue(), launcherConfig.getDockerImage(), processFactory, - workerConfigs.getResourceRequirements()); + workerConfigs.getResourceRequirements(), + launcherConfig.getIsCustomConnector()); return new DefaultGetSpecWorker(integrationLauncher, streamFactory); }; diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/DbtTransformationActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/DbtTransformationActivityImpl.java index 447174e223cf..cc716a3e8802 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/DbtTransformationActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/DbtTransformationActivityImpl.java @@ -31,7 +31,7 @@ import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.general.DbtTransformationRunner; import io.airbyte.workers.general.DbtTransformationWorker; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; +import io.airbyte.workers.normalization.DefaultNormalizationRunner; import io.airbyte.workers.process.ProcessFactory; import io.airbyte.workers.sync.DbtLauncherWorker; import io.airbyte.workers.temporal.TemporalAttemptExecution; @@ -142,11 +142,10 @@ private CheckedSupplier, Exception> getLegacyWork Math.toIntExact(jobRunConfig.getAttemptId()), resourceRequirements, new DbtTransformationRunner( - processFactory, NormalizationRunnerFactory.create( - destinationLauncherConfig.getDockerImage(), + processFactory, new DefaultNormalizationRunner( processFactory, - NormalizationRunnerFactory.NORMALIZATION_VERSION, - destinationLauncherConfig.getNormalizationDockerImage()))); + destinationLauncherConfig.getNormalizationDockerImage(), + destinationLauncherConfig.getIntegrationType()))); } private CheckedSupplier, Exception> getContainerLauncherWorkerFactory( diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/NormalizationActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/NormalizationActivityImpl.java index 89ca22f61eed..260644334be4 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/NormalizationActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/NormalizationActivityImpl.java @@ -33,7 +33,7 @@ import io.airbyte.workers.Worker; import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.general.DefaultNormalizationWorker; -import io.airbyte.workers.normalization.NormalizationRunnerFactory; +import io.airbyte.workers.normalization.DefaultNormalizationRunner; import io.airbyte.workers.process.ProcessFactory; import io.airbyte.workers.sync.NormalizationLauncherWorker; import io.airbyte.workers.temporal.TemporalAttemptExecution; @@ -150,11 +150,10 @@ private CheckedSupplier, Except return () -> new DefaultNormalizationWorker( jobRunConfig.getJobId(), Math.toIntExact(jobRunConfig.getAttemptId()), - NormalizationRunnerFactory.create( - destinationLauncherConfig.getDockerImage(), + new DefaultNormalizationRunner( processFactory, - NormalizationRunnerFactory.NORMALIZATION_VERSION, - destinationLauncherConfig.getNormalizationDockerImage()), + destinationLauncherConfig.getNormalizationDockerImage(), + destinationLauncherConfig.getIntegrationType()), workerEnvironment); } diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivity.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivity.java index 3da403ea19ed..d69eea15c9d5 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivity.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivity.java @@ -4,20 +4,16 @@ package io.airbyte.workers.temporal.sync; -import io.airbyte.api.client.invoker.generated.ApiException; -import io.airbyte.config.persistence.ConfigNotFoundException; -import io.airbyte.validation.json.JsonValidationException; import io.temporal.activity.ActivityInterface; import io.temporal.activity.ActivityMethod; -import java.io.IOException; import java.util.UUID; @ActivityInterface public interface RefreshSchemaActivity { @ActivityMethod - boolean shouldRefreshSchema(UUID sourceCatalogId) throws IOException; + boolean shouldRefreshSchema(UUID sourceCatalogId); - public void refreshSchema(UUID sourceCatalogId) throws JsonValidationException, ConfigNotFoundException, IOException, ApiException; + public void refreshSchema(UUID sourceCatalogId, UUID connectionId); } diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivityImpl.java index bc12f37d0ff6..c30631dcf698 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/RefreshSchemaActivityImpl.java @@ -8,31 +8,39 @@ import datadog.trace.api.Trace; import io.airbyte.api.client.generated.SourceApi; -import io.airbyte.api.client.invoker.generated.ApiException; import io.airbyte.api.client.model.generated.SourceDiscoverSchemaRequestBody; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.config.ActorCatalogFetchEvent; import io.airbyte.config.persistence.ConfigRepository; +import jakarta.inject.Singleton; import java.io.IOException; import java.time.OffsetDateTime; import java.util.Optional; import java.util.UUID; +import lombok.extern.slf4j.Slf4j; +@Slf4j +@Singleton public class RefreshSchemaActivityImpl implements RefreshSchemaActivity { private final Optional configRepository; private final SourceApi sourceApi; + private final EnvVariableFeatureFlags envVariableFeatureFlags; - public RefreshSchemaActivityImpl(Optional configRepository, SourceApi sourceApi) { + public RefreshSchemaActivityImpl(Optional configRepository, + SourceApi sourceApi, + EnvVariableFeatureFlags envVariableFeatureFlags) { this.configRepository = configRepository; this.sourceApi = sourceApi; + this.envVariableFeatureFlags = envVariableFeatureFlags; } @Override @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) - public boolean shouldRefreshSchema(UUID sourceCatalogId) throws IOException { + public boolean shouldRefreshSchema(UUID sourceCatalogId) { // if job persistence is unavailable, default to skipping the schema refresh - if (configRepository.isEmpty()) { + if (configRepository.isEmpty() || !envVariableFeatureFlags.autoDetectSchema()) { return false; } @@ -40,20 +48,34 @@ public boolean shouldRefreshSchema(UUID sourceCatalogId) throws IOException { } @Override - public void refreshSchema(UUID sourceCatalogId) throws ApiException { - SourceDiscoverSchemaRequestBody requestBody = - new SourceDiscoverSchemaRequestBody().sourceId(sourceCatalogId).disableCache(true); - sourceApi.discoverSchemaForSource(requestBody); - } + public void refreshSchema(UUID sourceCatalogId, UUID connectionId) { + if (!envVariableFeatureFlags.autoDetectSchema()) { + return; + } - private boolean schemaRefreshRanRecently(UUID sourceCatalogId) throws IOException { - Optional mostRecentFetchEvent = configRepository.get().getMostRecentActorCatalogFetchEventForSource(sourceCatalogId); + SourceDiscoverSchemaRequestBody requestBody = + new SourceDiscoverSchemaRequestBody().sourceId(sourceCatalogId).disableCache(true).connectionId(connectionId); - if (mostRecentFetchEvent.isEmpty()) { - return false; + try { + sourceApi.discoverSchemaForSource(requestBody); + } catch (final Exception e) { + // catching this exception because we don't want to block replication due to a failed schema refresh + log.error("Attempted schema refresh, but failed with error: ", e); } + } - return mostRecentFetchEvent.get().getCreatedAt() > OffsetDateTime.now().minusHours(24l).toEpochSecond(); + private boolean schemaRefreshRanRecently(UUID sourceCatalogId) { + try { + Optional mostRecentFetchEvent = configRepository.get().getMostRecentActorCatalogFetchEventForSource(sourceCatalogId); + if (mostRecentFetchEvent.isEmpty()) { + return false; + } + return mostRecentFetchEvent.get().getCreatedAt() > OffsetDateTime.now().minusHours(24l).toEpochSecond(); + } catch (IOException e) { + // catching this exception because we don't want to block replication due to a failed schema refresh + log.info("Encountered an error fetching most recent actor catalog fetch event: ", e); + return true; + } } } diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java index 389e182ed322..1f920fe68aa0 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java @@ -273,13 +273,15 @@ private CheckedSupplier, Exception> Math.toIntExact(sourceLauncherConfig.getAttemptId()), sourceLauncherConfig.getDockerImage(), processFactory, - syncInput.getSourceResourceRequirements()); + syncInput.getSourceResourceRequirements(), + sourceLauncherConfig.getIsCustomConnector()); final IntegrationLauncher destinationLauncher = new AirbyteIntegrationLauncher( destinationLauncherConfig.getJobId(), Math.toIntExact(destinationLauncherConfig.getAttemptId()), destinationLauncherConfig.getDockerImage(), processFactory, - syncInput.getDestinationResourceRequirements()); + syncInput.getDestinationResourceRequirements(), + destinationLauncherConfig.getIsCustomConnector()); // reset jobs use an empty source to induce resetting all data in destination. final AirbyteSource airbyteSource = isResetJob(sourceLauncherConfig.getDockerImage()) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java index 945c0abe2bc7..e0c4b0f55af8 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java @@ -17,16 +17,21 @@ import io.airbyte.config.NormalizationSummary; import io.airbyte.config.OperatorDbtInput; import io.airbyte.config.OperatorWebhookInput; +import io.airbyte.config.StandardSync.Status; import io.airbyte.config.StandardSyncInput; import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.StandardSyncOperation.OperatorType; import io.airbyte.config.StandardSyncOutput; +import io.airbyte.config.StandardSyncSummary; +import io.airbyte.config.StandardSyncSummary.ReplicationStatus; +import io.airbyte.config.SyncStats; import io.airbyte.config.WebhookOperationSummary; import io.airbyte.metrics.lib.ApmTraceUtils; import io.airbyte.persistence.job.models.IntegrationLauncherConfig; import io.airbyte.persistence.job.models.JobRunConfig; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; import io.airbyte.workers.temporal.annotations.TemporalActivityStub; +import io.airbyte.workers.temporal.scheduling.activities.ConfigFetchActivity; import io.temporal.workflow.Workflow; import java.util.Map; import java.util.Optional; @@ -42,6 +47,8 @@ public class SyncWorkflowImpl implements SyncWorkflow { private static final int CURRENT_VERSION = 2; private static final String NORMALIZATION_SUMMARY_CHECK_TAG = "normalization_summary_check"; private static final int NORMALIZATION_SUMMARY_CHECK_CURRENT_VERSION = 1; + private static final String AUTO_DETECT_SCHEMA_TAG = "auto_detect_schema"; + private static final int AUTO_DETECT_SCHEMA_VERSION = 1; @TemporalActivityStub(activityOptionsBeanName = "longRunActivityOptions") private ReplicationActivity replicationActivity; @@ -55,6 +62,10 @@ public class SyncWorkflowImpl implements SyncWorkflow { private NormalizationSummaryCheckActivity normalizationSummaryCheckActivity; @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") private WebhookOperationActivity webhookOperationActivity; + @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") + private RefreshSchemaActivity refreshSchemaActivity; + @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") + private ConfigFetchActivity configFetchActivity; @Trace(operationName = WORKFLOW_TRACE_OPERATION_NAME) @Override @@ -72,6 +83,28 @@ public StandardSyncOutput run(final JobRunConfig jobRunConfig, final int version = Workflow.getVersion(VERSION_LABEL, Workflow.DEFAULT_VERSION, CURRENT_VERSION); final String taskQueue = Workflow.getInfo().getTaskQueue(); + + final int autoDetectSchemaVersion = + Workflow.getVersion(AUTO_DETECT_SCHEMA_TAG, Workflow.DEFAULT_VERSION, AUTO_DETECT_SCHEMA_VERSION); + + if (autoDetectSchemaVersion >= AUTO_DETECT_SCHEMA_VERSION) { + final Optional sourceId = configFetchActivity.getSourceId(connectionId); + + if (!sourceId.isEmpty() && refreshSchemaActivity.shouldRefreshSchema(sourceId.get())) { + LOGGER.info("Refreshing source schema..."); + refreshSchemaActivity.refreshSchema(sourceId.get(), connectionId); + } + + final Optional status = configFetchActivity.getStatus(connectionId); + if (!status.isEmpty() && Status.INACTIVE == status.get()) { + LOGGER.info("Connection is disabled. Cancelling run."); + final StandardSyncOutput output = + new StandardSyncOutput() + .withStandardSyncSummary(new StandardSyncSummary().withStatus(ReplicationStatus.CANCELLED).withTotalStats(new SyncStats())); + return output; + } + } + StandardSyncOutput syncOutput = replicationActivity.replicate(jobRunConfig, sourceLauncherConfig, destinationLauncherConfig, syncInput, taskQueue); diff --git a/airbyte-workers/src/main/resources/application.yml b/airbyte-workers/src/main/resources/application.yml index 78887a196f87..733ae744ebdb 100644 --- a/airbyte-workers/src/main/resources/application.yml +++ b/airbyte-workers/src/main/resources/application.yml @@ -102,6 +102,10 @@ airbyte: memory: limit: ${CHECK_JOB_MAIN_CONTAINER_MEMORY_LIMIT:} request: ${CHECK_JOB_MAIN_CONTAINER_MEMORY_REQUEST:} + isolated: + kube: + use-isolated-node-selector: ${USE_ISOLATED_NODE_SELECTOR:false} + node-selectors: ${ISOLATED_JOB_KUBE_NODE_SELECTORS:} connection: enabled: ${SHOULD_RUN_CONNECTION_MANAGER_WORKFLOWS:true} discover: diff --git a/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java b/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java index 7dcbdb3cdfb5..582004aef227 100644 --- a/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java +++ b/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java @@ -430,7 +430,7 @@ private Process getProcess(final String entrypoint, final Map fi private Process getProcess(final Map customLabels, final String entrypoint, final Map files) throws WorkerException { - return processFactory.create("tester", "some-id", 0, Path.of("/tmp/job-root"), "busybox:latest", false, files, entrypoint, + return processFactory.create("tester", "some-id", 0, Path.of("/tmp/job-root"), "busybox:latest", false, false, files, entrypoint, DEFAULT_RESOURCE_REQUIREMENTS, customLabels, Collections.emptyMap(), Collections.emptyMap()); } diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/run/TemporalWorkerRunFactoryTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/run/TemporalWorkerRunFactoryTest.java index b522070da341..14d1f99749f0 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/run/TemporalWorkerRunFactoryTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/run/TemporalWorkerRunFactoryTest.java @@ -80,14 +80,18 @@ void testResetConnection() throws Exception { .withDestinationDockerImage("airbyte/fusion_reactor") .withDestinationConfiguration(Jsons.jsonNode(ImmutableMap.of("a", 1))) .withOperationSequence(List.of(new StandardSyncOperation().withName("b"))) - .withConfiguredAirbyteCatalog(new ConfiguredAirbyteCatalog()); + .withConfiguredAirbyteCatalog(new ConfiguredAirbyteCatalog()) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); final JobSyncConfig syncConfig = new JobSyncConfig() .withSourceDockerImage(WorkerConstants.RESET_JOB_SOURCE_DOCKER_IMAGE_STUB) .withDestinationDockerImage(resetConfig.getDestinationDockerImage()) .withDestinationConfiguration(resetConfig.getDestinationConfiguration()) .withOperationSequence(List.of(new StandardSyncOperation().withName("b"))) .withSourceConfiguration(Jsons.emptyObject()) - .withConfiguredAirbyteCatalog(resetConfig.getConfiguredAirbyteCatalog()); + .withConfiguredAirbyteCatalog(resetConfig.getConfiguredAirbyteCatalog()) + .withIsSourceCustomConnector(false) + .withIsDestinationCustomConnector(false); when(job.getConfigType()).thenReturn(ConfigType.RESET_CONNECTION); when(job.getConfig().getResetConnection()).thenReturn(resetConfig); final TemporalResponse mockResponse = mock(TemporalResponse.class); diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java index 4b1da61dd239..4f34adfb858e 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java @@ -184,7 +184,7 @@ void createResetJob() throws JsonValidationException, ConfigNotFoundException, I Mockito.when(mStreamResetPersistence.getStreamResets(CONNECTION_ID)).thenReturn(streamsToReset); Mockito - .when(mJobCreator.createResetConnectionJob(destination, standardSync, DOCKER_IMAGE_NAME, DESTINATION_PROTOCOL_VERSION, List.of(), + .when(mJobCreator.createResetConnectionJob(destination, standardSync, DOCKER_IMAGE_NAME, DESTINATION_PROTOCOL_VERSION, false, List.of(), streamsToReset)) .thenReturn(Optional.of(JOB_ID)); diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/RefreshSchemaActivityTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/RefreshSchemaActivityTest.java index 26086b1dd0d9..d120bf8c7f45 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/RefreshSchemaActivityTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/RefreshSchemaActivityTest.java @@ -12,6 +12,7 @@ import io.airbyte.api.client.generated.SourceApi; import io.airbyte.api.client.invoker.generated.ApiException; import io.airbyte.api.client.model.generated.SourceDiscoverSchemaRequestBody; +import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.config.ActorCatalogFetchEvent; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.workers.temporal.sync.RefreshSchemaActivityImpl; @@ -29,8 +30,8 @@ class RefreshSchemaActivityTest { static private ConfigRepository mConfigRepository; - static private SourceApi mSourceApi; + static private EnvVariableFeatureFlags mEnvVariableFeatureFlags; static private RefreshSchemaActivityImpl refreshSchemaActivity; @@ -38,9 +39,12 @@ class RefreshSchemaActivityTest { @BeforeEach void setUp() { + mSourceApi = mock(SourceApi.class); mConfigRepository = mock(ConfigRepository.class); + mEnvVariableFeatureFlags = mock(EnvVariableFeatureFlags.class); mSourceApi = mock(SourceApi.class); - refreshSchemaActivity = new RefreshSchemaActivityImpl(Optional.of(mConfigRepository), mSourceApi); + when(mEnvVariableFeatureFlags.autoDetectSchema()).thenReturn(true); + refreshSchemaActivity = new RefreshSchemaActivityImpl(Optional.of(mConfigRepository), mSourceApi, mEnvVariableFeatureFlags); } @Test @@ -68,9 +72,10 @@ void testShouldRefreshSchemaRecentRefreshLessThan24HoursAgo() throws IOException @Test void testRefreshSchema() throws ApiException { UUID sourceId = UUID.randomUUID(); - refreshSchemaActivity.refreshSchema(sourceId); + UUID connectionId = UUID.randomUUID(); + refreshSchemaActivity.refreshSchema(sourceId, connectionId); SourceDiscoverSchemaRequestBody requestBody = - new SourceDiscoverSchemaRequestBody().sourceId(sourceId).disableCache(true); + new SourceDiscoverSchemaRequestBody().sourceId(sourceId).disableCache(true).connectionId(connectionId); verify(mSourceApi, times(1)).discoverSchemaForSource(requestBody); } diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java index 31933b9c734d..75b2963c2822 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java @@ -26,6 +26,7 @@ import io.airbyte.config.OperatorWebhookInput; import io.airbyte.config.ResourceRequirements; import io.airbyte.config.StandardSync; +import io.airbyte.config.StandardSync.Status; import io.airbyte.config.StandardSyncInput; import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.StandardSyncOperation.OperatorType; @@ -33,9 +34,12 @@ import io.airbyte.config.StandardSyncSummary; import io.airbyte.config.StandardSyncSummary.ReplicationStatus; import io.airbyte.config.SyncStats; +import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.persistence.job.models.IntegrationLauncherConfig; import io.airbyte.persistence.job.models.JobRunConfig; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; +import io.airbyte.validation.json.JsonValidationException; +import io.airbyte.workers.temporal.scheduling.activities.ConfigFetchActivityImpl; import io.airbyte.workers.temporal.support.TemporalProxyHelper; import io.airbyte.workers.test_utils.TestConfigHelpers; import io.micronaut.context.BeanRegistration; @@ -54,6 +58,7 @@ import java.io.IOException; import java.time.Duration; import java.util.List; +import java.util.Optional; import java.util.UUID; import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.jupiter.api.AfterEach; @@ -79,10 +84,13 @@ class SyncWorkflowTest { private PersistStateActivityImpl persistStateActivity; private NormalizationSummaryCheckActivityImpl normalizationSummaryCheckActivity; private WebhookOperationActivityImpl webhookOperationActivity; + private RefreshSchemaActivityImpl refreshSchemaActivity; + private ConfigFetchActivityImpl configFetchActivity; // AIRBYTE CONFIGURATION private static final long JOB_ID = 11L; private static final int ATTEMPT_ID = 21; + private static final UUID SOURCE_ID = UUID.randomUUID(); private static final JobRunConfig JOB_RUN_CONFIG = new JobRunConfig() .withJobId(String.valueOf(JOB_ID)) .withAttemptId((long) ATTEMPT_ID); @@ -114,7 +122,7 @@ class SyncWorkflowTest { private TemporalProxyHelper temporalProxyHelper; @BeforeEach - void setUp() throws IOException { + void setUp() { testEnv = TestWorkflowEnvironment.newInstance(); syncWorker = testEnv.newWorker(SYNC_QUEUE); client = testEnv.getWorkflowClient(); @@ -146,10 +154,16 @@ void setUp() throws IOException { persistStateActivity = mock(PersistStateActivityImpl.class); normalizationSummaryCheckActivity = mock(NormalizationSummaryCheckActivityImpl.class); webhookOperationActivity = mock(WebhookOperationActivityImpl.class); + refreshSchemaActivity = mock(RefreshSchemaActivityImpl.class); + configFetchActivity = mock(ConfigFetchActivityImpl.class); when(normalizationActivity.generateNormalizationInput(any(), any())).thenReturn(normalizationInput); when(normalizationSummaryCheckActivity.shouldRunNormalization(any(), any(), any())).thenReturn(true); + when(configFetchActivity.getSourceId(sync.getConnectionId())).thenReturn(Optional.of(SOURCE_ID)); + when(refreshSchemaActivity.shouldRefreshSchema(SOURCE_ID)).thenReturn(true); + when(configFetchActivity.getStatus(sync.getConnectionId())).thenReturn(Optional.of(Status.ACTIVE)); + longActivityOptions = ActivityOptions.newBuilder() .setScheduleToCloseTimeout(Duration.ofDays(3)) .setStartToCloseTimeout(Duration.ofDays(3)) @@ -190,7 +204,7 @@ public void tearDown() { // bundle up all the temporal worker setup / execution into one method. private StandardSyncOutput execute() { syncWorker.registerActivitiesImplementations(replicationActivity, normalizationActivity, dbtTransformationActivity, - persistStateActivity, normalizationSummaryCheckActivity, webhookOperationActivity); + persistStateActivity, normalizationSummaryCheckActivity, webhookOperationActivity, refreshSchemaActivity, configFetchActivity); testEnv.start(); final SyncWorkflow workflow = client.newWorkflowStub(SyncWorkflow.class, WorkflowOptions.newBuilder().setTaskQueue(SYNC_QUEUE).build()); @@ -218,6 +232,8 @@ void testSuccess() { verifyNormalize(normalizationActivity, normalizationInput); verifyDbtTransform(dbtTransformationActivity, syncInput.getResourceRequirements(), operatorDbtInput); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); assertEquals( replicationSuccessOutput.withNormalizationSummary(normalizationSummary).getStandardSyncSummary(), actualOutput.getStandardSyncSummary()); @@ -233,6 +249,8 @@ void testReplicationFailure() { assertThrows(WorkflowFailedException.class, this::execute); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyNoInteractions(persistStateActivity); verifyNoInteractions(normalizationActivity); @@ -254,6 +272,8 @@ void testReplicationFailedGracefully() { final StandardSyncOutput actualOutput = execute(); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationFailOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -279,6 +299,8 @@ void testNormalizationFailure() { assertThrows(WorkflowFailedException.class, this::execute); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -298,6 +320,8 @@ void testCancelDuringReplication() { assertThrows(WorkflowFailedException.class, this::execute); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyNoInteractions(persistStateActivity); verifyNoInteractions(normalizationActivity); @@ -322,6 +346,8 @@ void testCancelDuringNormalization() { assertThrows(WorkflowFailedException.class, this::execute); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -330,7 +356,7 @@ void testCancelDuringNormalization() { @Test @Disabled("This behavior has been disabled temporarily (OC Issue #741)") - void testSkipNormalization() throws IOException { + void testSkipNormalization() { final SyncStats syncStats = new SyncStats().withRecordsCommitted(0L); final StandardSyncSummary standardSyncSummary = new StandardSyncSummary().withTotalStats(syncStats); final StandardSyncOutput replicationSuccessOutputNoRecordsCommitted = @@ -345,6 +371,8 @@ void testSkipNormalization() throws IOException { execute(); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutputNoRecordsCommitted, syncInput.getCatalog()); verifyNoInteractions(normalizationActivity); @@ -371,6 +399,17 @@ void testWebhookOperation() { assertEquals(actualOutput.getWebhookOperationSummary().getSuccesses().get(0), WEBHOOK_CONFIG_ID); } + @Test + void testSkipReplicationAfterRefreshSchema() throws JsonValidationException, ConfigNotFoundException, IOException { + when(configFetchActivity.getStatus(any())).thenReturn(Optional.of(Status.INACTIVE)); + StandardSyncOutput output = execute(); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); + verifyNoInteractions(replicationActivity); + verifyNoInteractions(normalizationActivity); + assertEquals(output.getStandardSyncSummary().getStatus(), ReplicationStatus.CANCELLED); + } + @SuppressWarnings("ResultOfMethodCallIgnored") private void cancelWorkflow() { final WorkflowServiceBlockingStub temporalService = testEnv.getWorkflowService().blockingStub(); @@ -423,4 +462,12 @@ private static void verifyDbtTransform(final DbtTransformationActivity dbtTransf operatorDbtInput); } + private static void verifyShouldRefreshSchema(final RefreshSchemaActivity refreshSchemaActivity) { + verify(refreshSchemaActivity).shouldRefreshSchema(SOURCE_ID); + } + + private static void verifyRefreshSchema(final RefreshSchemaActivity refreshSchemaActivity, final StandardSync sync) { + verify(refreshSchemaActivity).refreshSchema(SOURCE_ID, sync.getConnectionId()); + } + } diff --git a/build.gradle b/build.gradle index 5a062ee276b0..821fb7dde5a3 100644 --- a/build.gradle +++ b/build.gradle @@ -20,8 +20,6 @@ buildscript { // The alternative is to import the openapi plugin for all modules. // This might need to be updated when we change openapi plugin versions. classpath 'com.fasterxml.jackson.core:jackson-core:2.13.0' - - classpath 'org.codehaus.groovy:groovy-yaml:3.0.3' } } diff --git a/charts/airbyte-bootloader/Chart.yaml b/charts/airbyte-bootloader/Chart.yaml index 68157614fdf4..fcb2237c2dad 100644 --- a/charts/airbyte-bootloader/Chart.yaml +++ b/charts/airbyte-bootloader/Chart.yaml @@ -22,7 +22,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-connector-builder-server/Chart.yaml b/charts/airbyte-connector-builder-server/Chart.yaml index 00e925be95ba..a2eff1bef1f1 100644 --- a/charts/airbyte-connector-builder-server/Chart.yaml +++ b/charts/airbyte-connector-builder-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-cron/Chart.yaml b/charts/airbyte-cron/Chart.yaml index 30a96daa4acf..e9fba71733b4 100644 --- a/charts/airbyte-cron/Chart.yaml +++ b/charts/airbyte-cron/Chart.yaml @@ -21,7 +21,7 @@ version: 0.1.0 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-server/Chart.yaml b/charts/airbyte-server/Chart.yaml index 282fec3bec5a..1281fa0eafda 100644 --- a/charts/airbyte-server/Chart.yaml +++ b/charts/airbyte-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-temporal/Chart.yaml b/charts/airbyte-temporal/Chart.yaml index 9feba6f20cfa..756903c06ee4 100644 --- a/charts/airbyte-temporal/Chart.yaml +++ b/charts/airbyte-temporal/Chart.yaml @@ -22,7 +22,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-webapp/Chart.yaml b/charts/airbyte-webapp/Chart.yaml index 2ccbb2f6c498..ec597d6c6058 100644 --- a/charts/airbyte-webapp/Chart.yaml +++ b/charts/airbyte-webapp/Chart.yaml @@ -22,7 +22,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte-worker/Chart.yaml b/charts/airbyte-worker/Chart.yaml index f594b653d38a..9cb46c061f52 100644 --- a/charts/airbyte-worker/Chart.yaml +++ b/charts/airbyte-worker/Chart.yaml @@ -22,7 +22,7 @@ version: "0.42.0" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte/Chart.yaml b/charts/airbyte/Chart.yaml index 87992e1989ef..a502a7c59144 100644 --- a/charts/airbyte/Chart.yaml +++ b/charts/airbyte/Chart.yaml @@ -21,7 +21,7 @@ version: 0.42.0 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.23" +appVersion: "0.40.24" dependencies: - name: common diff --git a/charts/airbyte/README.md b/charts/airbyte/README.md index 5ec0b432bf05..6e997c613de6 100644 --- a/charts/airbyte/README.md +++ b/charts/airbyte/README.md @@ -1,6 +1,6 @@ # airbyte -![Version: 0.39.36](https://img.shields.io/badge/Version-0.39.36-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.40.23](https://img.shields.io/badge/AppVersion-0.40.23-informational?style=flat-square) +![Version: 0.39.36](https://img.shields.io/badge/Version-0.39.36-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.40.24](https://img.shields.io/badge/AppVersion-0.40.24-informational?style=flat-square) Helm chart to deploy airbyte @@ -248,7 +248,7 @@ Helm chart to deploy airbyte | worker.hpa.enabled | bool | `false` | | | worker.image.pullPolicy | string | `"IfNotPresent"` | | | worker.image.repository | string | `"airbyte/worker"` | | -| worker.image.tag | string | `"0.40.23"` | | +| worker.image.tag | string | `"0.40.24"` | | | worker.livenessProbe.enabled | bool | `true` | | | worker.livenessProbe.failureThreshold | int | `3` | | | worker.livenessProbe.initialDelaySeconds | int | `30` | | diff --git a/docs/cloud/managing-airbyte-cloud.md b/docs/cloud/managing-airbyte-cloud.md index 0fd5fae44d27..ceb6d5d4d402 100644 --- a/docs/cloud/managing-airbyte-cloud.md +++ b/docs/cloud/managing-airbyte-cloud.md @@ -4,7 +4,7 @@ This page will help you manage your Airbyte Cloud workspaces and understand Airb ## Manage your Airbyte Cloud workspace -An Airbyte Workspace allows you to collaborate with other users and manage connections under a shared billing account. +An Airbyte workspace allows you to collaborate with other users and manage connections under a shared billing account. :::info Airbyte [credits](https://airbyte.com/pricing) are assigned per workspace and cannot be transferred between workspaces. @@ -14,27 +14,29 @@ Airbyte [credits](https://airbyte.com/pricing) are assigned per workspace and ca To add a user to your workspace: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace Settings sidebar, click **Access Management**. +2. Click **Access Management**. 3. Click **+ New user**. -4. On the **Add new users** dialog, enter the email address of the user you want to invite to your workspace. Click **Send invitation**. +4. On the **Add new users** dialog, enter the email address of the user you want to invite to your workspace. + +5. Click **Send invitation**. :::info - The user will have access to only the workspace you invited them to. Also note that they will be added as a workspace admin by default. + The user will have access to only the workspace you invited them to. They will be added as a workspace admin by default. ::: ### Remove users from your workspace​ To remove a user from your workspace: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace Settings sidebar, click **Access Management**. +2. Click **Access Management**. -3. Click **Remove** next to the user’s name. +3. Click **Remove** next to the user’s email. 4. The **Remove user** dialog displays. Click **Remove**. @@ -42,21 +44,23 @@ To remove a user from your workspace: To rename a workspace: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. + +2. Click **General Settings**. -2. In the Workspace Settings sidebar, click **General Settings**. +3. In the **Workspace name** field, enter the new name for your workspace. -3. In the Workspace name field, enter the new name for your workspace. Click **Save**. +4. Click **Save changes**. ### Delete a workspace To delete a workspace: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace Settings sidebar, click **General Settings**. +2. Click **General Settings**. -3. Click **Delete your workspace**. +3. In the **Delete your workspace** section, click **Delete**. ### Single workspace vs. multiple workspaces @@ -72,7 +76,7 @@ You can use one or multiple workspaces with Airbyte Cloud. | Number of workspaces | Benefits | Considerations | |----------------------|-------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------| | Single | You can use the same payment method for all purchases. | Credits pay for the use of resources in a workspace when you run a sync. Resource usage cannot be divided and paid for separately (for example, you cannot bill different departments in your organization for the usage of some credits in one workspace). | -| Multiple | Workspaces are independent of each other, so you can use a different payment method card for each workspace (for example, different credit cards per department in your organization). | You can use the same payment method for different workspaces, but each workspace is billed separately. Managing billing for each workspace can become complicated if you have many workspaces. | +| Multiple | Workspaces are independent of each other, so you can use a different payment method card for each workspace (for example, different credit cards per department in your organization). | You can use the same payment method for different workspaces, but each workspace is billed separately. Managing billing for each workspace can become complicated if you have many workspaces. | ### Switch between multiple workspaces @@ -90,7 +94,7 @@ Default data residency allows you to choose where your data is processed. :::note -Configuring default data residency only applies it to new connections and does not affect existing connections. +Configuring default data residency only applies to new connections and does not affect existing connections. ::: @@ -104,9 +108,9 @@ While the data is processed in a data plane in the chosen residency, the cursor To choose your default data residency: -1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace settings sidebar, click **Data Residency**. +2. Click **Data Residency**. 3. Click the dropdown and choose the location for your default data residency. @@ -114,7 +118,7 @@ To choose your default data residency: :::info -Depending on your network configuration, you may need to add [IP addresses](https://docs.airbyte.com/cloud/getting-started-with-airbyte-cloud#allowlist-ip-address) to your allowlist. +Depending on your network configuration, you may need to add [IP addresses](https://docs.airbyte.com/cloud/getting-started-with-airbyte-cloud/#allowlist-ip-addresses) to your allowlist. ::: @@ -122,15 +126,17 @@ Depending on your network configuration, you may need to add [IP addresses](http To set up Slack notifications: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace Settings sidebar, click **Notifications.** +2. Click **Notifications**. 3. [Create an Incoming Webhook for Slack](https://api.slack.com/messaging/webhooks). -4. Navigate back to the Airbyte Cloud dashboard > Settings > Notifications and enter the Webhook URL. Click **Save changes**. +4. Navigate back to the Airbyte Cloud dashboard > Settings > Notifications and enter the Webhook URL. + +5. Toggle the **When sync fails** and **When sync succeeds** buttons as required. -5. Toggle the **Send notifications when sync fails** and **Send notifications when sync succeeds** buttons as required. +6. Click **Save changes**. ## Understand Airbyte Cloud limits @@ -139,7 +145,7 @@ Understanding the following limitations will help you better manage Airbyte Clou * Max number of workspaces per user: 100 * Max number of sources in a workspace: 100 * Max number of destinations in a workspace: 100 -* Max number of connection in a workspace: 100 +* Max number of connections in a workspace: 100 * Max number of streams that can be returned by a source in a discover call: 1K * Max number of streams that can be configured to sync in a single connection: 1K * Size of a single record: 100MB @@ -150,9 +156,7 @@ Understanding the following limitations will help you better manage Airbyte Clou The sync summary displays information about the data moved during a sync. To view the sync summary: -1. On the [Airbyte Cloud](http://cloud.airbyte.io/) dashboard, click **Connections** in the navigation bar. - - The Connections page displays. +1. On the [Airbyte Cloud](http://cloud.airbyte.io/) dashboard, click **Connections**. 2. Click a connection in the list to view its sync history. @@ -182,13 +186,9 @@ In a successful sync, the number of emitted records and committed records should ## Edit stream configuration -1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** in the navigation bar and then click a connection in the list you want to change. - - The Connection page displays. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** and then click a connection in the list you want to change. -2. Click **Replication**. - - The **Replication** tab displays. +2. Click the **Replication** tab. The **Transfer** and **Streams** settings include the following parameters: @@ -212,7 +212,7 @@ If you need to use [cron scheduling](http://www.quartz-scheduler.org/documentati * Only one sync per connection can run at a time. * If cron schedules a sync to run before the last one finishes, the scheduled sync will start after the last sync completes. -* Cloud does not allow schedules that sync more than once per hour. +* Airbyte Cloud does not allow schedules that sync more than once per hour. ::: @@ -265,7 +265,7 @@ To save the changes: :::caution -Airbyte recommends that you reset the streams. A reset will delete data in the destination of the affected streams and then re-sync that data. Skipping the reset is discouraged and might lead to unexpected behavior. +Airbyte recommends that you reset streams. A reset will delete data in the destination of the affected streams and then re-sync that data. Skipping a reset is discouraged and might lead to unexpected behavior. ::: @@ -281,9 +281,9 @@ To refresh the source schema: To display **Connection State**: -1. On the Airbyte Cloud dashboard, click **Settings** in the navigation bar. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Settings**. -2. In the Workspace Settings sidebar, click **General Settings**. +2. Click **General Settings**. 3. Toggle **Enable advanced mode** and click **Save changes**. @@ -298,14 +298,14 @@ You can choose the data residency for your connection in the connection settings To choose the data residency for your connection: -1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** in the navigation bar and then click the connection that you want to change. - - The Connection page displays. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** and then click the connection that you want to change. 2. Click the **Settings** tab. 3. Click the **Data residency** dropdown and choose the location for your default data residency. +4. Click **Save changes** + :::note Changes to data residency will not affect any sync in progress. @@ -318,15 +318,13 @@ This section guides you through purchasing credits on Airbyte Cloud. An Airbyte To buy credits: -1. On the Airbyte Cloud dashboard, click the **coin icon** in the navigation bar. - - The Credits page displays. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click the **coin** icon in the navigation bar. 2. If you are unsure of how many credits you need, click **Talk to Sales** to find the right amount for your team. -3. Click **Buy credits**. The Stripe payment page displays. +3. Click **Buy credits**. -4. If you want to change the amount of credits, click Qty **200**. The **Update quantity** dialog displays, and you can either type the amount or use minus (**-**) or plus (**+**) to change the quantity. Click **Update**. +4. The Stripe payment page displays. If you want to change the amount of credits, click Qty **200**. The **Update quantity** dialog displays, and you can either type the amount or use minus (**-**) or plus (**+**) to change the quantity. Click **Update**. :::note Purchase limits: @@ -342,7 +340,7 @@ This section guides you through purchasing credits on Airbyte Cloud. An Airbyte 6. Click **Pay**. - Your payment is processed, and the Credits page displays the updated quantity of credits, total credit usage, and the credit usage per connection. + Your payment is processed. The Credits page displays the updated quantity of credits, total credit usage, and the credit usage per connection. A receipt for your purchase is sent to your email. [Email us](mailto:ar@airbyte.io) for an invoice. diff --git a/docs/connector-development/config-based/advanced-topics.md b/docs/connector-development/config-based/advanced-topics.md index 875aeeeabf39..5212feeccbb2 100644 --- a/docs/connector-development/config-based/advanced-topics.md +++ b/docs/connector-development/config-based/advanced-topics.md @@ -262,8 +262,10 @@ A JSON schema representation of the relationships between the components that ca ## Custom components -:::info -Please help us improve the low code CDK! If you find yourself needing to build a custom component, please [create a feature request issue](https://github.com/airbytehq/airbyte/issues/new?assignees=&labels=type%2Fenhancement%2C+%2Cneeds-triage%2C+low-code&template=feature-request.md&title=Low%20Code%20Feature:). If appropriate, we'll add it directly to the framework (or you can submit a PR)! +:::info +Please help us improve the low code CDK! If you find yourself needing to build a custom component,please [create a feature request issue](https://github.com/airbytehq/airbyte/issues/new?assignees=&labels=type%2Fenhancement%2C+%2Cneeds-triage%2C+area%2Flow-code%2Fcomponents&template=feature-request.md&title=Low%20Code%20Feature:). If appropriate, we'll add it directly to the framework (or you can submit a PR)! + +If an issue already exist for the missing feature you need, please upvote or comment on it so we can prioritize the issue accordingly. ::: Any built-in components can be overloaded by a custom Python class. diff --git a/docs/contributing-to-airbyte/gradle-cheatsheet.md b/docs/contributing-to-airbyte/gradle-cheatsheet.md index c15cb8deb469..aa858d43b47d 100644 --- a/docs/contributing-to-airbyte/gradle-cheatsheet.md +++ b/docs/contributing-to-airbyte/gradle-cheatsheet.md @@ -24,6 +24,25 @@ Future Work: The next step here is to figure out how to more formally split conn Here is a cheatsheet for common gradle commands. +### List Gradle Tasks + +To view all available tasks: +```text +./gradlew tasks +``` + +To view all tasks available for a given namespace: + +```text +./gradlew :tasks +``` + +for example: + +```text +./gradlew :airbyte-integrations:connectors:source-bigquery:tasks +``` + ### Basic Build Syntax Here is the syntax for running gradle commands on the different parts of the code base that we called out above. @@ -58,6 +77,17 @@ SUB_BUILD=PLATFORM ./gradlew build -x test # builds Airbyte Platform without run SUB_BUILD=CONNECTORS_BASE ./gradlew build # builds all Airbyte connectors and runs unit tests ``` +### Debugging + +To debug a Gradle task, add `--scan` to the `./gradlew` command. After the task has completed, you should see a message like: + +```text +Publishing build scan... +https://gradle.com/s/6y7ritpvzkwp4 +``` + +Clicking the link opens a browser page which contains lots of information pertinent to debugging why a build failed, or understanding what sub-tasks were run during a task. + ### Formatting The build system has a custom task called `format`. It is not called as part of `build`. If the command is called on a subset of the project, it will \(mostly\) target just the included modules. The exception is that `spotless` \(a gradle formatter\) will always format any file types that it is configured to manage regardless of which sub build is run. `spotless` is relatively fast, so this should not be too much of an annoyance. It can lead to formatting changes in unexpected parts of the code base. diff --git a/docs/contributing-to-airbyte/updating-documentation.md b/docs/contributing-to-airbyte/updating-documentation.md index cefb641a84ef..1ec084ba21c2 100644 --- a/docs/contributing-to-airbyte/updating-documentation.md +++ b/docs/contributing-to-airbyte/updating-documentation.md @@ -49,17 +49,32 @@ To make complex changes or edit multiple files, edit the files on your local mac While cloning on Windows, you might encounter errors about long filenames. Refer to the instructions [here](../deploying-airbyte/local-deployment.md#handling-long-filename-error) to correct it. -3. Test changes locally: +3. Test changes locally: - Run the following commands in your terminal: + To install the docs locally, run the following commands in your terminal: + + ```bash + cd docusaurus + yarn install + ``` + + To see changes as you make them, run: + + ```bash + yarn start + ``` + + Then navigate to [http://localhost:3000/](http://localhost:3000/). Whenever you make and save changes, you will see them reflected in the server. You can stop the running server in OSX/Linux by pressing `Ctrl-C` in the terminal. + + You can also build the docs locally and see the resulting changes. This is useful if you introduce changes that need to be run at build-time (e.g. adding a docs plug-in). To do so, run: + + ```bash + yarn build + yarn serve + ``` + + Then navigate to [http://localhost:3000/](http://localhost:3000/) to see your changes. You can stop the running server in OSX/Linux by pressing `Ctrl-C` in the terminal. - ```bash - cd docusaurus - yarn install - yarn build - yarn serve - ``` - Then navigate to [http://localhost:3000/](http://localhost:3000/) to see your changes. You can stop the running server in OSX/Linux by pressing `Ctrl-C` in the terminal. 4. [Follow the GitHub workflow](https://docs.github.com/en/get-started/quickstart/contributing-to-projects/) to edit the files and create a pull request. diff --git a/docs/integrations/destinations/bigquery-denormalized.md b/docs/integrations/destinations/bigquery-denormalized.md new file mode 100644 index 000000000000..961387700b5a --- /dev/null +++ b/docs/integrations/destinations/bigquery-denormalized.md @@ -0,0 +1,3 @@ +# Bigquery Denormalized + +See [destinations/bigquery](/integrations/destinations/bigquery) diff --git a/docs/integrations/destinations/cassandra.md b/docs/integrations/destinations/cassandra.md index f92fd58df912..8ec03e961189 100644 --- a/docs/integrations/destinations/cassandra.md +++ b/docs/integrations/destinations/cassandra.md @@ -1,8 +1,8 @@ # Cassandra ## Prerequisites -- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Cassandra connector to version `0.1.3` or newer +- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Cassandra connector to version `0.1.3` or newer ## Sync overview @@ -10,23 +10,21 @@ The incoming airbyte data is structured in keyspaces and tables and is partitioned and replicated across different nodes in the cluster. This connector maps an incoming `stream` to a Cassandra `table` and a `namespace` to a -Cassandra`keyspace`. Fields in the airbyte message become different columns in the Cassandra tables. Each table will +Cassandra`keyspace`. Fields in the airbyte message become different columns in the Cassandra tables. Each table will contain the following columns. -* `_airbyte_ab_id`: A random uuid generator to be used as a partition key. -* `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. -* `_airbyte_data`: a json text representing the extracted data. +- `_airbyte_ab_id`: A random uuid generator to be used as a partition key. +- `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. +- `_airbyte_data`: a json text representing the extracted data. ### Features -| Feature | Support | Notes | -| :--- | :---: | :--- | -| Full Refresh Sync | ✅ | Warning: this mode deletes all previously synced data in the configured DynamoDB table. | -| Incremental - Append Sync | ✅ | | -| Incremental - Deduped History | ❌ | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | ✅ | Namespace will be used as part of the table name. | - - +| Feature | Support | Notes | +| :---------------------------- | :-----: | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | ✅ | Warning: this mode deletes all previously synced data in the configured DynamoDB table. | +| Incremental - Append Sync | ✅ | | +| Incremental - Deduped History | ❌ | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | ✅ | Namespace will be used as part of the table name. | ### Performance considerations @@ -38,16 +36,18 @@ data from the connector. ### Requirements -* The driver is compatible with _Cassandra >= 2.1_ -* Configuration - * Keyspace [default keyspace to use when writing data] - * Username [authentication username] - * Password [authentication password] - * Address [cluster address] - * Port [default: 9042] - * Datacenter [optional] [default: datacenter1] - * Replication [optional] [default: 1] - -### Setup guide - -######TODO: more info, screenshots?, etc... +- The driver is compatible with _Cassandra >= 2.1_ +- Configuration + - Keyspace [default keyspace to use when writing data] + - Username [authentication username] + - Password [authentication password] + - Address [cluster address] + - Port [default: 9042] + - Datacenter [optional] [default: datacenter1] + - Replication [optional] [default: 1] + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------------------------------- | +| 0.1.4 | 2022-08-23 | [15894](https://github.com/airbytehq/airbyte/pull/15894) | Replace batch insert with async method | diff --git a/docs/integrations/destinations/clickhouse.md b/docs/integrations/destinations/clickhouse.md index 3ffb6ffb2459..ac43926188b5 100644 --- a/docs/integrations/destinations/clickhouse.md +++ b/docs/integrations/destinations/clickhouse.md @@ -80,6 +80,7 @@ Therefore, Airbyte ClickHouse destination will create tables and schemas using t | Version | Date | Pull Request | Subject | |:--------|:-----------| :--- |:---------------------------------------------| +| 0.2.1 | 2022-12-06 | [19573](https://github.com/airbytehq/airbyte/pull/19573) | Update dbt version to 1.3.1 | | 0.2.0 | 2022-09-27 | [16970](https://github.com/airbytehq/airbyte/pull/16970) | Remove TCP port from spec parameters | | 0.1.12 | 2022-09-08 | [16444](https://github.com/airbytehq/airbyte/pull/16444) | Added custom jdbc params field | | 0.1.10 | 2022-07-05 | [\#13639](https://github.com/airbytehq/airbyte/pull/13639) | Change JDBC ClickHouse version into 0.3.2-patch9 | @@ -91,4 +92,3 @@ Therefore, Airbyte ClickHouse destination will create tables and schemas using t | 0.1.3 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option | | 0.1.1 | 2021-12-21 | [\#8982](https://github.com/airbytehq/airbyte/pull/8982) | Set isSchemaRequired to false | | 0.1.0 | 2021-11-04 | [\#7620](https://github.com/airbytehq/airbyte/pull/7620) | Add ClickHouse destination | - diff --git a/docs/integrations/destinations/csv.md b/docs/integrations/destinations/csv.md new file mode 100644 index 000000000000..fed3d3242dc8 --- /dev/null +++ b/docs/integrations/destinations/csv.md @@ -0,0 +1,9 @@ +# CSV Destination + +The Airbyte Destination for CSV files. + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :----------- | +| 0.2.10 | 2022-08-08 | [13932](https://github.com/airbytehq/airbyte/pull/13932) | Bump version | diff --git a/docs/integrations/destinations/destination-azure-blob-storage.md b/docs/integrations/destinations/destination-azure-blob-storage.md new file mode 100644 index 000000000000..905b6ef44cc6 --- /dev/null +++ b/docs/integrations/destinations/destination-azure-blob-storage.md @@ -0,0 +1,9 @@ +# Azure Blob Storage + +The Airbyte Destination for [Microsoft Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/) + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :----------- | +| 0.1.6 | 2022-08-08 | [15412](https://github.com/airbytehq/airbyte/pull/15412) | Bump version | diff --git a/docs/integrations/destinations/dev-null.md b/docs/integrations/destinations/dev-null.md new file mode 100644 index 000000000000..78b7c9a46ff6 --- /dev/null +++ b/docs/integrations/destinations/dev-null.md @@ -0,0 +1,9 @@ +# Dev Null Destination + +The Airbyte `dev-null` Destination. This destination is for testing and debugging only. + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :----------- | +| 0.2.7 | 2022-08-08 | [13932](https://github.com/airbytehq/airbyte/pull/13932) | Bump version | diff --git a/docs/integrations/destinations/doris.md b/docs/integrations/destinations/doris.md index 8895b00c90a7..0f0554e88b9e 100644 --- a/docs/integrations/destinations/doris.md +++ b/docs/integrations/destinations/doris.md @@ -1,6 +1,6 @@ # Doris -destination-doris is a destination implemented based on [Doris stream load](https://doris.apache.org/docs/dev/data-operate/import/import-way/stream-load-manual), supports batch rollback, and uses http/https put request +destination-doris is a destination implemented based on [Apache Doris stream load](https://doris.apache.org/docs/dev/data-operate/import/import-way/stream-load-manual), supports batch rollback, and uses http/https put request ## Sync overview @@ -8,24 +8,24 @@ destination-doris is a destination implemented based on [Doris stream load](http Each stream will be output into its own table in Doris. Each table will contain 3 columns: -* `_airbyte_ab_id`: an uuid assigned by Airbyte to each event that is processed. The column type in Doris is `VARCHAR(40)`. -* `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. The column type in Doris is `BIGINT`. -* `_airbyte_data`: a json blob representing with the event data. The column type in Doris is `String`. +- `_airbyte_ab_id`: an uuid assigned by Airbyte to each event that is processed. The column type in Doris is `VARCHAR(40)`. +- `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. The column type in Doris is `BIGINT`. +- `_airbyte_data`: a json blob representing with the event data. The column type in Doris is `String`. ### Features This section should contain a table with the following format: -| Feature | Supported?(Yes/No) | Notes | -| :--- |:-------------------| :--- | -| Full Refresh Sync | Yes | | -| Incremental - Append Sync | Yes | | -| Incremental - Deduped History | No | it will soon be realized | -| For databases, WAL/Logical replication | Yes | | +| Feature | Supported?(Yes/No) | Notes | +| :------------------------------------- | :----------------- | :----------------------- | +| Full Refresh Sync | Yes | | +| Incremental - Append Sync | Yes | | +| Incremental - Deduped History | No | it will soon be realized | +| For databases, WAL/Logical replication | Yes | | ### Performance considerations -Batch writes are performed. mini records may impact performance. +Batch writes are performed. mini records may impact performance. Importing multiple tables will generate multiple [Doris stream load](https://doris.apache.org/docs/dev/data-operate/import/import-way/stream-load-manual) transactions, which should be split as much as possible. ## Getting started @@ -33,19 +33,28 @@ Importing multiple tables will generate multiple [Doris stream load](https://dor ### Requirements To use the Doris destination, you'll need: -* A Doris server version 0.14 or above -* Make sure your Doris fe http port can be accessed by Airbyte. -* Make sure your Doris database host can be accessed by Airbyte. -* Make sure your Doris user with read/write permissions on certain tables. + +- A Doris server version 0.14 or above +- Make sure your Doris fe http port can be accessed by Airbyte. +- Make sure your Doris database host can be accessed by Airbyte. +- Make sure your Doris user with read/write permissions on certain tables. ### Target Database and tables + You will need to choose a database that will be used to store synced data from Airbyte. You need to prepare tables that will be used to store synced data from Airbyte, and ensure the order and matching of the column names in the table as much as possible. ### Setup the access parameters -* **Host** -* **HttpPort** -* **QueryPort** -* **Username** -* **Password** -* **Database** + +- **Host** +- **HttpPort** +- **QueryPort** +- **Username** +- **Password** +- **Database** + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------- | +| 0.1.0 | 2022-11-14 | [17884](https://github.com/airbytehq/airbyte/pull/17884) | Initial Commit | diff --git a/docs/integrations/destinations/iceberg.md b/docs/integrations/destinations/iceberg.md index 1083dbe6dd08..75062620b371 100644 --- a/docs/integrations/destinations/iceberg.md +++ b/docs/integrations/destinations/iceberg.md @@ -11,30 +11,30 @@ in the cluster. This connector maps an incoming `stream` to an Iceberg `table` a Iceberg `database`. Fields in the airbyte message become different columns in the Iceberg tables. Each table will contain the following columns. -* `_airbyte_ab_id`: A random generated uuid. -* `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. -* `_airbyte_data`: a json text representing the extracted data. +- `_airbyte_ab_id`: A random generated uuid. +- `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. +- `_airbyte_data`: a json text representing the extracted data. ### Features This section should contain a table with the following format: -| Feature | Supported?(Yes/No) | Notes | -| :--- | :--- | :--- | -| Full Refresh Sync | ✅ | | -| Incremental Sync | ✅ | | -| Replicate Incremental Deletes | ❌ | | -| SSH Tunnel Support | ❌ | | +| Feature | Supported?(Yes/No) | Notes | +| :---------------------------- | :----------------- | :---- | +| Full Refresh Sync | ✅ | | +| Incremental Sync | ✅ | | +| Replicate Incremental Deletes | ❌ | | +| SSH Tunnel Support | ❌ | | ### Performance considerations Every ten thousand pieces of incoming airbyte data in a stream ————we call it a batch, would produce one data file( Parquet/Avro) in an Iceberg table. This batch size can be configurabled by `Data file flushing batch size` -property. +property. As the quantity of Iceberg data files grows, it causes an unnecessary amount of metadata and less efficient queries from -file open costs. +file open costs. Iceberg provides data file compaction action to improve this case, you can read more about -compaction [HERE](https://iceberg.apache.org/docs/latest/maintenance/#compact-data-files). +compaction [HERE](https://iceberg.apache.org/docs/latest/maintenance/#compact-data-files). This connector also provides auto compact action when stream closes, by `Auto compact data files` property. Any you can specify the target size of compacted Iceberg data file. @@ -42,17 +42,19 @@ specify the target size of compacted Iceberg data file. ### Requirements -* **Iceberg catalog** : Iceberg uses `catalog` to manage tables. this connector already supports: - * [HiveCatalog](https://iceberg.apache.org/docs/latest/hive/#global-hive-catalog) connects to a **Hive metastore** - to keep track of Iceberg tables. - * [HadoopCatalog](https://iceberg.apache.org/docs/latest/java-api-quickstart/#using-a-hadoop-catalog) doesn’t need - to connect to a Hive MetaStore, but can only be used with **HDFS or similar file systems** that support atomic - rename. For `HadoopCatalog`, this connector use **Storage Config** (S3 or HDFS) to manage Iceberg tables. - * [JdbcCatalog](https://iceberg.apache.org/docs/latest/jdbc/) uses a table in a relational database to manage - Iceberg tables through JDBC. So far, this connector supports **PostgreSQL** only. -* **Storage medium** means where Iceberg data files storages in. So far, this connector supports **S3/S3N/S3N** +- **Iceberg catalog** : Iceberg uses `catalog` to manage tables. this connector already supports: + - [HiveCatalog](https://iceberg.apache.org/docs/latest/hive/#global-hive-catalog) connects to a **Hive metastore** + to keep track of Iceberg tables. + - [HadoopCatalog](https://iceberg.apache.org/docs/latest/java-api-quickstart/#using-a-hadoop-catalog) doesn’t need + to connect to a Hive MetaStore, but can only be used with **HDFS or similar file systems** that support atomic + rename. For `HadoopCatalog`, this connector use **Storage Config** (S3 or HDFS) to manage Iceberg tables. + - [JdbcCatalog](https://iceberg.apache.org/docs/latest/jdbc/) uses a table in a relational database to manage + Iceberg tables through JDBC. So far, this connector supports **PostgreSQL** only. +- **Storage medium** means where Iceberg data files storages in. So far, this connector supports **S3/S3N/S3N** object-storage only. -### Setup guide +## Changelog -######TODO: more info +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------- | +| 0.1.0 | 2022-11-01 | [18836](https://github.com/airbytehq/airbyte/pull/18836) | Initial Commit | diff --git a/docs/integrations/destinations/kafka.md b/docs/integrations/destinations/kafka.md index cf58ca50a5d2..6645532b3cb6 100644 --- a/docs/integrations/destinations/kafka.md +++ b/docs/integrations/destinations/kafka.md @@ -5,8 +5,8 @@ The Airbyte Kafka destination allows you to sync data to Kafka. Each stream is written to the corresponding Kafka topic. ## Prerequisites -- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Kafka connector to version `0.1.10` or newer +- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Kafka connector to version `0.1.10` or newer ### Sync overview @@ -18,19 +18,19 @@ Currently, this connector only writes data with JSON format. More formats \(e.g. Each record will contain in its key the uuid assigned by Airbyte, and in the value these 3 fields: -* `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. -* `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. -* `_airbyte_data`: a json blob representing with the event data. -* `_airbyte_stream`: the name of each record's stream. +- `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. +- `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. +- `_airbyte_data`: a json blob representing with the event data. +- `_airbyte_stream`: the name of each record's stream. #### Features -| Feature | Supported?\(Yes/No\) | Notes | -| :--- | :--- | :--- | -| Full Refresh Sync | No | | -| Incremental - Append Sync | Yes | | -| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | Yes | | +| Feature | Supported?\(Yes/No\) | Notes | +| :---------------------------- | :------------------- | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | No | | +| Incremental - Append Sync | Yes | | +| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | Yes | | ## Getting started @@ -38,7 +38,7 @@ Each record will contain in its key the uuid assigned by Airbyte, and in the val To use the Kafka destination, you'll need: -* A Kafka cluster 1.0 or above. +- A Kafka cluster 1.0 or above. ### Setup guide @@ -68,31 +68,31 @@ If you define output topic dynamically, you might want to enable `auto.create.to You should now have all the requirements needed to configure Kafka as a destination in the UI. You can configure the following parameters on the Kafka destination \(though many of these are optional or have default values\): -* **Bootstrap servers** -* **Topic pattern** -* **Test topic** -* **Sync producer** -* **Security protocol** -* **SASL JAAS config** -* **SASL mechanism** -* **Client ID** -* **ACKs** -* **Enable idempotence** -* **Compression type** -* **Batch size** -* **Linger ms** -* **Max in flight requests per connection** -* **Client DNS lookup** -* **Buffer memory** -* **Max request size** -* **Retries** -* **Socket connection setup timeout** -* **Socket connection setup max timeout** -* **Max block ms** -* **Request timeout** -* **Delivery timeout** -* **Send buffer bytes** -* **Receive buffer bytes** +- **Bootstrap servers** +- **Topic pattern** +- **Test topic** +- **Sync producer** +- **Security protocol** +- **SASL JAAS config** +- **SASL mechanism** +- **Client ID** +- **ACKs** +- **Enable idempotence** +- **Compression type** +- **Batch size** +- **Linger ms** +- **Max in flight requests per connection** +- **Client DNS lookup** +- **Buffer memory** +- **Max request size** +- **Retries** +- **Socket connection setup timeout** +- **Socket connection setup max timeout** +- **Max block ms** +- **Request timeout** +- **Delivery timeout** +- **Send buffer bytes** +- **Receive buffer bytes** More info about this can be found in the [Kafka producer configs documentation site](https://kafka.apache.org/documentation/#producerconfigs). @@ -100,15 +100,15 @@ _NOTE_: Some configurations for SSL are not available yet. ## Changelog -| Version | Date | Pull Request | Subject | -| :--- | :--- | :--- | :--- | -| 0.1.9 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.1.7 | 2022-04-19 | [12134](https://github.com/airbytehq/airbyte/pull/12134) | Add PLAIN Auth | -| 0.1.6 | 2022-02-15 | [10186](https://github.com/airbytehq/airbyte/pull/10186) | Add SCRAM-SHA-512 Auth | -| 0.1.5 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.1.4 | 2022-01-31 | [\#9905](https://github.com/airbytehq/airbyte/pull/9905) | Fix SASL config read issue | -| 0.1.3 | 2021-12-30 | [\#8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | -| 0.1.2 | 2021-09-14 | [\#6040](https://github.com/airbytehq/airbyte/pull/6040) | Change spec.json and config parser | -| 0.1.1 | 2021-07-30 | [\#5125](https://github.com/airbytehq/airbyte/pull/5125) | Enable `additionalPropertities` in spec.json | -| 0.1.0 | 2021-07-21 | [\#3746](https://github.com/airbytehq/airbyte/pull/3746) | Initial Release | - +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :---------------------------------------------------------------------------- | +| 0.1.10 | 2022-08-04 | [15287](https://github.com/airbytehq/airbyte/pull/15287) | Update Kafka destination to use outputRecordCollector to properly store state | +| 0.1.9 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.1.7 | 2022-04-19 | [12134](https://github.com/airbytehq/airbyte/pull/12134) | Add PLAIN Auth | +| 0.1.6 | 2022-02-15 | [10186](https://github.com/airbytehq/airbyte/pull/10186) | Add SCRAM-SHA-512 Auth | +| 0.1.5 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.1.4 | 2022-01-31 | [9905](https://github.com/airbytehq/airbyte/pull/9905) | Fix SASL config read issue | +| 0.1.3 | 2021-12-30 | [8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | +| 0.1.2 | 2021-09-14 | [6040](https://github.com/airbytehq/airbyte/pull/6040) | Change spec.json and config parser | +| 0.1.1 | 2021-07-30 | [5125](https://github.com/airbytehq/airbyte/pull/5125) | Enable `additionalPropertities` in spec.json | +| 0.1.0 | 2021-07-21 | [3746](https://github.com/airbytehq/airbyte/pull/3746) | Initial Release | diff --git a/docs/integrations/destinations/keen.md b/docs/integrations/destinations/keen.md index 55aeede379e9..37c33f75ca80 100644 --- a/docs/integrations/destinations/keen.md +++ b/docs/integrations/destinations/keen.md @@ -10,8 +10,8 @@ description: >- The Airbyte Keen destination allows you to stream data from any Airbyte Source into [Keen](https://keen.io?utm_campaign=Airbyte%20Destination%20Connector&utm_source=Airbyte%20Hosted%20Docs&utm_medium=Airbyte%20Hosted%20Docs&utm_term=Airbyte%20Hosted%20Docs&utm_content=Airbyte%20Hosted%20Docs) for storage, analysis, and visualization. Keen is a flexible, fully managed event streaming and analytics platform that empowers anyone to ship custom, embeddable dashboards in minutes, not months. ## Prerequisites -- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Keen connector to version `0.2.4` or newer +- For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Keen connector to version `0.2.4` or newer ### Sync overview @@ -21,12 +21,12 @@ Each replicated stream from Airbyte will output data into a corresponding event #### Features -| Feature | Supported?\(Yes/No\) | Notes | -| :--- | :--- | :--- | -| Full Refresh Sync | Yes | | -| Incremental - Append Sync | Yes | | -| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | No | | +| Feature | Supported?\(Yes/No\) | Notes | +| :---------------------------- | :------------------- | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | Yes | | +| Incremental - Append Sync | Yes | | +| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | No | | ## Getting started @@ -36,8 +36,8 @@ To use the Keen destination, you'll first need to create a [Keen account](https: Once you have a Keen account, you can use the following credentials to set up the connector -* A Keen Project ID -* A Keen Master API key associated with the project +- A Keen Project ID +- A Keen Master API key associated with the project See the setup guide for more information about how to get started. @@ -59,7 +59,7 @@ Head to the ‘Access’ tab and grab your Project ID and Master API Key #### API Key and Project ID -The Keen Connector uses the [Keen Kafka Inbound Cluster](https://keen.io/docs/streams/kafka-streaming/kafka-inbound-cluster/?utm_campaign=Airbyte%20Destination%20Connector&utm_source=Airbyte%20Hosted%20Docs&utm_medium=Airbyte%20Hosted%20Docs&utm_term=Airbyte%20Hosted%20Docs&utm_content=Airbyte%20Hosted%20Docs) to stream data. It requires your `Project ID` and `Master Key` for authentication. To get them, navigate to the `Access` tab from the left-hand, side panel and check the `Project Details` section. +The Keen Connector uses the [Keen Kafka Inbound Cluster](https://keen.io/docs/streams/kafka-streaming/kafka-inbound-cluster/?utm_campaign=Airbyte%20Destination%20Connector&utm_source=Airbyte%20Hosted%20Docs&utm_medium=Airbyte%20Hosted%20Docs&utm_term=Airbyte%20Hosted%20Docs&utm_content=Airbyte%20Hosted%20Docs) to stream data. It requires your `Project ID` and `Master Key` for authentication. To get them, navigate to the `Access` tab from the left-hand, side panel and check the `Project Details` section. **Important**: This destination requires the Project's **Master** Key. #### Timestamp Inference @@ -70,9 +70,9 @@ The `Infer Timestamp` field lets you specify if you want the connector to infer Now, you should have all the parameters needed to configure Keen destination. -* **Project ID** -* **Master API Key** -* **Infer Timestamp** +- **Project ID** +- **Master API Key** +- **Infer Timestamp** Connect your first source and then head to the Keen application. You can seamlessly run [custom analysis](https://keen.io/docs/compute/data-explorer-guide/?utm_campaign=Airbyte%20Destination%20Connector&utm_source=Airbyte%20Hosted%20Docs&utm_medium=Airbyte%20Hosted%20Docs&utm_term=Airbyte%20Hosted%20Docs&utm_content=Airbyte%20Hosted%20Docs) on your data and [build interactive dashboards](https://keen.io/docs/visualize/dashboard-creator/dashboard-edition/?utm_campaign=Airbyte%20Destination%20Connector&utm_source=Airbyte%20Hosted%20Docs&utm_medium=Airbyte%20Hosted%20Docs&utm_term=Airbyte%20Hosted%20Docs&utm_content=Airbyte%20Hosted%20Docs) for key stakeholders. @@ -80,10 +80,10 @@ If you have any questions, please reach out to us at team@keen.io and we’ll be ## CHANGELOG -| Version | Date | Pull Request | Subject | -| :--- | :--- | :--- | :--- | -| 0.2.3 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.2.1 | 2021-12-30 | [\#8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | -| 0.2.0 | 2021-09-10 | [\#5973](https://github.com/airbytehq/airbyte/pull/5973) | Fix timestamp inference for complex schemas | -| 0.1.0 | 2021-08-18 | [\#5339](https://github.com/airbytehq/airbyte/pull/5339) | Keen Destination Release! | - +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :--------------------------------------------------------------------------- | +| 0.2.4 | 2022-08-04 | [15291](https://github.com/airbytehq/airbyte/pull/15291) | Update Keen destination to use outputRecordCollector to properly store state | +| 0.2.3 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.2.1 | 2021-12-30 | [8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | +| 0.2.0 | 2021-09-10 | [5973](https://github.com/airbytehq/airbyte/pull/5973) | Fix timestamp inference for complex schemas | +| 0.1.0 | 2021-08-18 | [5339](https://github.com/airbytehq/airbyte/pull/5339) | Keen Destination Release! | diff --git a/docs/integrations/destinations/kinesis.md b/docs/integrations/destinations/kinesis.md index 2985df9daf98..21f288f573a9 100644 --- a/docs/integrations/destinations/kinesis.md +++ b/docs/integrations/destinations/kinesis.md @@ -1,28 +1,28 @@ # Kinesis ## Prerequisites + - For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Kinesis connector to version `0.1.4` or newer ## Sync overview - ### Output schema -The incoming Airbyte data is structured in a Json format and is sent across diferent stream shards determined by the partition key. +The incoming Airbyte data is structured in a Json format and is sent across diferent stream shards determined by the partition key. This connector maps an incoming data from a namespace and stream to a unique Kinesis stream. The Kinesis record which is sent to the stream is consisted of the following Json fields -* `_airbyte_ab_id`: Random UUID generated to be used as a partition key for sending data to different shards. -* `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. -* `_airbyte_data`: a json text/object representing the data that was received from the data source. +- `_airbyte_ab_id`: Random UUID generated to be used as a partition key for sending data to different shards. +- `_airbyte_emitted_at`: a timestamp representing when the event was received from the data source. +- `_airbyte_data`: a json text/object representing the data that was received from the data source. ### Features -| Feature | Support| Notes | -| :-----------------------------| :-----:| :---------------------------------------------------------------------------------| -| Full Refresh Sync | ❌ | | -| Incremental - Append Sync | ✅ | Incoming messages are streamed/appended to a Kinesis stream as they are received.| -| Incremental - Deduped History | ❌ | | -| Namespaces | ✅ | Namespaces will be used to determine the Kinesis stream name. | +| Feature | Support | Notes | +| :---------------------------- | :-----: | :-------------------------------------------------------------------------------- | +| Full Refresh Sync | ❌ | | +| Incremental - Append Sync | ✅ | Incoming messages are streamed/appended to a Kinesis stream as they are received. | +| Incremental - Deduped History | ❌ | | +| Namespaces | ✅ | Namespaces will be used to determine the Kinesis stream name. | ### Performance considerations @@ -33,15 +33,19 @@ The connector buffer size should also be tweaked according to your data size and ### Requirements -* The connector is compatible with the latest Kinesis service version at the time of this writing. -* Configuration - * **_Endpoint_**: Aws Kinesis endpoint to connect to. Default endpoint if not provided - * **_Region_**: Aws Kinesis region to connect to. Default region if not provided. - * **_shardCount_**: The number of shards with which the stream should be created. The amount of shards affects the throughput of your stream. - * **_accessKey_**: Access key credential for authenticating with the service. - * **_privateKey_**: Private key credential for authenticating with the service. - * **_bufferSize_**: Buffer size used to increase throughput by sending data in a single request. +- The connector is compatible with the latest Kinesis service version at the time of this writing. +- Configuration + - **_Endpoint_**: Aws Kinesis endpoint to connect to. Default endpoint if not provided + - **_Region_**: Aws Kinesis region to connect to. Default region if not provided. + - **_shardCount_**: The number of shards with which the stream should be created. The amount of shards affects the throughput of your stream. + - **_accessKey_**: Access key credential for authenticating with the service. + - **_privateKey_**: Private key credential for authenticating with the service. + - **_bufferSize_**: Buffer size used to increase throughput by sending data in a single request. ### Setup guide -######TODO: more info, screenshots?, etc... +## CHANGELOG + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------------------- | +| 0.1.5 | 2022-09-22 | [16952](https://github.com/airbytehq/airbyte/pull/16952) | Add required config fields | diff --git a/docs/integrations/destinations/mssql.md b/docs/integrations/destinations/mssql.md index 4ec292bba809..d2307042c1dc 100644 --- a/docs/integrations/destinations/mssql.md +++ b/docs/integrations/destinations/mssql.md @@ -56,6 +56,7 @@ Make sure your SQL Server database can be accessed by Airbyte. If your database #### **Permissions** You need a user configured in SQL Server that can create tables and write rows. We highly recommend creating an Airbyte-specific user for this purpose. +In order to allow for normalization, please grant ALTER permissions for the user configured. #### Target Database diff --git a/docs/integrations/destinations/pulsar.md b/docs/integrations/destinations/pulsar.md index 3921c3b2cae9..a40a25228886 100644 --- a/docs/integrations/destinations/pulsar.md +++ b/docs/integrations/destinations/pulsar.md @@ -5,6 +5,7 @@ The Airbyte Pulsar destination allows you to sync data to Pulsar. Each stream is written to the corresponding Pulsar topic. ## Prerequisites + - For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Pulsar connector to version `0.1.3` or newer ### Sync overview @@ -17,19 +18,19 @@ Currently, this connector only writes data with JSON format. More formats \(e.g. Each record will contain in its key the uuid assigned by Airbyte, and in the value these 3 fields: -* `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. -* `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. -* `_airbyte_data`: a json blob representing with the event data encoded in base64 . -* `_airbyte_stream`: the name of each record's stream. +- `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. +- `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. +- `_airbyte_data`: a json blob representing with the event data encoded in base64 . +- `_airbyte_stream`: the name of each record's stream. #### Features -| Feature | Supported?\(Yes/No\) | Notes | -| :--- | :--- | :--- | -| Full Refresh Sync | No | | -| Incremental - Append Sync | Yes | | -| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | Yes | | +| Feature | Supported?\(Yes/No\) | Notes | +| :---------------------------- | :------------------- | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | No | | +| Incremental - Append Sync | Yes | | +| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | Yes | | ## Getting started @@ -37,7 +38,7 @@ Each record will contain in its key the uuid assigned by Airbyte, and in the val To use the Pulsar destination, you'll need: -* A Pulsar cluster 2.8 or above. +- A Pulsar cluster 2.8 or above. ### Setup guide @@ -69,22 +70,28 @@ If you define output topic dynamically, you might want to enable `allowAutoTopic You should now have all the requirements needed to configure Pulsar as a destination in the UI. You can configure the following parameters on the Pulsar destination \(though many of these are optional or have default values\): -* **Pulsar brokers** -* **Use TLS** -* **Topic type** -* **Topic tenant** -* **Topic namespace** -* **Topic pattern** -* **Test topic** -* **Producer name** -* **Sync producer** -* **Compression type** -* **Message send timeout** -* **Max pending messages** -* **Max pending messages across partitions** -* **Enable batching** -* **Batching max messages** -* **Batching max publish delay** -* **Block if queue is full** +- **Pulsar brokers** +- **Use TLS** +- **Topic type** +- **Topic tenant** +- **Topic namespace** +- **Topic pattern** +- **Test topic** +- **Producer name** +- **Sync producer** +- **Compression type** +- **Message send timeout** +- **Max pending messages** +- **Max pending messages across partitions** +- **Enable batching** +- **Batching max messages** +- **Batching max publish delay** +- **Block if queue is full** More info about this can be found in the [Pulsar producer configs documentation site](https://pulsar.apache.org/docs/en/client-libraries-java/#producer). + +## CHANGELOG + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :----------------------------------------------------------------------------- | +| 0.1.3 | 2022-08-05 | [15349](https://github.com/airbytehq/airbyte/pull/15349) | Update Pulsar destination to use outputRecordCollector to properly store state | diff --git a/docs/integrations/destinations/redpanda.md b/docs/integrations/destinations/redpanda.md index 9e9718aad579..2c51c85d501b 100644 --- a/docs/integrations/destinations/redpanda.md +++ b/docs/integrations/destinations/redpanda.md @@ -2,7 +2,6 @@ The Airbyte Redpanda destination connector allows you to sync data to [Redpada](https://redpanda.com/). Each stream is written to the corresponding Redpanda topic. - ## Sync overview ### Output schema @@ -15,28 +14,25 @@ Currently, this connector only writes data with JSON format. More formats \(e.g. Each record will contain in its key the uuid assigned by Airbyte, and in the value these 3 fields: -* `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. -* `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. -* `_airbyte_data`: a json blob representing with the event data. +- `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. +- `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. +- `_airbyte_data`: a json blob representing with the event data. ### Data type mapping | Integration Type | Airbyte Type | Notes | -| :--- | :--- | :--- | - +| :--------------- | :----------- | :---- | ### Features This section should contain a table with the following format: - -| Feature | Supported?\(Yes/No\) | Notes | -| :--- | :--- | :--- | -| Full Refresh Sync | No | | -| Incremental - Append Sync | Yes | | -| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | Yes | | - +| Feature | Supported?\(Yes/No\) | Notes | +| :---------------------------- | :------------------- | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | No | | +| Incremental - Append Sync | Yes | | +| Incremental - Deduped History | No | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | Yes | | ### Performance considerations @@ -46,22 +42,22 @@ Granted you have enough Redpanda nodes/partitions the cluster should be able to ### Requirements -* The connector should be able to create topics using the [AdminClient](https://docs.confluent.io/platform/current/installation/configuration/admin-configs.html) -* Configuration options - * **Bootstrap servers** - * **Buffer Memory** - * **Compression Type** - * **Batch Size** - * **Retries** - * **Number of topic partitions** - * **Topic replication factor** - * **Socket Connection Setup Timeout** - * **Socket Connection Setup Max Timeout** +- The connector should be able to create topics using the [AdminClient](https://docs.confluent.io/platform/current/installation/configuration/admin-configs.html) +- Configuration options + - **Bootstrap servers** + - **Buffer Memory** + - **Compression Type** + - **Batch Size** + - **Retries** + - **Number of topic partitions** + - **Topic replication factor** + - **Socket Connection Setup Timeout** + - **Socket Connection Setup Max Timeout** More info about this can be found in the [Redpanda producer configs documentation site](https://docs.confluent.io/platform/current/installation/configuration/producer-configs.html). _NOTE_: Configurations for SSL are not available yet. -### Setup guide - - +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------- | +| 0.1.0 | 2022-08-05 | [18884](https://github.com/airbytehq/airbyte/pull/18884) | Initial commit | diff --git a/docs/integrations/destinations/rockset.md b/docs/integrations/destinations/rockset.md index 635ee2f7d332..4e2597bcf0d3 100644 --- a/docs/integrations/destinations/rockset.md +++ b/docs/integrations/destinations/rockset.md @@ -1,27 +1,28 @@ # Rockset ## Prerequisites + - For Airbyte Open Source users using the [Postgres](https://docs.airbyte.com/integrations/sources/postgres) source connector, [upgrade](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to version `v0.40.0-alpha` or newer and upgrade your Rockset connector to version `0.1.4` or newer -## Features -| Feature | Support | -| :--- | :---: | -| Full Refresh Sync | ✅ | -| Incremental - Append Sync | ✅ | -| Incremental - Deduped History | ❌ | -| Namespaces | ❌ | +## Features +| Feature | Support | +| :---------------------------- | :-----: | +| Full Refresh Sync | ✅ | +| Incremental - Append Sync | ✅ | +| Incremental - Deduped History | ❌ | +| Namespaces | ❌ | ## Troubleshooting - ## Configuration -| Parameter | Type | Notes | -| :--- | :---: | :--- | -| api_key | string | rockset api key | -| api_server | string | api URL to rockset, specifying http protocol | -| workspace | string | workspace under which rockset collections will be added/modified | +| Parameter | Type | Notes | +| :--------- | :----: | :--------------------------------------------------------------- | +| api_key | string | rockset api key | +| api_server | string | api URL to rockset, specifying http protocol | +| workspace | string | workspace under which rockset collections will be added/modified | + ## Getting Started \(Airbyte Open-Source / Airbyte Cloud\) #### Requirements @@ -30,10 +31,10 @@ ## CHANGELOG -| Version | Date | Pull Request | Subject | -| :--- | :--- | :--- | :--- | -| 0.1.3 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.1.2 | 2022-05-17 | [12820](https://github.com/airbytehq/airbyte/pull/12820) | Improved 'check' operation performance | -| 0.1.1 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.1.0 | 2021-11-15 | [\#8006](https://github.com/airbytehq/airbyte/pull/8006) | Initial release| - +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :----------------------------------------------------- | +| 0.1.4 | 2022-06-17 | [15395](https://github.com/airbytehq/airbyte/pull/15395) | Updated Destination Rockset to handle per-stream state | +| 0.1.3 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.1.2 | 2022-05-17 | [12820](https://github.com/airbytehq/airbyte/pull/12820) | Improved 'check' operation performance | +| 0.1.1 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.1.0 | 2021-11-15 | [8006](https://github.com/airbytehq/airbyte/pull/8006) | Initial release | diff --git a/docs/integrations/destinations/s3-glue.md b/docs/integrations/destinations/s3-glue.md index 3bdadd6a0b16..45d2a3d5934f 100644 --- a/docs/integrations/destinations/s3-glue.md +++ b/docs/integrations/destinations/s3-glue.md @@ -5,13 +5,14 @@ This page guides you through the process of setting up the S3 destination connec ## Prerequisites List of required fields: -* **Access Key ID** -* **Secret Access Key** -* **S3 Bucket Name** -* **S3 Bucket Path** -* **S3 Bucket Region** -* **Glue database** -* **Glue serialization library** + +- **Access Key ID** +- **Secret Access Key** +- **S3 Bucket Name** +- **S3 Bucket Path** +- **S3 Bucket Region** +- **Glue database** +- **Glue serialization library** 1. Allow connections from Airbyte server to your AWS S3/ Minio S3 cluster \(if they exist in separate VPCs\). 2. An S3 bucket with credentials or an instance profile with read/write permissions configured for the host (ec2, eks). @@ -28,6 +29,7 @@ Prepare S3 bucket that will be used as destination, see [this](https://docs.aws. NOTE: If the S3 cluster is not configured to use TLS, the connection to Amazon S3 silently reverts to an unencrypted connection. Airbyte recommends all connections be configured to use TLS/SSL as support for AWS's [shared responsibility model](https://aws.amazon.com/compliance/shared-responsibility-model/) ## Step 2: Set up Glue + [Sign in](https://signin.aws.amazon.com/signin) to your AWS account. Use an existing or create new [Access Key ID and Secret Access Key](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#:~:text=IAM%20User%20Guide.-,Programmatic%20access,-You%20must%20provide). @@ -35,34 +37,33 @@ Prepare the Glue database that will be used as destination, see [this](https://d ## Step 3: Set up the S3-Glue destination connector in Airbyte - **For Airbyte Cloud:** 1. [Log into your Airbyte Cloud](https://cloud.airbyte.io/workspaces) account. 2. In the left navigation bar, click **Destinations**. In the top-right corner, click **+ new destination**. 3. On the destination setup page, select **S3** from the Destination type dropdown and enter a name for this connector. 4. Configure fields: - * **Access Key Id** - * See [this](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) on how to generate an access key. - * We recommend creating an Airbyte-specific user. This user will require [read and write permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html) to objects in the bucket. - * **Secret Access Key** - * Corresponding key to the above key id. - * **S3 Bucket Name** - * See [this](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) to create an S3 bucket. - * **S3 Bucket Path** - * Subdirectory under the above bucket to sync the data into. - * **S3 Bucket Region** - * See [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) for all region codes. - * **S3 Path Format** - * Additional string format on how to store data under S3 Bucket Path. Default value is `${NAMESPACE}/${STREAM_NAME}/${YEAR}_${MONTH}_${DAY}_${EPOCH}_`. - * **S3 Endpoint** - * Leave empty if using AWS S3, fill in S3 URL if using Minio S3. - * **S3 Filename pattern** - * The pattern allows you to set the file-name format for the S3 staging file(s), next placeholders combinations are currently supported: {date}, {date:yyyy_MM}, {timestamp}, {timestamp:millis}, {timestamp:micros}, {part_number}, {sync_id}, {format_extension}. Please, don't use empty space and not supportable placeholders, as they won't recognized. - * **Glue database** - * The Glue database name that was previously created through the management console or the cli. - * **Glue serialization library** - * The library that your query engine will use for reading and writing data in your lake + - **Access Key Id** + - See [this](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) on how to generate an access key. + - We recommend creating an Airbyte-specific user. This user will require [read and write permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html) to objects in the bucket. + - **Secret Access Key** + - Corresponding key to the above key id. + - **S3 Bucket Name** + - See [this](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) to create an S3 bucket. + - **S3 Bucket Path** + - Subdirectory under the above bucket to sync the data into. + - **S3 Bucket Region** + - See [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) for all region codes. + - **S3 Path Format** + - Additional string format on how to store data under S3 Bucket Path. Default value is `${NAMESPACE}/${STREAM_NAME}/${YEAR}_${MONTH}_${DAY}_${EPOCH}_`. + - **S3 Endpoint** + - Leave empty if using AWS S3, fill in S3 URL if using Minio S3. + - **S3 Filename pattern** + - The pattern allows you to set the file-name format for the S3 staging file(s), next placeholders combinations are currently supported: {date}, {date:yyyy_MM}, {timestamp}, {timestamp:millis}, {timestamp:micros}, {part_number}, {sync_id}, {format_extension}. Please, don't use empty space and not supportable placeholders, as they won't recognized. + - **Glue database** + - The Glue database name that was previously created through the management console or the cli. + - **Glue serialization library** + - The library that your query engine will use for reading and writing data in your lake 5. Click `Set up destination`. **For Airbyte Open Source:** @@ -71,51 +72,53 @@ Prepare the Glue database that will be used as destination, see [this](https://d 2. In the left navigation bar, click **Destinations**. In the top-right corner, click **+ new destination**. 3. On the destination setup page, select **S3** from the Destination type dropdown and enter a name for this connector. 4. Configure fields: - * **Access Key Id** - * See [this](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) on how to generate an access key. - * See [this](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) on how to create a instanceprofile. - * We recommend creating an Airbyte-specific user. This user will require [read and write permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html) to objects in the staging bucket. - * If the Access Key and Secret Access Key are not provided, the authentication will rely on the instanceprofile. - * **Secret Access Key** - * Corresponding key to the above key id. - * Make sure your S3 bucket is accessible from the machine running Airbyte. - * This depends on your networking setup. - * You can check AWS S3 documentation with a tutorial on how to properly configure your S3's access [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-overview.html). - * If you use instance profile authentication, make sure the role has permission to read/write on the bucket. - * The easiest way to verify if Airbyte is able to connect to your S3 bucket is via the check connection tool in the UI. - * **S3 Bucket Name** - * See [this](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) to create an S3 bucket. - * **S3 Bucket Path** - * Subdirectory under the above bucket to sync the data into. - * **S3 Bucket Region** - * See [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) for all region codes. - * **S3 Path Format** - * Additional string format on how to store data under S3 Bucket Path. Default value is `${NAMESPACE}/${STREAM_NAME}/${YEAR}_${MONTH}_${DAY}_${EPOCH}_`. - * **S3 Endpoint** - * Leave empty if using AWS S3, fill in S3 URL if using Minio S3. - * **S3 Filename pattern** - * The pattern allows you to set the file-name format for the S3 staging file(s), next placeholders combinations are currently supported: {date}, {date:yyyy_MM}, {timestamp}, {timestamp:millis}, {timestamp:micros}, {part_number}, {sync_id}, {format_extension}. Please, don't use empty space and not supportable placeholders, as they won't recognized. - * **Glue database** - * The Glue database name that was previously created through the management console or the cli. - * **Glue serialization library** - * The library that your query engine will use for reading and writing data in your lake + + - **Access Key Id** + - See [this](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) on how to generate an access key. + - See [this](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) on how to create a instanceprofile. + - We recommend creating an Airbyte-specific user. This user will require [read and write permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html) to objects in the staging bucket. + - If the Access Key and Secret Access Key are not provided, the authentication will rely on the instanceprofile. + - **Secret Access Key** + - Corresponding key to the above key id. + - Make sure your S3 bucket is accessible from the machine running Airbyte. + - This depends on your networking setup. + - You can check AWS S3 documentation with a tutorial on how to properly configure your S3's access [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-overview.html). + - If you use instance profile authentication, make sure the role has permission to read/write on the bucket. + - The easiest way to verify if Airbyte is able to connect to your S3 bucket is via the check connection tool in the UI. + - **S3 Bucket Name** + - See [this](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) to create an S3 bucket. + - **S3 Bucket Path** + - Subdirectory under the above bucket to sync the data into. + - **S3 Bucket Region** + - See [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions) for all region codes. + - **S3 Path Format** + - Additional string format on how to store data under S3 Bucket Path. Default value is `${NAMESPACE}/${STREAM_NAME}/${YEAR}_${MONTH}_${DAY}_${EPOCH}_`. + - **S3 Endpoint** + - Leave empty if using AWS S3, fill in S3 URL if using Minio S3. + - **S3 Filename pattern** + - The pattern allows you to set the file-name format for the S3 staging file(s), next placeholders combinations are currently supported: {date}, {date:yyyy_MM}, {timestamp}, {timestamp:millis}, {timestamp:micros}, {part_number}, {sync_id}, {format_extension}. Please, don't use empty space and not supportable placeholders, as they won't recognized. + - **Glue database** + - The Glue database name that was previously created through the management console or the cli. + - **Glue serialization library** + - The library that your query engine will use for reading and writing data in your lake 5. Click `Set up destination`. In order for everything to work correctly, it is also necessary that the user whose "S3 Key Id" and "S3 Access Key" are used have access to both the bucket and its contents. Policies to use: + ```json { "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": "s3:*", - "Resource": [ - "arn:aws:s3:::YOUR_BUCKET_NAME/*", - "arn:aws:s3:::YOUR_BUCKET_NAME" - ] - } - ] + "Statement": [ + { + "Effect": "Allow", + "Action": "s3:*", + "Resource": [ + "arn:aws:s3:::YOUR_BUCKET_NAME/*", + "arn:aws:s3:::YOUR_BUCKET_NAME" + ] + } + ] } ``` @@ -149,6 +152,7 @@ The rationales behind this naming pattern are: 3. The upload time composes of a date part and millis part so that it is both readable and unique. But it is possible to further customize by using the available variables to format the bucket path: + - `${NAMESPACE}`: Namespace where the stream comes from or configured by the connection namespace fields. - `${STREAM_NAME}`: Name of the stream - `${YEAR}`: Year in which the sync was writing the output data in. @@ -162,6 +166,7 @@ But it is possible to further customize by using the available variables to form - `${UUID}`: random uuid string Note: + - Multiple `/` characters in the S3 path are collapsed into a single `/` character. - If the output bucket contains too many files, the part id variable is using a `UUID` instead. It uses sequential ID otherwise. @@ -170,12 +175,12 @@ A data sync may create multiple files as the output files can be partitioned by ## Supported sync modes -| Feature | Support | Notes | -| :--- | :---: | :--- | -| Full Refresh Sync | ✅ | Warning: this mode deletes all previously synced data in the configured bucket path. | -| Incremental - Append Sync | ✅ | | -| Incremental - Deduped History | ❌ | As this connector does not support dbt, we don't support this sync mode on this destination. | -| Namespaces | ❌ | Setting a specific bucket path is equivalent to having separate namespaces. | +| Feature | Support | Notes | +| :---------------------------- | :-----: | :------------------------------------------------------------------------------------------- | +| Full Refresh Sync | ✅ | Warning: this mode deletes all previously synced data in the configured bucket path. | +| Incremental - Append Sync | ✅ | | +| Incremental - Deduped History | ❌ | As this connector does not support dbt, we don't support this sync mode on this destination. | +| Namespaces | ❌ | Setting a specific bucket path is equivalent to having separate namespaces. | The Airbyte S3 destination allows you to sync data to AWS S3 or Minio S3. Each stream is written to its own directory under the bucket. ⚠️ Please note that under "Full Refresh Sync" mode, data in the configured bucket and path will be wiped out before each sync. We recommend you to provision a dedicated S3 resource for this sync to prevent unexpected data deletion from misconfiguration. ⚠️ @@ -184,9 +189,8 @@ The Airbyte S3 destination allows you to sync data to AWS S3 or Minio S3. Each s Each stream will be outputted to its dedicated directory according to the configuration. The complete datastore of each stream includes all the output files under that directory. You can think of the directory as equivalent of a Table in the database world. -* Under Full Refresh Sync mode, old output files will be purged before new files are created. -* Under Incremental - Append Sync mode, new output files will be added that only contain the new data. - +- Under Full Refresh Sync mode, old output files will be purged before new files are created. +- Under Incremental - Append Sync mode, new output files will be added that only contain the new data. ### JSON Lines \(JSONL\) @@ -231,15 +235,14 @@ The json objects can have the following formats: ``` ```text -{ "_airbyte_ab_id": "26d73cde-7eb1-4e1e-b7db-a4c03b4cf206", "_airbyte_emitted_at": "1622135805000", "user_id": 123, "name": { "first": "John", "last": "Doe" } } -{ "_airbyte_ab_id": "0a61de1b-9cdd-4455-a739-93572c9a5f20", "_airbyte_emitted_at": "1631948170000", "user_id": 456, "name": { "first": "Jane", "last": "Roe" } } +{ "_airbyte_ab_id": "26d73cde-7eb1-4e1e-b7db-a4c03b4cf206", "_airbyte_emitted_at": "1622135805000", "user_id": 123, "name": { "first": "John", "last": "Doe" } } +{ "_airbyte_ab_id": "0a61de1b-9cdd-4455-a739-93572c9a5f20", "_airbyte_emitted_at": "1631948170000", "user_id": 456, "name": { "first": "Jane", "last": "Roe" } } ``` Output files can be compressed. The default option is GZIP compression. If compression is selected, the output filename will have an extra extension (GZIP: `.jsonl.gz`). ## CHANGELOG -| Version | Date | Pull Request | Subject | -|:--------|:-----|:-------------|:--------| -| | | | | - +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :------------------------------------------------------- | :------------- | +| 0.1.0 | 2022-11-17 | [18695](https://github.com/airbytehq/airbyte/pull/18695) | Initial Commit | diff --git a/docs/integrations/sources/amplitude.md b/docs/integrations/sources/amplitude.md index c3b50a31d12f..a28bdf89c86f 100644 --- a/docs/integrations/sources/amplitude.md +++ b/docs/integrations/sources/amplitude.md @@ -43,6 +43,7 @@ The Amplitude connector ideally should gracefully handle Amplitude API limitatio | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:------------------------------------------------------------------------------------------------| +| 0.1.18 | 2022-12-08 | [19727](https://github.com/airbytehq/airbyte/pull/19727) | Add parameter to select region | | 0.1.17 | 2022-10-31 | [18684](https://github.com/airbytehq/airbyte/pull/18684) | Add empty `series` validation for `AverageSessionLength` stream | | 0.1.16 | 2022-10-11 | [17854](https://github.com/airbytehq/airbyte/pull/17854) | Add empty `series` validation for `ActtiveUsers` steam | | 0.1.15 | 2022-10-03 | [17320](https://github.com/airbytehq/airbyte/pull/17320) | Add validation `start_date` filed if it's in the future | diff --git a/docs/integrations/sources/bing-ads.md b/docs/integrations/sources/bing-ads.md index b88d393a0ac7..315cab951ead 100644 --- a/docs/integrations/sources/bing-ads.md +++ b/docs/integrations/sources/bing-ads.md @@ -102,6 +102,7 @@ The Bing Ads API limits the number of requests for all Microsoft Advertising cli ## Changelog | Version | Date | Pull Request | Subject | | :------ |:-----------|:---------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------| +| 0.1.17 | 2022-12-10 | [20005](https://github.com/airbytehq/airbyte/pull/20005) | Add `Keyword` to `keyword_performance_report` stream | | 0.1.16 | 2022-10-12 | [17873](https://github.com/airbytehq/airbyte/pull/17873) | Fix: added missing campaign types in (Audience, Shopping and DynamicSearchAds) in campaigns stream | | 0.1.15 | 2022-10-03 | [17505](https://github.com/airbytehq/airbyte/pull/17505) | Fix: limit cache size for ServiceClient instances | | 0.1.14 | 2022-09-29 | [17403](https://github.com/airbytehq/airbyte/pull/17403) | Fix: limit cache size for ReportingServiceManager instances | diff --git a/docs/integrations/sources/close-com.md b/docs/integrations/sources/close-com.md index 41a2cb8300ce..2fe293013cbf 100644 --- a/docs/integrations/sources/close-com.md +++ b/docs/integrations/sources/close-com.md @@ -1,10 +1,27 @@ # Close.com -## Overview +## Prerequisites + +* Close.com Account +* Close.com API Key + +Visit the [Close.com API Keys page](https://app.close.com/settings/api/) in the Close.com dashboard to access the secret key for your account. Secret key will be prefixed with `api_`. +See [this guide](https://help.close.com/docs/api-keys) if you need to create a new one. + +We recommend creating a restricted key specifically for Airbyte access. This will allow you to control which resources Airbyte should be able to access. For ease of use, we recommend using read permissions for all resources and configuring which resource to replicate in the Airbyte UI. + +## Setup guide + +1. [Log into your Airbyte Cloud](https://cloud.airbyte.io/workspaces) account. +2. In the left navigation bar, click **Sources**. In the top-right corner, click **+new source**. +3. On the Set up the source page, enter the name for the Close.com connector and select **Close.com** from the Source type dropdown. +4. Fill in the API Key and Start date fields and click **Set up source**. + +## Supported sync modes The Close.com source supports both Full Refresh and Incremental syncs. You can choose if this connector will copy only the new or updated data, or all rows in the tables and columns you set up for replication, every time a sync is run. -### Output schema +## Supported Streams This Source is capable of syncing the following core Streams: @@ -56,39 +73,22 @@ This Source is capable of syncing the following core Streams: ### Notes -Leads, Events Incremental streams use `date_updated` field. All other Incremental streams use `date_created` field. - -### Data type mapping +Leads, Events Incremental streams use `date_updated` field as a cursor. All other Incremental streams use `date_created` field for the same purpose. -The [Close.com API](https://developer.close.com/) uses the same [JSONSchema](https://json-schema.org/understanding-json-schema/reference/index.html) types that Airbyte uses internally \(`string`, `date-time`, `object`, `array`, `boolean`, `integer`, and `number`\), so no type conversions happen as part of this source. +`SendAs` stream requires payment. -### Features +### Data type mapping -| Feature | Supported? | -| :--- | :--- | -| Full Refresh Sync | Yes | -| Incremental - Append Sync | Yes | +The [Close.com API](https://developer.close.com/) uses the same [JSONSchema](https://json-schema.org/understanding-json-schema/reference/index.html) types that Airbyte uses internally (`string`, `date-time`, `object`, `array`, `boolean`, `integer`, and `number`), so no type conversions happen as part of this source. ### Performance considerations The Close.com Connector has rate limit. There are 60 RPS for Organizations. You can find detailed info [here](https://developer.close.com/#ratelimits). -## Getting started - -### Requirements - -* Close.com Account -* Close.com API Key - -### Setup guide - -Visit the [Close.com API Keys page](https://app.close.com/settings/api/) in the Close.com dashboard to access the secret key for your account. Secret key will be prefixed with `api_`. - -We recommend creating a restricted key specifically for Airbyte access. This will allow you to control which resources Airbyte should be able to access. For ease of use, we recommend using read permissions for all resources and configuring which resource to replicate in the Airbyte UI. - ## Changelog | Version | Date | Pull Request | Subject | | :--- | :--- | :--- | :--- | +| 0.2.0 | 2022-11-04 | [18968](https://github.com/airbytehq/airbyte/pull/18968) | Migrate to Low-Code | | 0.1.0 | 2021-08-10 | [5366](https://github.com/airbytehq/airbyte/pull/5366) | Initial release of Close.com connector for Airbyte | diff --git a/docs/integrations/sources/elasticsearch.md b/docs/integrations/sources/elasticsearch.md index b83665bfe2e7..8767d5a7118a 100644 --- a/docs/integrations/sources/elasticsearch.md +++ b/docs/integrations/sources/elasticsearch.md @@ -84,4 +84,5 @@ all values in the array must be of the same data type. Hence, every field can be | Version | Date | Pull Request | Subject | | :------ | :--------- | :------------------------------------------------------- | :-------------- | +| `0.1.1` | 2022-12-02 | [18118](https://github.com/airbytehq/airbyte/pull/18118) | Avoid too_long_frame_exception | | `0.1.0` | 2022-07-12 | [14118](https://github.com/airbytehq/airbyte/pull/14118) | Initial Release | diff --git a/docs/integrations/sources/facebook-marketing.md b/docs/integrations/sources/facebook-marketing.md index c74d2f9d0051..f8ef4462d155 100644 --- a/docs/integrations/sources/facebook-marketing.md +++ b/docs/integrations/sources/facebook-marketing.md @@ -127,6 +127,8 @@ Please be informed that the connector uses the `lookback_window` parameter to pe | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.2.78 | 2022-12-07 | [20165](https://github.com/airbytehq/airbyte/pull/20165) | fix fields permission error | +| 0.2.77 | 2022-12-06 | [20131](https://github.com/airbytehq/airbyte/pull/20131) | update next cursor value at read start | | 0.2.76 | 2022-12-03 | [20043](https://github.com/airbytehq/airbyte/pull/20043) | Allows `action_breakdowns` to be an empty list - bugfix for #20016 | | 0.2.75 | 2022-12-03 | [20016](https://github.com/airbytehq/airbyte/pull/20016) | Allows `action_breakdowns` to be an empty list | | 0.2.74 | 2022-11-25 | [19803](https://github.com/airbytehq/airbyte/pull/19803) | New default for `action_breakdowns`, improve "check" command speed | diff --git a/docs/integrations/sources/firebolt.md b/docs/integrations/sources/firebolt.md index 35650bcb179b..ad1c44493dd0 100644 --- a/docs/integrations/sources/firebolt.md +++ b/docs/integrations/sources/firebolt.md @@ -47,15 +47,11 @@ The Firebolt source does not alter schema present in your database. Depending on 1. A running engine (if an engine is stopped or booting up you won't be able to connect to it) 1. Your data in either [Fact or Dimension](https://docs.firebolt.io/working-with-tables.html#fact-and-dimension-tables) tables. - You can now use the Airbyte Firebolt source. - - - ## Changelog - | Version | Date | Pull Request | Subject | | :--- | :--- | :--- | :--- | -| 0.1.0 | 2022-04-28 | TBD | Create Firebolt source | \ No newline at end of file +| 0.2.0 | 2022-09-09 | https://github.com/airbytehq/airbyte/pull/16583 | Reading from views | +| 0.1.0 | 2022-04-28 | https://github.com/airbytehq/airbyte/pull/13874 | Create Firebolt source | \ No newline at end of file diff --git a/docs/integrations/sources/freshdesk.md b/docs/integrations/sources/freshdesk.md index 7cff3fcda244..be522b08eb3a 100644 --- a/docs/integrations/sources/freshdesk.md +++ b/docs/integrations/sources/freshdesk.md @@ -30,15 +30,32 @@ To set up the Freshdesk source connector, you'll need the Freshdesk [domain URL] Several output streams are available from this source: * [Agents](https://developers.freshdesk.com/api/#agents) +* [Business Hours](https://developers.freshdesk.com/api/#business-hours) +* [Canned Responses](https://developers.freshdesk.com/api/#canned-responses) +* [Canned Response Folders](https://developers.freshdesk.com/api/#list_all_canned_response_folders) * [Companies](https://developers.freshdesk.com/api/#companies) * [Contacts](https://developers.freshdesk.com/api/#contacts) \(Native Incremental Sync\) * [Conversations](https://developers.freshdesk.com/api/#conversations) +* [Discussion Categories](https://developers.freshdesk.com/api/#category_attributes) +* [Discussion Comments](https://developers.freshdesk.com/api/#comment_attributes) +* [Discussion Forums](https://developers.freshdesk.com/api/#forum_attributes) +* [Discussion Topics](https://developers.freshdesk.com/api/#topic_attributes) +* [Email Configs](https://developers.freshdesk.com/api/#email-configs) +* [Email Mailboxes](https://developers.freshdesk.com/api/#email-mailboxes) * [Groups](https://developers.freshdesk.com/api/#groups) +* [Products](https://developers.freshdesk.com/api/#products) * [Roles](https://developers.freshdesk.com/api/#roles) * [Satisfaction Ratings](https://developers.freshdesk.com/api/#satisfaction-ratings) +* [Scenario Automations](https://developers.freshdesk.com/api/#scenario-automations) +* [Settings](https://developers.freshdesk.com/api/#settings) * [Skills](https://developers.freshdesk.com/api/#skills) +* [SLA Policies](https://developers.freshdesk.com/api/#sla-policies) +* [Solution Articles](https://developers.freshdesk.com/api/#solution_article_attributes) +* [Solution Categories](https://developers.freshdesk.com/api/#solution_category_attributes) +* [Solution Folders](https://developers.freshdesk.com/api/#solution_folder_attributes) * [Surveys](https://developers.freshdesk.com/api/#surveys) * [Tickets](https://developers.freshdesk.com/api/#tickets) \(Native Incremental Sync\) +* [Ticket Fields](https://developers.freshdesk.com/api/#ticket-fields) * [Time Entries](https://developers.freshdesk.com/api/#time-entries) ## Performance considerations diff --git a/docs/integrations/sources/kafka.md b/docs/integrations/sources/kafka.md index c0029ceb91a7..4e963345dfdd 100644 --- a/docs/integrations/sources/kafka.md +++ b/docs/integrations/sources/kafka.md @@ -50,6 +50,7 @@ The Kafka source connector supports the following [sync modes](https://docs.airb | Version | Date | Pull Request | Subject | | :------ | :-------- | :------------------------------------------------------| :---------------------------------------- | +| 0.2.3 | 2022-12-06 | [19587](https://github.com/airbytehq/airbyte/pull/19587) | Fix missing data before consumer is closed | | 0.2.2 | 2022-11-04 | [18648](https://github.com/airbytehq/airbyte/pull/18648) | Add missing record_count increment for JSON| | 0.2.1 | 2022-11-04 | This version was the same as 0.2.0 and was committed so using 0.2.2 next to keep versions in order| | 0.2.0 | 2022-08-22 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Added AVRO format support and Support for maximum records to process| diff --git a/docs/integrations/sources/mailchimp.md b/docs/integrations/sources/mailchimp.md index d41da58980a4..76ee9e4816d3 100644 --- a/docs/integrations/sources/mailchimp.md +++ b/docs/integrations/sources/mailchimp.md @@ -229,7 +229,8 @@ Now that you have set up the Mailchimp source connector, check out the following ## Changelog | Version | Date | Pull Request | Subject | -|:--------|:-----------|:---------------------------------------------------------|:-------------------------------------------------------------------------| +|---------|------------|----------------------------------------------------------|--------------------------------------------------------------------------| +| 0.3.0 | 2022-11-07 | [19023](https://github.com/airbytehq/airbyte/pull/19023) | Set primary key for Email Activity stream. | | 0.2.15 | 2022-09-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | | 0.2.14 | 2022-04-12 | [11352](https://github.com/airbytehq/airbyte/pull/11352) | Update documentation | | 0.2.13 | 2022-04-11 | [11632](https://github.com/airbytehq/airbyte/pull/11632) | Add unit tests | diff --git a/docs/integrations/sources/mysql.md b/docs/integrations/sources/mysql.md index 2ce57e435ead..4fcb17231452 100644 --- a/docs/integrations/sources/mysql.md +++ b/docs/integrations/sources/mysql.md @@ -255,7 +255,8 @@ WHERE actor_definition_id ='435bb9a5-7887-4809-aa58-28c27df0d7ad' AND (configura ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :--------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- | +|:--------|:-----------| :--------------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.15 | 2022-12-06 | [20000](https://github.com/airbytehq/airbyte/pull/20000) | Add check and better messaging when user does not have permission to access binary log in CDC mode | | 1.0.14 | 2022-11-22 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | | 1.0.13 | 2022-11-14 | [18956](https://github.com/airbytehq/airbyte/pull/18956) | Clean up Tinyint Unsigned data type identification | | 1.0.12 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | diff --git a/docs/integrations/sources/postgres.md b/docs/integrations/sources/postgres.md index 472c32b7cec4..c997cdf3d67e 100644 --- a/docs/integrations/sources/postgres.md +++ b/docs/integrations/sources/postgres.md @@ -413,115 +413,117 @@ The root causes is that the WALs needed for the incremental sync has been remove ## Changelog -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:-------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | -| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | -| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | -| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | -| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | -| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | -| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | -| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | -| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | -| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | -| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | -| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | -| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | -| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | -| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | -| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | -| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | -| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | -| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | -| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | -| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | -| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | -| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | -| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | -| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | -| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | -| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | -| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | -| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | -| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | -| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | -| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | -| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | -| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | -| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | -| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | -| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | -| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | -| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | -| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | -| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | -| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | -| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | -| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | -| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | -| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | -| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | -| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | -| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | -| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | -| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | -| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | -| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | -| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | -| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | -| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | -| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | -| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | -| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | -| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | -| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | -| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | -| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | -| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | -| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | -| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | -| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | -| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | -| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | -| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | -| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | -| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | -| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | -| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | -| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | -| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | -| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | -| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | -| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | -| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | -| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | -| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | -| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | -| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | -| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | -| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | -| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | -| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | -| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | -| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | -| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | -| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | -| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | -| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | -| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | -| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | -| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | -| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | -| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | -| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | -| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | -| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | -| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | -| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | -| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | -| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | -| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:-----------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | +| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | +| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | +| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | +| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | +| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | +| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | +| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | +| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | +| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | +| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | +| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | +| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | +| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | +| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | +| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | +| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | +| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | +| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | +| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | +| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | +| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | +| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | +| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | +| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | +| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | +| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | +| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | +| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | +| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | +| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | +| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | +| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | +| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | +| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | +| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | +| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | +| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | +| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | +| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | +| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | +| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | +| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | +| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | +| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | +| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | +| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | +| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | +| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | +| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | +| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | +| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | +| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | +| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | +| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | +| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | +| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | +| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | +| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | +| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | +| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | +| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | +| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | +| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | +| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | +| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | +| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | +| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | +| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | +| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | +| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | +| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | +| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | +| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | +| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | +| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | +| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | +| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | +| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | +| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | +| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | +| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | +| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | +| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | +| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | +| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | +| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | +| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | +| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | +| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | +| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | +| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | +| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | +| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | +| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | +| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | +| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | +| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | +| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | +| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | +| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | +| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | +| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | +| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | +| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | +| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | +| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | +| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | +| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | diff --git a/docs/integrations/sources/rd-station-marketing.md b/docs/integrations/sources/rd-station-marketing.md index 989d4e205499..193192d0eb33 100644 --- a/docs/integrations/sources/rd-station-marketing.md +++ b/docs/integrations/sources/rd-station-marketing.md @@ -41,4 +41,5 @@ Each endpoint has its own performance limitations, which also consider the accou | Version | Date | Pull Request | Subject | | :------ | :--------- | :------------------------------------------------------- | :-------------------------------------------------------------- | -| 0.1.0 | 2022-10-23 | [18348](https://github.com/airbytehq/airbyte/pull/18348) | Initial Release | +| 0.1.1 | 2022-11-01 | [18826](https://github.com/airbytehq/airbyte/pull/18826) | Fix stream analytics_conversions | +| 0.1.0 | 2022-10-23 | [18348](https://github.com/airbytehq/airbyte/pull/18348) | Initial Release | diff --git a/docs/integrations/sources/stripe.md b/docs/integrations/sources/stripe.md index 0132864049c9..ce37f6e0a926 100644 --- a/docs/integrations/sources/stripe.md +++ b/docs/integrations/sources/stripe.md @@ -53,6 +53,7 @@ The Stripe source connector supports the following streams: - [Coupons](https://stripe.com/docs/api/coupons/list) \(Incremental\) - [Customer Balance Transactions](https://stripe.com/docs/api/customer_balance_transactions/list) - [Customers](https://stripe.com/docs/api/customers/list) \(Incremental\) + - This endpoint does not include deleted customers - [Disputes](https://stripe.com/docs/api/disputes/list) \(Incremental\) - [Events](https://stripe.com/docs/api/events/list) \(Incremental\) - The Stripe API does not guarantee access to events older than 30 days, so this stream will only pull events created from the 30 days prior to the initial sync and not from the Replication start date. diff --git a/docs/operator-guides/upgrading-airbyte.md b/docs/operator-guides/upgrading-airbyte.md index 631366af119f..8bbcbac4d956 100644 --- a/docs/operator-guides/upgrading-airbyte.md +++ b/docs/operator-guides/upgrading-airbyte.md @@ -103,7 +103,7 @@ If you are upgrading from (i.e. your current version of Airbyte is) Airbyte vers Here's an example of what it might look like with the values filled in. It assumes that the downloaded `airbyte_archive.tar.gz` is in `/tmp`. ```bash - docker run --rm -v /tmp:/config airbyte/migration:0.40.23 --\ + docker run --rm -v /tmp:/config airbyte/migration:0.40.24 --\ --input /config/airbyte_archive.tar.gz\ --output /config/airbyte_archive_migrated.tar.gz ``` diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index b1b26c98dd65..d9bd656661e7 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -190,17 +190,9 @@

Airbyte Configuration API

  • The naming convention for endpoints is: localhost:8000/{VERSION}/{METHOD_FAMILY}/{METHOD_NAME} e.g. localhost:8000/v1/connections/create.
  • For all update methods, the whole object must be passed in, even the fields that did not change.
  • -

    Change Management:

    +

    Authentication (OSS):

      -
    • The major version of the API endpoint can be determined / specified in the URL localhost:8080/v1/connections/create
    • -
    • Minor version bumps will be invisible to the end user. The user cannot specify minor versions in requests.
    • -
    • All backwards incompatible changes will happen in major version bumps. We will not make backwards incompatible changes in minor version bumps. Examples of non-breaking changes (includes but not limited to...): -
        -
      • Adding fields to request or response bodies.
      • -
      • Adding new HTTP endpoints.
      • -
      -
    • -
    • All web_backend APIs are not considered public APIs and are not guaranteeing backwards compatibility.
    • +
    • When authenticating to the Configuration API, you must use Basic Authentication by setting the Authentication Header to Basic and base64 encoding the username and password (which are airbyte and password by default - so base64 encoding airbyte:password results in YWlyYnl0ZTpwYXNzd29yZA==). So the full header reads 'Authorization': "Basic YWlyYnl0ZTpwYXNzd29yZA=="
    @@ -236,11 +228,6 @@

    Connection

  • post /v1/connections/sync
  • post /v1/connections/update
  • -

    DbMigration

    -

    Destination

    • post /v1/destinations/check_connection
    • @@ -256,8 +243,6 @@

      Destination

      DestinationDefinition

      DestinationDefinitionSpecification

      @@ -343,8 +327,6 @@

      Source

      SourceDefinition

      SourceDefinitionSpecification

      @@ -1835,153 +1816,6 @@

      422

      InvalidInputExceptionInfo
      -

      DbMigration

      -
      -
      - Up -
      post /v1/db_migrations/migrate
      -
      Migrate the database to the latest version (executeMigrations)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      DbMigrationRequestBody DbMigrationRequestBody (required)
      - -
      Body Parameter
      - -
      - - - - -

      Return type

      - - - - -

      Example data

      -
      Content-Type: application/json
      -
      {
      -  "initialVersion" : "initialVersion",
      -  "executedMigrations" : [ {
      -    "migrationVersion" : "migrationVersion",
      -    "migrationDescription" : "migrationDescription",
      -    "migratedAt" : 0,
      -    "migrationType" : "migrationType",
      -    "migrationScript" : "migrationScript",
      -    "migratedBy" : "migratedBy"
      -  }, {
      -    "migrationVersion" : "migrationVersion",
      -    "migrationDescription" : "migrationDescription",
      -    "migratedAt" : 0,
      -    "migrationType" : "migrationType",
      -    "migrationScript" : "migrationScript",
      -    "migratedBy" : "migratedBy"
      -  } ],
      -  "targetVersion" : "targetVersion"
      -}
      - -

      Produces

      - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
        -
      • application/json
      • -
      - -

      Responses

      -

      200

      - Successful operation - DbMigrationExecutionRead -

      404

      - Object with given id was not found. - NotFoundKnownExceptionInfo -

      422

      - Input failed validation - InvalidInputExceptionInfo -
      -
      -
      -
      - Up -
      post /v1/db_migrations/list
      -
      List all database migrations (listMigrations)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      DbMigrationRequestBody DbMigrationRequestBody (required)
      - -
      Body Parameter
      - -
      - - - - -

      Return type

      - - - - -

      Example data

      -
      Content-Type: application/json
      -
      {
      -  "migrations" : [ {
      -    "migrationVersion" : "migrationVersion",
      -    "migrationDescription" : "migrationDescription",
      -    "migratedAt" : 0,
      -    "migrationType" : "migrationType",
      -    "migrationScript" : "migrationScript",
      -    "migratedBy" : "migratedBy"
      -  }, {
      -    "migrationVersion" : "migrationVersion",
      -    "migrationDescription" : "migrationDescription",
      -    "migratedAt" : 0,
      -    "migrationType" : "migrationType",
      -    "migrationScript" : "migrationScript",
      -    "migratedBy" : "migratedBy"
      -  } ]
      -}
      - -

      Produces

      - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
        -
      • application/json
      • -
      - -

      Responses

      -

      200

      - Successful operation - DbMigrationReadList -

      404

      - Object with given id was not found. - NotFoundKnownExceptionInfo -

      422

      - Input failed validation - InvalidInputExceptionInfo -
      -

      Destination


      -
      -
      - Up -
      post /v1/destination_definitions/create
      -
      Creates a destinationsDefinition (createDestinationDefinition)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      DestinationDefinitionCreate DestinationDefinitionCreate (optional)
      - -
      Body Parameter
      - -
      - - - - -

      Return type

      - - - - -

      Example data

      -
      Content-Type: application/json
      -
      {
      -  "resourceRequirements" : {
      -    "default" : {
      -      "cpu_limit" : "cpu_limit",
      -      "memory_request" : "memory_request",
      -      "memory_limit" : "memory_limit",
      -      "cpu_request" : "cpu_request"
      -    },
      -    "jobSpecific" : [ {
      -      "resourceRequirements" : {
      -        "cpu_limit" : "cpu_limit",
      -        "memory_request" : "memory_request",
      -        "memory_limit" : "memory_limit",
      -        "cpu_request" : "cpu_request"
      -      }
      -    }, {
      -      "resourceRequirements" : {
      -        "cpu_limit" : "cpu_limit",
      -        "memory_request" : "memory_request",
      -        "memory_limit" : "memory_limit",
      -        "cpu_request" : "cpu_request"
      -      }
      -    } ]
      -  },
      -  "documentationUrl" : "https://openapi-generator.tech",
      -  "dockerImageTag" : "dockerImageTag",
      -  "releaseDate" : "2000-01-23",
      -  "dockerRepository" : "dockerRepository",
      -  "name" : "name",
      -  "icon" : "icon",
      -  "protocolVersion" : "protocolVersion",
      -  "destinationDefinitionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
      -}
      - -

      Produces

      - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
        -
      • application/json
      • -
      - -

      Responses

      -

      200

      - Successful operation - DestinationDefinitionRead -

      422

      - Input failed validation - InvalidInputExceptionInfo -
      -
      -
      -
      - Up -
      post /v1/destination_definitions/delete_custom
      -
      Delete a custom destination definition for the given workspace (deleteCustomDestinationDefinition)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      DestinationDefinitionIdWithWorkspaceId DestinationDefinitionIdWithWorkspaceId (required)
      - -
      Body Parameter
      - -
      - - - - - - - - -

      Produces

      - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
        -
      • application/json
      • -
      - -

      Responses

      -

      204

      - The destination was deleted successfully. - -

      404

      - Object with given id was not found. - NotFoundKnownExceptionInfo -

      422

      - Input failed validation - InvalidInputExceptionInfo -
      -
      Up @@ -3562,120 +3263,32 @@

      200


      - Up -
      post /v1/destination_definitions/revoke_definition
      -
      revoke a grant to a private, non-custom destinationDefinition from a given workspace (revokeDestinationDefinitionFromWorkspace)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      DestinationDefinitionIdWithWorkspaceId DestinationDefinitionIdWithWorkspaceId (required)
      - -
      Body Parameter
      - -
      - - - - - - - - -

      Produces

      - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
        -
      • application/json
      • -
      - -

      Responses

      -

      204

      - The resource was deleted successfully. - -

      404

      - Object with given id was not found. - NotFoundKnownExceptionInfo -

      422

      - Input failed validation - InvalidInputExceptionInfo -
      -
      -
      -
      - Up -
      post /v1/destination_definitions/update_custom
      -
      Update a custom destinationDefinition for the given workspace (updateCustomDestinationDefinition)
      -
      - - -

      Consumes

      - This API call consumes the following media types via the Content-Type request header: -
        -
      • application/json
      • -
      - -

      Request body

      -
      -
      CustomDestinationDefinitionUpdate CustomDestinationDefinitionUpdate (optional)
      - -
      Body Parameter
      - -
      - - - - -

      Return type

      - - - - -

      Example data

      -
      Content-Type: application/json
      -
      {
      -  "resourceRequirements" : {
      -    "default" : {
      -      "cpu_limit" : "cpu_limit",
      -      "memory_request" : "memory_request",
      -      "memory_limit" : "memory_limit",
      -      "cpu_request" : "cpu_request"
      -    },
      -    "jobSpecific" : [ {
      -      "resourceRequirements" : {
      -        "cpu_limit" : "cpu_limit",
      -        "memory_request" : "memory_request",
      -        "memory_limit" : "memory_limit",
      -        "cpu_request" : "cpu_request"
      -      }
      -    }, {
      -      "resourceRequirements" : {
      -        "cpu_limit" : "cpu_limit",
      -        "memory_request" : "memory_request",
      -        "memory_limit" : "memory_limit",
      -        "cpu_request" : "cpu_request"
      -      }
      -    } ]
      -  },
      -  "documentationUrl" : "https://openapi-generator.tech",
      -  "dockerImageTag" : "dockerImageTag",
      -  "releaseDate" : "2000-01-23",
      -  "dockerRepository" : "dockerRepository",
      -  "name" : "name",
      -  "icon" : "icon",
      -  "protocolVersion" : "protocolVersion",
      -  "destinationDefinitionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
      -}
      + Up +
      post /v1/destination_definitions/revoke_definition
      +
      revoke a grant to a private, non-custom destinationDefinition from a given workspace (revokeDestinationDefinitionFromWorkspace)
      +
      + + +

      Consumes

      + This API call consumes the following media types via the Content-Type request header: +
        +
      • application/json
      • +
      + +

      Request body

      +
      +
      DestinationDefinitionIdWithWorkspaceId DestinationDefinitionIdWithWorkspaceId (required)
      + +
      Body Parameter
      + +
      + + + + + + +

      Produces

      This API call produces the following media types according to the Accept request header; @@ -3685,9 +3298,9 @@

      Produces

    Responses

    -

    200

    - Successful operation - DestinationDefinitionRead +

    204

    + The resource was deleted successfully. +

    404

    Object with given id was not found. NotFoundKnownExceptionInfo @@ -7096,140 +6709,6 @@

    422

    InvalidInputExceptionInfo
    -
    -
    - Up -
    post /v1/source_definitions/create
    -
    Creates a sourceDefinition (createSourceDefinition)
    -
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    - -

    Request body

    -
    -
    SourceDefinitionCreate SourceDefinitionCreate (optional)
    - -
    Body Parameter
    - -
    - - - - -

    Return type

    - - - - -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "resourceRequirements" : {
    -    "default" : {
    -      "cpu_limit" : "cpu_limit",
    -      "memory_request" : "memory_request",
    -      "memory_limit" : "memory_limit",
    -      "cpu_request" : "cpu_request"
    -    },
    -    "jobSpecific" : [ {
    -      "resourceRequirements" : {
    -        "cpu_limit" : "cpu_limit",
    -        "memory_request" : "memory_request",
    -        "memory_limit" : "memory_limit",
    -        "cpu_request" : "cpu_request"
    -      }
    -    }, {
    -      "resourceRequirements" : {
    -        "cpu_limit" : "cpu_limit",
    -        "memory_request" : "memory_request",
    -        "memory_limit" : "memory_limit",
    -        "cpu_request" : "cpu_request"
    -      }
    -    } ]
    -  },
    -  "documentationUrl" : "https://openapi-generator.tech",
    -  "dockerImageTag" : "dockerImageTag",
    -  "releaseDate" : "2000-01-23",
    -  "sourceType" : "api",
    -  "dockerRepository" : "dockerRepository",
    -  "name" : "name",
    -  "icon" : "icon",
    -  "protocolVersion" : "protocolVersion",
    -  "sourceDefinitionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    -}
    - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • application/json
    • -
    - -

    Responses

    -

    200

    - Successful operation - SourceDefinitionRead -

    422

    - Input failed validation - InvalidInputExceptionInfo -
    -
    -
    -
    - Up -
    post /v1/source_definitions/delete_custom
    -
    Delete a custom source definition for the given workspace (deleteCustomSourceDefinition)
    -
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    - -

    Request body

    -
    -
    SourceDefinitionIdWithWorkspaceId SourceDefinitionIdWithWorkspaceId (required)
    - -
    Body Parameter
    - -
    - - - - - - - - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • application/json
    • -
    - -

    Responses

    -

    204

    - The resource was deleted successfully. - -

    404

    - Object with given id was not found. - NotFoundKnownExceptionInfo -

    422

    - Input failed validation - InvalidInputExceptionInfo -
    -
    Up @@ -8050,95 +7529,6 @@

    422

    InvalidInputExceptionInfo

    -
    -
    - Up -
    post /v1/source_definitions/update_custom
    -
    Update a custom sourceDefinition for the given workspace (updateCustomSourceDefinition)
    -
    - - -

    Consumes

    - This API call consumes the following media types via the Content-Type request header: -
      -
    • application/json
    • -
    - -

    Request body

    -
    -
    CustomSourceDefinitionUpdate CustomSourceDefinitionUpdate (optional)
    - -
    Body Parameter
    - -
    - - - - -

    Return type

    - - - - -

    Example data

    -
    Content-Type: application/json
    -
    {
    -  "resourceRequirements" : {
    -    "default" : {
    -      "cpu_limit" : "cpu_limit",
    -      "memory_request" : "memory_request",
    -      "memory_limit" : "memory_limit",
    -      "cpu_request" : "cpu_request"
    -    },
    -    "jobSpecific" : [ {
    -      "resourceRequirements" : {
    -        "cpu_limit" : "cpu_limit",
    -        "memory_request" : "memory_request",
    -        "memory_limit" : "memory_limit",
    -        "cpu_request" : "cpu_request"
    -      }
    -    }, {
    -      "resourceRequirements" : {
    -        "cpu_limit" : "cpu_limit",
    -        "memory_request" : "memory_request",
    -        "memory_limit" : "memory_limit",
    -        "cpu_request" : "cpu_request"
    -      }
    -    } ]
    -  },
    -  "documentationUrl" : "https://openapi-generator.tech",
    -  "dockerImageTag" : "dockerImageTag",
    -  "releaseDate" : "2000-01-23",
    -  "sourceType" : "api",
    -  "dockerRepository" : "dockerRepository",
    -  "name" : "name",
    -  "icon" : "icon",
    -  "protocolVersion" : "protocolVersion",
    -  "sourceDefinitionId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    -}
    - -

    Produces

    - This API call produces the following media types according to the Accept request header; - the media type will be conveyed by the Content-Type response header. -
      -
    • application/json
    • -
    - -

    Responses

    -

    200

    - Successful operation - SourceDefinitionRead -

    404

    - Object with given id was not found. - NotFoundKnownExceptionInfo -

    422

    - Input failed validation - InvalidInputExceptionInfo -
    -
    -
    -

    CustomDestinationDefinitionUpdate - Up

    -
    -
    -
    workspaceId
    UUID format: uuid
    -
    destinationDefinition
    -
    -
    -
    -

    CustomSourceDefinitionUpdate - Up

    -
    -
    -
    workspaceId
    UUID format: uuid
    -
    sourceDefinition
    -
    -

    DataType - Up

    diff --git a/docs/release_notes/november_2022.md b/docs/release_notes/november_2022.md new file mode 100644 index 000000000000..8c31dd14699a --- /dev/null +++ b/docs/release_notes/november_2022.md @@ -0,0 +1,20 @@ +# November 2022 +## Airbyte [v0.40.18](https://github.com/airbytehq/airbyte/releases/tag/v0.40.18) to [v0.40.23](https://github.com/airbytehq/airbyte/releases/tag/v0.40.23) + +This page includes new features and improvements to the Airbyte Cloud and Airbyte Open Source platforms. + +### New features +* Added multi-region Cloud architecture, which allows for better [data protection](https://airbyte.com/blog/why-airbytes-eu-launch-is-a-milestone-for-our-data-protection-roadmap) and for Airbyte Cloud to [launch in Europe](https://airbyte.com/blog/airbyte-cloud-is-now-available-in-europe). +* Added the [low-code connector builder](https://www.loom.com/share/acf899938ef74dec8dd61ba012bc872f) UI to Airbyte Open Source. Run Airbyte v0.40.19 or higher and visit `localhost:8000/connector-builder` to start building low-code connectors. +* Added a Helm chart for deploying `airbyte-cron`. New installations of Airbyte Open Source will now deploy `airbyte-cron` by default. To disable cron, use `--set cron.enabled=false` when running a `helm install`. [#18542](https://github.com/airbytehq/airbyte/pull/18542) +* Added a progress bar estimate to syncs in Airbyte Cloud. [#19814](https://github.com/airbytehq/airbyte/pull/19814) + +### Improvements +* Improved the Airbyte Protocol by introducing Airbyte Protocol v1 [#19846](https://github.com/airbytehq/airbyte/pull/19846), which defines a set of [well-known data types](https://github.com/airbytehq/airbyte/blob/5813700927cfc690d2bffcec28f5286e59ac0122/docs/understanding-airbyte/supported-data-types.md). [#17486](https://github.com/airbytehq/airbyte/pull/17486) + * These replace existing JSON Schema primitive types. + * They provide out-of-the-box validation and enforce specific formatting on some data types, like timestamps. + * Non-primitive types, like `object`, `array`, and ` oneOf`, still use raw JSON Schema types. + * These well-known types mostly correspond with the existing Airbyte data types, aside from a few differences: + * `BinaryData` is the only new type, which is used in places that previously produced a `Base64` string. + * `TimestampWithTimezone`, `TimestampWithoutTimezone`, `TimeWithTimezone`, and `TimeWithoutTimezone` have been in use for some time, so we made them official. + * The `big_integer` and `big_number` types have been retired because they were not being used. diff --git a/docs/understanding-airbyte/basic-normalization.md b/docs/understanding-airbyte/basic-normalization.md index 46fa8763f94a..305e382f75c6 100644 --- a/docs/understanding-airbyte/basic-normalization.md +++ b/docs/understanding-airbyte/basic-normalization.md @@ -353,6 +353,7 @@ Therefore, in order to "upgrade" to the desired normalization version, you need | Airbyte Version | Normalization Version | Date | Pull Request | Subject | |:----------------|:----------------------|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------| +| | 0.2.25 | 2022-12-05 | [\#19573](https://github.com/airbytehq/airbyte/pull/19573) | Update Clickhouse dbt version | | | 0.2.24 | 2022-11-01 | [\#18015](https://github.com/airbytehq/airbyte/pull/18015) | Add a drop table hook that drops *_scd tables after overwrite/reset | | | 0.2.23 | 2022-10-12 | [\#17483](https://github.com/airbytehq/airbyte/pull/17483) (published in [\#17896](https://github.com/airbytehq/airbyte/pull/17896)) | Remove unnecessary `Native Port` config option | | | 0.2.22 | 2022-09-05 | [\#16339](https://github.com/airbytehq/airbyte/pull/16339) | Update Clickhouse DBT to 1.1.8 | diff --git a/docusaurus/sidebars.js b/docusaurus/sidebars.js index fad668bd3341..b04abbd14d7b 100644 --- a/docusaurus/sidebars.js +++ b/docusaurus/sidebars.js @@ -185,6 +185,8 @@ module.exports = { }, 'operator-guides/using-custom-connectors', 'operator-guides/scaling-airbyte', + 'operator-guides/configuring-sync-notifications', + 'operator-guides/collecting-metrics', ], }, { @@ -422,6 +424,7 @@ module.exports = { type: 'generated-index', }, items: [ + 'release_notes/november_2022', 'release_notes/october_2022', 'release_notes/september_2022', 'release_notes/august_2022', diff --git a/kube/overlays/stable-with-resource-limits/.env b/kube/overlays/stable-with-resource-limits/.env index c528d738831b..5112ef9e541f 100644 --- a/kube/overlays/stable-with-resource-limits/.env +++ b/kube/overlays/stable-with-resource-limits/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.23 +AIRBYTE_VERSION=0.40.24 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable-with-resource-limits/kustomization.yaml b/kube/overlays/stable-with-resource-limits/kustomization.yaml index 25d3050d3f66..f9556c128ec4 100644 --- a/kube/overlays/stable-with-resource-limits/kustomization.yaml +++ b/kube/overlays/stable-with-resource-limits/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/bootloader - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/server - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/webapp - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/worker - newTag: 0.40.23 + newTag: 0.40.24 - name: temporalio/auto-setup newTag: 1.7.0 - name: airbyte/cron - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/connector-builder-server - newTag: 0.40.23 + newTag: 0.40.24 configMapGenerator: - name: airbyte-env diff --git a/kube/overlays/stable/.env b/kube/overlays/stable/.env index 36fcd4976d0d..cf3d72cd864a 100644 --- a/kube/overlays/stable/.env +++ b/kube/overlays/stable/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.23 +AIRBYTE_VERSION=0.40.24 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable/kustomization.yaml b/kube/overlays/stable/kustomization.yaml index 27a56566de95..c0120aed2463 100644 --- a/kube/overlays/stable/kustomization.yaml +++ b/kube/overlays/stable/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/bootloader - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/server - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/webapp - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/worker - newTag: 0.40.23 + newTag: 0.40.24 - name: temporalio/auto-setup newTag: 1.7.0 - name: airbyte/cron - newTag: 0.40.23 + newTag: 0.40.24 - name: airbyte/connector-builder-server - newTag: 0.40.23 + newTag: 0.40.24 configMapGenerator: - name: airbyte-env diff --git a/octavia-cli/Dockerfile b/octavia-cli/Dockerfile index 363318ceff12..4e782b4cb48d 100644 --- a/octavia-cli/Dockerfile +++ b/octavia-cli/Dockerfile @@ -14,5 +14,5 @@ USER octavia-cli WORKDIR /home/octavia-project ENTRYPOINT ["octavia"] -LABEL io.airbyte.version=0.40.23 +LABEL io.airbyte.version=0.40.24 LABEL io.airbyte.name=airbyte/octavia-cli diff --git a/octavia-cli/README.md b/octavia-cli/README.md index 888a5b8aca88..677d92b51619 100644 --- a/octavia-cli/README.md +++ b/octavia-cli/README.md @@ -43,7 +43,7 @@ Feel free to share your use cases with the community in [#octavia-cli](https://a ### 1. Generate local YAML files for sources or destinations -1. Retrieve the _definition id_ of the connector you want to use using `octavia list command`. +1. Retrieve the _definition id_ of the connector you want to use using `octavia list` command. 2. Generate YAML configuration running `octavia generate source ` or `octavia generate destination `. ### 2. Edit your local YAML configurations @@ -104,7 +104,7 @@ This script: ```bash touch ~/.octavia # Create a file to store env variables that will be mapped the octavia-cli container mkdir my_octavia_project_directory # Create your octavia project directory where YAML configurations will be stored. -docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.23 +docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.24 ``` ### Using `docker-compose` @@ -712,7 +712,7 @@ You can disable telemetry by setting the `OCTAVIA_ENABLE_TELEMETRY` environment | Version | Date | Description | PR | | ------- | ---------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | 0.41.0 | 2022-10-13 | Use Basic Authentication for making API requests | [#17982](https://github.com/airbytehq/airbyte/pull/17982) | -| 0.40.23 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | +| 0.40.24 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | | 0.39.33 | 2022-07-05 | Add `octavia import all` command | [#14374](https://github.com/airbytehq/airbyte/pull/14374) | | 0.39.32 | 2022-06-30 | Create import command to import and manage existing Airbyte resource from octavia-cli | [#14137](https://github.com/airbytehq/airbyte/pull/14137) | | 0.39.27 | 2022-06-24 | Create get command to retrieve resources JSON representation | [#13254](https://github.com/airbytehq/airbyte/pull/13254) | diff --git a/octavia-cli/install.sh b/octavia-cli/install.sh index c09f6885f0bf..fdb6b3ec950b 100755 --- a/octavia-cli/install.sh +++ b/octavia-cli/install.sh @@ -3,7 +3,7 @@ # This install scripts currently only works for ZSH and Bash profiles. # It creates an octavia alias in your profile bound to a docker run command and your current user. -VERSION=0.40.23 +VERSION=0.40.24 OCTAVIA_ENV_FILE=${HOME}/.octavia detect_profile() { diff --git a/octavia-cli/integration_tests/configurations/connections/poke_to_pg/configuration.yaml b/octavia-cli/integration_tests/configurations/connections/poke_to_pg/configuration.yaml index 1e343e606fb6..6240fadd1047 100644 --- a/octavia-cli/integration_tests/configurations/connections/poke_to_pg/configuration.yaml +++ b/octavia-cli/integration_tests/configurations/connections/poke_to_pg/configuration.yaml @@ -7,6 +7,7 @@ destination_configuration_path: TO_UPDATE_FROM_TEST # EDIT THE CONFIGURATION BELOW! configuration: status: active # REQUIRED | string | Allowed values: active, inactive, deprecated + skip_reset: false # OPTIONAL | boolean | Flag to check if the connection should be reset after a connection update namespace_definition: source # OPTIONAL | string | Allowed values: source, destination, customformat namespace_format: "${SOURCE_NAMESPACE}" # OPTIONAL | string | Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. prefix: "" # REQUIRED | Prefix that will be prepended to the name of each stream when it is written to the destination diff --git a/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_with_normalization.yaml b/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_with_normalization.yaml index 2ec8abc12173..ceeddbc1c8de 100644 --- a/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_with_normalization.yaml +++ b/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_with_normalization.yaml @@ -7,6 +7,7 @@ destination_configuration_path: destination_configuration_path # EDIT THE CONFIGURATION BELOW! configuration: status: active # REQUIRED | string | Allowed values: active, inactive, deprecated + skip_reset: false # OPTIONAL | boolean | Flag to check if the connection should be reset after a connection update namespace_definition: source # OPTIONAL | string | Allowed values: source, destination, customformat namespace_format: "${SOURCE_NAMESPACE}" # OPTIONAL | string | Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. prefix: "" # REQUIRED | Prefix that will be prepended to the name of each stream when it is written to the destination diff --git a/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_without_normalization.yaml b/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_without_normalization.yaml index 6cfe86d70e46..ebe43dbccbef 100644 --- a/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_without_normalization.yaml +++ b/octavia-cli/integration_tests/test_generate/expected_rendered_yaml/connection/expected_without_normalization.yaml @@ -7,6 +7,7 @@ destination_configuration_path: destination_configuration_path # EDIT THE CONFIGURATION BELOW! configuration: status: active # REQUIRED | string | Allowed values: active, inactive, deprecated + skip_reset: false # OPTIONAL | boolean | Flag to check if the connection should be reset after a connection update namespace_definition: source # OPTIONAL | string | Allowed values: source, destination, customformat namespace_format: "${SOURCE_NAMESPACE}" # OPTIONAL | string | Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. prefix: "" # REQUIRED | Prefix that will be prepended to the name of each stream when it is written to the destination diff --git a/octavia-cli/octavia_cli/apply/resources.py b/octavia-cli/octavia_cli/apply/resources.py index da60f0008b44..7425ac61d0f9 100644 --- a/octavia-cli/octavia_cli/apply/resources.py +++ b/octavia-cli/octavia_cli/apply/resources.py @@ -569,6 +569,10 @@ class Connection(BaseResource): resource_type = "connection" + local_root_level_keys_to_remove_during_create = ["skip_reset"] # Remove these keys when sending a create request + + local_root_level_keys_to_filter_out_for_comparison = ["skip_reset"] # Remote do not have these keys + remote_root_level_keys_to_filter_out_for_comparison = [ "name", "source", @@ -667,6 +671,8 @@ def create_payload(self) -> WebBackendConnectionCreate: self.configuration["operations"] = self._deserialize_operations( self.raw_configuration["configuration"]["operations"], OperationCreate ) + for k in self.local_root_level_keys_to_remove_during_create: + self.configuration.pop(k, None) return WebBackendConnectionCreate( name=self.resource_name, source_id=self.source_id, destination_id=self.destination_id, **self.configuration ) @@ -794,6 +800,14 @@ def _check_for_legacy_raw_configuration_keys(self, raw_configuration): "These keys changed to source_configuration_path and destination_configuration_path in version > 0.39.18, please update your connection configuration to give path to source and destination configuration files or regenerate the connection", ) + def _get_local_comparable_configuration(self) -> dict: + comparable = { + k: v + for k, v in self.raw_configuration["configuration"].items() + if k not in self.local_root_level_keys_to_filter_out_for_comparison + } + return comparable + def _get_remote_comparable_configuration(self) -> dict: comparable = { diff --git a/octavia-cli/octavia_cli/generate/templates/connection.yaml.j2 b/octavia-cli/octavia_cli/generate/templates/connection.yaml.j2 index 58b36cba53cd..510083944e91 100644 --- a/octavia-cli/octavia_cli/generate/templates/connection.yaml.j2 +++ b/octavia-cli/octavia_cli/generate/templates/connection.yaml.j2 @@ -7,6 +7,7 @@ destination_configuration_path: {{ destination_configuration_path }} # EDIT THE CONFIGURATION BELOW! configuration: status: active # REQUIRED | string | Allowed values: active, inactive, deprecated + skip_reset: false # OPTIONAL | boolean | Flag to check if the connection should be reset after a connection update namespace_definition: source # OPTIONAL | string | Allowed values: source, destination, customformat namespace_format: "${SOURCE_NAMESPACE}" # OPTIONAL | string | Used when namespaceDefinition is 'customformat'. If blank then behaves like namespaceDefinition = 'destination'. If "${SOURCE_NAMESPACE}" then behaves like namespaceDefinition = 'source'. prefix: "" # REQUIRED | Prefix that will be prepended to the name of each stream when it is written to the destination diff --git a/octavia-cli/setup.py b/octavia-cli/setup.py index 52add52c55a7..7e0333383fd7 100644 --- a/octavia-cli/setup.py +++ b/octavia-cli/setup.py @@ -15,7 +15,7 @@ setup( name="octavia-cli", - version="0.40.23", + version="0.40.24", description="A command line interface to manage Airbyte configurations", long_description=README, author="Airbyte", diff --git a/tools/bin/build_image.sh b/tools/bin/build_image.sh index 9684d07d6116..14d17e1df92f 100755 --- a/tools/bin/build_image.sh +++ b/tools/bin/build_image.sh @@ -19,8 +19,8 @@ assert_root cd "$PROJECT_DIR" function validate_dockerignore() { - excludes_all=$(grep -w '^\*$' .dockerignore) - excludes_except=$(grep -w '^!.*' .dockerignore) + excludes_all=$(grep -w '^\*$' .dockerignore || true) + excludes_except=$(grep -w '^!.*' .dockerignore || true) if [ -n "$excludes_all" ] || [ -n "$excludes_except" ]; then error "Cannot include exclusion exceptions when following symlinks. Please use an exclude pattern that doesn't use exclude-all (e.g: *) or exclude-except (e.g: !/some/pattern)" fi diff --git a/tools/bin/check_images_exist.sh b/tools/bin/check_images_exist.sh index 1ffbf8195d0c..2098a9c73218 100755 --- a/tools/bin/check_images_exist.sh +++ b/tools/bin/check_images_exist.sh @@ -82,16 +82,18 @@ checkPlatformImages() { checkNormalizationImages() { echo -e "$blue_text""Checking Normalization images exist...""$default_text" - # the only way to know what version of normalization the platform is using is looking in NormalizationRunnerFactory. local image_version; - factory_path=airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/NormalizationRunnerFactory.java + definition_file_path=airbyte-config/init/src/main/resources/seed/destination_definitions.yaml # -f True if file exists and is a regular file - if ! test -f $factory_path; then - echo -e "$red_text""No NormalizationRunnerFactory found at path! H4LP!!!""$default_text" + if ! test -f $definition_file_path; then + echo -e "$red_text""Destination definition file not found at path! H4LP!!!""$default_text" fi - image_version=$(cat $factory_path | grep 'NORMALIZATION_VERSION =' | cut -d"=" -f2 | sed 's:;::' | sed -e 's:"::g' | sed -e 's:[[:space:]]::g') - echo -e "$blue_text""Checking normalization images with version $image_version exist...""$default_text" - VERSION=$image_version + normalization_image_versions=$(cat $definition_file_path | grep 'normalizationTag:' | cut -d":" -f2 | sed 's:;::' | sed -e 's:"::g' | sed -e 's:[[:space:]]::g') + IFS=' ' read -r -a array <<< "$normalization_image_versions" + # Get the first value of the normalization tag + normalization_image=${array[0]} + echo -e "$blue_text""Checking normalization images with version $normalization_image exist...""$default_text" + VERSION=$normalization_image check_compose_image_exist airbyte-integrations/bases/base-normalization/docker-compose.yaml $VERSION } diff --git a/tools/bin/ci_check_dependency.py b/tools/bin/ci_check_dependency.py index f1b72fc075ed..d39499482102 100644 --- a/tools/bin/ci_check_dependency.py +++ b/tools/bin/ci_check_dependency.py @@ -2,7 +2,8 @@ import os import os.path import yaml -from typing import Any, Dict, Text +import re +from typing import Any, Dict, Text, List CONNECTORS_PATH = "./airbyte-integrations/connectors/" NORMALIZATION_PATH = "./airbyte-integrations/bases/base-normalization/" @@ -16,6 +17,11 @@ "/integration_tests/", "/unit_tests/", # Common "acceptance-test-config.yml", "acceptance-test-docker.sh", ".md", ".dockerignore", ".gitignore", "requirements.txt"] +IGNORED_DESTINATIONS = [ + re.compile(".*-strict-encrypt$"), + re.compile("^destination-dev-null$"), + re.compile("^destination-jdbc$") +] COMMENT_TEMPLATE_PATH = ".github/comment_templates/connector_dependency_template.md" @@ -24,6 +30,9 @@ def main(): # See .github/workflows/report-connectors-dependency.yml file git_diff_file_path = ' '.join(sys.argv[1:]) + if git_diff_file_path == None or git_diff_file_path == "": + raise Exception("No changefile provided") + # Get changed files changed_files = get_changed_files(git_diff_file_path) # Get changed modules. e.g. source-acceptance-test from airbyte-integrations/bases/ @@ -117,7 +126,7 @@ def get_connector_version_status(connector, version): return f"❌ `{version}`
    (mismatch: `{base_variant_version}`)" -def get_connector_changelog_status(connector, version): +def get_connector_changelog_status(connector: str, version) -> str: type, name = connector.replace("-strict-encrypt", "").split("-", 1) doc_path = f"{DOC_PATH}{type}s/{name}.md" if not os.path.exists(doc_path): @@ -129,7 +138,11 @@ def get_connector_changelog_status(connector, version): after_changelog = True if after_changelog and version in line: return "✅" - return "❌
    (changelog missing)" + + if any(regex.match(connector) for regex in IGNORED_DESTINATIONS): + return "🔵
    (ignored)" + else: + return "❌
    (changelog missing)" def as_bulleted_markdown_list(items): @@ -139,14 +152,16 @@ def as_bulleted_markdown_list(items): return text -def as_markdown_table_rows(connectors, definitions): +def as_markdown_table_rows(connectors: List[str], definitions) -> str: text = "" for connector in connectors: version = get_connector_version(connector) version_status = get_connector_version_status(connector, version) changelog_status = get_connector_changelog_status(connector, version) definition = next((x for x in definitions if x["dockerRepository"].endswith(connector)), None) - if definition is None: + if any(regex.match(connector) for regex in IGNORED_DESTINATIONS): + publish_status = "🔵
    (ignored)" + elif definition is None: publish_status = "⚠
    (not in seed)" elif definition["dockerImageTag"] == version: publish_status = "✅" @@ -156,7 +171,7 @@ def as_markdown_table_rows(connectors, definitions): return text -def get_status_summary(rows): +def get_status_summary(rows: str) -> str: if "❌" in rows: return "❌" elif "⚠" in rows: diff --git a/tools/ci_credentials/README.md b/tools/ci_credentials/README.md index 5a0438df2fed..6e1f87b85fa4 100644 --- a/tools/ci_credentials/README.md +++ b/tools/ci_credentials/README.md @@ -1,6 +1,8 @@ # CI Credentials +CLI tooling to read and manage GSM secrets: +- `write-to-storage` download a connector's secrets locally in the connector's `secret` folder +- `update-secrets` uploads new connector secret version that were locally updated. -Connects to GSM to download connection details. ## Development @@ -25,14 +27,22 @@ After making a change, you have to reinstall it to run the bash command: `pip in The `VERSION=dev` will make it so it knows to use your local current working directory and not the Github Action one. -Pass in a connector name. For example: +### Help ```bash -VERSION=dev ci_credentials destination-snowflake +ci_credentials --help ``` -To make sure it get's all changes every time, you can run this: +### Write to storage +To download GSM secrets to `airbyte-integrations/connectors/source-bings-ads/secrets`: +```bash +ci_credentials source-bing-ads write-to-storage +``` + +### Update secrets +To upload to GSM newly updated configurations from `airbyte-integrations/connectors/source-bings-ads/secrets/updated_configurations`: ```bash -pip install --quiet -e ./tools/ci_* && VERSION=dev ci_credentials destination-snowflake -``` \ No newline at end of file +ci_credentials source-bing-ads update-secrets +``` + diff --git a/tools/ci_credentials/ci_credentials/__init__.py b/tools/ci_credentials/ci_credentials/__init__.py index 4f55c3781545..38a7423694b8 100644 --- a/tools/ci_credentials/ci_credentials/__init__.py +++ b/tools/ci_credentials/ci_credentials/__init__.py @@ -1,6 +1,6 @@ -# from .main import main -from .secrets_loader import SecretsLoader +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# +from .secrets_manager import SecretsManager -__all__ = ( - "SecretsLoader", -) +__all__ = ("SecretsManager",) diff --git a/tools/ci_credentials/ci_credentials/main.py b/tools/ci_credentials/ci_credentials/main.py index 3147509e3711..3620149092d2 100644 --- a/tools/ci_credentials/ci_credentials/main.py +++ b/tools/ci_credentials/ci_credentials/main.py @@ -1,10 +1,14 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# import json -import os import sys from json.decoder import JSONDecodeError +import click from ci_common_utils import Logger -from . import SecretsLoader + +from . import SecretsManager logger = Logger() @@ -12,32 +16,52 @@ # credentials of GSM and GitHub secrets should be shared via shell environment - -def main() -> int: - if len(sys.argv) != 2: - return logger.error("uses one script argument only: ") - +@click.group() +@click.argument("connector_name") +@click.option("--gcp-gsm-credentials", envvar="GCP_GSM_CREDENTIALS") +@click.pass_context +def ci_credentials(ctx, connector_name: str, gcp_gsm_credentials): + ctx.ensure_object(dict) + ctx.obj["connector_name"] = connector_name # parse unique connector name, because it can have the common prefix "connectors/" - connector_name = sys.argv[1].split("/")[-1] + connector_name = connector_name.split("/")[-1] if connector_name == "all": # if needed to load all secrets connector_name = None # parse GCP_GSM_CREDENTIALS try: - gsm_credentials = json.loads(os.getenv(ENV_GCP_GSM_CREDENTIALS) or "{}") + gsm_credentials = json.loads(gcp_gsm_credentials) if gcp_gsm_credentials else {} except JSONDecodeError as e: return logger.error(f"incorrect GCP_GSM_CREDENTIALS value, error: {e}") if not gsm_credentials: return logger.error("GCP_GSM_CREDENTIALS shouldn't be empty!") - loader = SecretsLoader( + secret_manager = SecretsManager( connector_name=connector_name, gsm_credentials=gsm_credentials, ) - return loader.write_to_storage(loader.read_from_gsm()) + ctx.obj["secret_manager"] = secret_manager + ctx.obj["connector_secrets"] = secret_manager.read_from_gsm() + + +@ci_credentials.command(help="Download GSM secrets locally to the connector's secrets directory.") +@click.pass_context +def write_to_storage(ctx): + written_files = ctx.obj["secret_manager"].write_to_storage(ctx.obj["connector_secrets"]) + written_files_count = len(written_files) + click.echo(f"{written_files_count} secret files were written: {','.join([str(path) for path in written_files])}") + + +@ci_credentials.command(help="Update GSM secrets according to the content of the secrets/updated_configurations directory.") +@click.pass_context +def update_secrets(ctx): + new_remote_secrets = ctx.obj["secret_manager"].update_secrets(ctx.obj["connector_secrets"]) + updated_secret_names = [secret.name for secret in new_remote_secrets] + updated_secrets_count = len(new_remote_secrets) + click.echo(f"Updated {updated_secrets_count} secrets: {','.join(updated_secret_names)}") -if __name__ == '__main__': - sys.exit(main()) +if __name__ == "__main__": + sys.exit(ci_credentials(obj={})) diff --git a/tools/ci_credentials/ci_credentials/models.py b/tools/ci_credentials/ci_credentials/models.py new file mode 100644 index 000000000000..4955740efe34 --- /dev/null +++ b/tools/ci_credentials/ci_credentials/models.py @@ -0,0 +1,56 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +from __future__ import ( # Used to evaluate type hints at runtime, a NameError: name 'RemoteSecret' is not defined is thrown otherwise + annotations, +) + +from dataclasses import dataclass + +DEFAULT_SECRET_FILE = "config" + + +@dataclass +class Secret: + connector_name: str + configuration_file_name: str + value: str + + @property + def name(self) -> str: + return self.generate_secret_name(self.connector_name, self.configuration_file_name) + + @staticmethod + def generate_secret_name(connector_name: str, configuration_file_name: str) -> str: + """ + Generates an unique GSM secret name. + Format of secret name: SECRET____CREDS + Examples: + 1. connector_name: source-linnworks, filename: dsdssds_a-b---_---_config.json + => SECRET_SOURCE-LINNWORKS_DSDSSDS_A-B__CREDS + 2. connector_name: source-s3, filename: config.json + => SECRET_SOURCE-LINNWORKS__CREDS + """ + name_parts = ["secret", connector_name] + filename_wo_ext = configuration_file_name.replace(".json", "") + if filename_wo_ext != DEFAULT_SECRET_FILE: + name_parts.append(filename_wo_ext.replace(DEFAULT_SECRET_FILE, "").strip("_-")) + name_parts.append("_creds") + return "_".join(name_parts).upper() + + @property + def directory(self) -> str: + if self.connector_name == "base-normalization": + return f"airbyte-integrations/bases/{self.connector_name}/secrets" + else: + return f"airbyte-integrations/connectors/{self.connector_name}/secrets" + + +@dataclass +class RemoteSecret(Secret): + enabled_version: str + + @classmethod + def from_secret(cls, secret: Secret, enabled_version: str) -> RemoteSecret: + return RemoteSecret(secret.connector_name, secret.configuration_file_name, secret.value, enabled_version) diff --git a/tools/ci_credentials/ci_credentials/secrets_loader.py b/tools/ci_credentials/ci_credentials/secrets_manager.py similarity index 52% rename from tools/ci_credentials/ci_credentials/secrets_loader.py rename to tools/ci_credentials/ci_credentials/secrets_manager.py index 60979c96b1be..4f164d5bfd0b 100644 --- a/tools/ci_credentials/ci_credentials/secrets_loader.py +++ b/tools/ci_credentials/ci_credentials/secrets_manager.py @@ -5,13 +5,15 @@ import json import os import re +from glob import glob from json.decoder import JSONDecodeError from pathlib import Path -from typing import Any, ClassVar, Mapping, Tuple +from typing import Any, ClassVar, List, Mapping from ci_common_utils import GoogleApi, Logger -DEFAULT_SECRET_FILE = "config" +from .models import DEFAULT_SECRET_FILE, RemoteSecret, Secret + DEFAULT_SECRET_FILE_WITH_EXT = DEFAULT_SECRET_FILE + ".json" GSM_SCOPES = ("https://www.googleapis.com/auth/cloud-platform",) @@ -43,8 +45,8 @@ ] -class SecretsLoader: - """Loading and saving all requested secrets into connector folders""" +class SecretsManager: + """Loading, saving and updating all requested secrets into connector folders""" logger: ClassVar[Logger] = Logger() if os.getenv("VERSION") == "dev": @@ -63,9 +65,9 @@ def api(self) -> GoogleApi: self._api = GoogleApi(self.gsm_credentials, GSM_SCOPES) return self._api - def __load_gsm_secrets(self) -> Mapping[Tuple[str, str], str]: + def __load_gsm_secrets(self) -> List[RemoteSecret]: """Loads needed GSM secrets""" - secrets = {} + secrets = [] # docs: https://cloud.google.com/secret-manager/docs/filtering#api filter = "name:SECRET_" if self.connector_name: @@ -105,8 +107,8 @@ def __load_gsm_secrets(self) -> Mapping[Tuple[str, str], str]: enabled_versions = [version["name"] for version in data["versions"] if version["state"] == "ENABLED"] if len(enabled_versions) > 1: self.logger.critical(f"{log_name} should have one enabled version at the same time!!!") - - secret_url = f"https://secretmanager.googleapis.com/v1/{enabled_versions[0]}:access" + enabled_version = enabled_versions[0] + secret_url = f"https://secretmanager.googleapis.com/v1/{enabled_version}:access" data = self.api.get(secret_url) secret_value = data.get("payload", {}).get("data") if not secret_value: @@ -121,7 +123,8 @@ def __load_gsm_secrets(self) -> Mapping[Tuple[str, str], str]: except JSONDecodeError as err: self.logger.error(f"{log_name} has non-JSON value!!! Error: {err}") continue - secrets[(connector_name, filename)] = secret_value + remote_secret = RemoteSecret(connector_name, filename, secret_value, enabled_version) + secrets.append(remote_secret) next_token = data.get("nextPageToken") if not next_token: @@ -160,82 +163,113 @@ def mask_secrets_from_action_log(self, key, value): # carry on pass - @staticmethod - def generate_secret_name(connector_name: str, filename: str) -> str: - """ - Generates an unique GSM secret name. - Format of secret name: SECRET____CREDS - Examples: - 1. connector_name: source-linnworks, filename: dsdssds_a-b---_---_config.json - => SECRET_SOURCE-LINNWORKS_DSDSSDS_A-B__CREDS - 2. connector_name: source-s3, filename: config.json - => SECRET_SOURCE-LINNWORKS__CREDS - """ - name_parts = ["secret", connector_name] - filename_wo_ext = filename.replace(".json", "") - if filename_wo_ext != DEFAULT_SECRET_FILE: - name_parts.append(filename_wo_ext.replace(DEFAULT_SECRET_FILE, "").strip("_-")) - name_parts.append("_creds") - return "_".join(name_parts).upper() - - def create_secret(self, connector_name: str, filename: str, secret_value: str) -> bool: - """ - Creates a new GSM secret with auto-generated name. - """ - secret_name = self.generate_secret_name(connector_name, filename) - self.logger.info(f"Generated the new secret name '{secret_name}' for {connector_name}({filename})") - params = { - "secretId": secret_name, - } - labels = { - "connector": connector_name, - } - if filename != DEFAULT_SECRET_FILE: - labels["filename"] = filename.replace(".json", "") - body = { - "labels": labels, - "replication": {"automatic": {}}, - } - url = f"https://secretmanager.googleapis.com/v1/projects/{self.api.project_id}/secrets" - data = self.api.post(url, json=body, params=params) - - # try to create a new version - secret_name = data["name"] - self.logger.info(f"the GSM secret {secret_name} was created") - secret_url = f"https://secretmanager.googleapis.com/v1/{secret_name}:addVersion" - body = {"payload": {"data": base64.b64encode(secret_value.encode()).decode("utf-8")}} - self.api.post(secret_url, json=body) - return True - - def read_from_gsm(self) -> int: + def read_from_gsm(self) -> List[RemoteSecret]: """Reads all necessary secrets from different sources""" secrets = self.__load_gsm_secrets() - - for k in secrets: - if not isinstance(secrets[k], tuple): - secrets[k] = ("GSM", secrets[k]) - source, _ = secrets[k] - self.logger.info(f"Register the file {k[1]}({k[0]}) from {source}") - if not len(secrets): self.logger.warning(f"not found any secrets of the connector '{self.connector_name}'") - return {} - return {k: v[1] for k, v in secrets.items()} + return [] + return secrets - def write_to_storage(self, secrets: Mapping[Tuple[str, str], str]) -> int: - """Tries to save target secrets to the airbyte-integrations/connectors|bases/{connector_name}/secrets folder""" + def write_to_storage(self, secrets: List[RemoteSecret]) -> List[Path]: + """Save target secrets to the airbyte-integrations/connectors|bases/{connector_name}/secrets folder + + Args: + secrets (List[RemoteSecret]): List of remote secret to write locally + + Returns: + List[Path]: List of paths were the secrets were written + """ + written_files = [] if not secrets: return 0 - for (connector_name, filename), secret_value in secrets.items(): - if connector_name == "base-normalization": - secrets_dir = f"airbyte-integrations/bases/{connector_name}/secrets" - else: - secrets_dir = f"airbyte-integrations/connectors/{connector_name}/secrets" - - secrets_dir = self.base_folder / secrets_dir + for secret in secrets: + secrets_dir = self.base_folder / secret.directory secrets_dir.mkdir(parents=True, exist_ok=True) - filepath = secrets_dir / filename + filepath = secrets_dir / secret.configuration_file_name with open(filepath, "w") as file: - file.write(secret_value) - self.logger.info(f"The file {filepath} was saved") - return 0 + file.write(secret.value) + written_files.append(filepath) + return written_files + + def _create_new_secret_version(self, new_secret: Secret, old_secret: RemoteSecret) -> RemoteSecret: + """Create a new secret version from a new secret instance. Disable the previous secret version. + + Args: + new_secret (Secret): The new secret instance + old_secret (RemoteSecret): The old secret instance + + Returns: + RemoteSecret: The newly created remote secret instance + """ + secret_url = f"https://secretmanager.googleapis.com/v1/projects/{self.api.project_id}/secrets/{new_secret.name}:addVersion" + body = {"payload": {"data": base64.b64encode(new_secret.value.encode()).decode("utf-8")}} + new_version_response = self.api.post(secret_url, json=body) + self._disable_version(old_secret.enabled_version) + return RemoteSecret.from_secret(new_secret, enabled_version=new_version_response["name"]) + + def _disable_version(self, version_name: str) -> dict: + """Disable a GSM secret version + + Args: + version_name (str): Full name of the version (containing project id and secret name) + + Returns: + dict: API response + """ + disable_version_url = f"https://secretmanager.googleapis.com/v1/{version_name}:disable" + return self.api.post(disable_version_url) + + def _get_updated_secrets(self) -> List[Secret]: + """Find locally updated configurations files and return the most recent instance for each configuration file name. + + Returns: + List[Secret]: List of Secret instances parsed from local updated configuration files + """ + updated_configurations_glob = ( + f"{str(self.base_folder)}/airbyte-integrations/connectors/{self.connector_name}/secrets/updated_configurations/*.json" + ) + updated_configuration_files_versions = {} + for updated_configuration_path in glob(updated_configurations_glob): + updated_configuration_path = Path(updated_configuration_path) + with open(updated_configuration_path, "r") as updated_configuration: + updated_configuration_value = json.load(updated_configuration) + configuration_original_file_name = f"{updated_configuration_path.stem.split('|')[0]}{updated_configuration_path.suffix}" + updated_configuration_files_versions.setdefault(configuration_original_file_name, []) + updated_configuration_files_versions[configuration_original_file_name].append( + (updated_configuration_value, os.path.getctime(str(updated_configuration_path))) + ) + + for updated_configurations in updated_configuration_files_versions.values(): + updated_configurations.sort(key=lambda x: x[1]) + return [ + Secret( + connector_name=self.connector_name, + configuration_file_name=configuration_file_name, + value=json.dumps(versions_by_creation_time[-1][0]), + ) + for configuration_file_name, versions_by_creation_time in updated_configuration_files_versions.items() + ] + + def update_secrets(self, existing_secrets: List[RemoteSecret]) -> List[RemoteSecret]: + """Update existing secrets if an updated version was found locally. + + Args: + existing_secrets (List[RemoteSecret]): List of existing secrets for the current connector on GSM. + + Returns: + List[RemoteSecret]: List of updated secrets as RemoteSecret instances + """ + existing_secrets = {secret.name: secret for secret in existing_secrets} + updated_secrets = {secret.name: secret for secret in self._get_updated_secrets()} + new_remote_secrets = [] + for existing_secret_name in existing_secrets: + if existing_secret_name in updated_secrets and json.loads(updated_secrets[existing_secret_name].value) != json.loads( + existing_secrets[existing_secret_name].value + ): + new_secret = updated_secrets[existing_secret_name] + old_secret = existing_secrets[existing_secret_name] + new_remote_secret = self._create_new_secret_version(new_secret, old_secret) + new_remote_secrets.append(new_remote_secret) + self.logger.info(f"Updated {new_remote_secret.name} with new value") + return new_remote_secrets diff --git a/tools/ci_credentials/setup.py b/tools/ci_credentials/setup.py index 2c06e0a3cbbf..538e79b565fd 100644 --- a/tools/ci_credentials/setup.py +++ b/tools/ci_credentials/setup.py @@ -1,18 +1,18 @@ # -# Copyright (c) 2021 Airbyte, Inc., all rights reserved. +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. # from setuptools import find_packages, setup -MAIN_REQUIREMENTS = ["requests", "ci_common_utils"] +MAIN_REQUIREMENTS = ["requests", "ci_common_utils", "click~=8.1.3"] -TEST_REQUIREMENTS = ["requests-mock"] +TEST_REQUIREMENTS = ["requests-mock", "pytest"] setup( - version="0.0.0", + version="1.0.0", name="ci_credentials", - description="Load and extract CI secrets for test suites", + description="CLI tooling to read and manage GSM secrets", author="Airbyte", author_email="contact@airbyte.io", packages=find_packages(), @@ -23,7 +23,7 @@ }, entry_points={ "console_scripts": [ - "ci_credentials = ci_credentials.main:main", + "ci_credentials = ci_credentials.main:ci_credentials", ], }, ) diff --git a/tools/ci_credentials/tests/test_models.py b/tools/ci_credentials/tests/test_models.py new file mode 100644 index 000000000000..178f3c5e2bd0 --- /dev/null +++ b/tools/ci_credentials/tests/test_models.py @@ -0,0 +1,47 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# +import pytest +from ci_credentials.models import Secret + + +@pytest.mark.parametrize( + "connector_name,filename,expected_name, expected_directory", + ( + ("source-default", "config.json", "SECRET_SOURCE-DEFAULT__CREDS", "airbyte-integrations/connectors/source-default/secrets"), + ( + "source-custom-filename-1", + "config_custom.json", + "SECRET_SOURCE-CUSTOM-FILENAME-1_CUSTOM__CREDS", + "airbyte-integrations/connectors/source-custom-filename-1/secrets", + ), + ( + "source-custom-filename-2", + "auth.json", + "SECRET_SOURCE-CUSTOM-FILENAME-2_AUTH__CREDS", + "airbyte-integrations/connectors/source-custom-filename-2/secrets", + ), + ( + "source-custom-filename-3", + "config_auth-test---___---config.json", + "SECRET_SOURCE-CUSTOM-FILENAME-3_AUTH-TEST__CREDS", + "airbyte-integrations/connectors/source-custom-filename-3/secrets", + ), + ( + "source-custom-filename-4", + "_____config_test---config.json", + "SECRET_SOURCE-CUSTOM-FILENAME-4_TEST__CREDS", + "airbyte-integrations/connectors/source-custom-filename-4/secrets", + ), + ( + "base-normalization", + "_____config_test---config.json", + "SECRET_BASE-NORMALIZATION_TEST__CREDS", + "airbyte-integrations/bases/base-normalization/secrets", + ), + ), +) +def test_secret_instantiation(connector_name, filename, expected_name, expected_directory): + secret = Secret(connector_name, filename, "secret_value") + assert secret.name == expected_name + assert secret.directory == expected_directory diff --git a/tools/ci_credentials/tests/test_secrets.py b/tools/ci_credentials/tests/test_secrets.py deleted file mode 100644 index 84173c1df5f9..000000000000 --- a/tools/ci_credentials/tests/test_secrets.py +++ /dev/null @@ -1,182 +0,0 @@ -import base64 -import json -import re -import shutil -import tempfile -from pathlib import Path -from unittest.mock import patch - -import pytest -import requests_mock -from ci_credentials.main import ENV_GCP_GSM_CREDENTIALS -from ci_credentials.main import main - -from ci_credentials import SecretsLoader - -HERE = Path(__file__).resolve().parent -TEST_CONNECTOR_NAME = "source-test" -TEMP_FOLDER = Path(tempfile.mkdtemp()) - - -@pytest.fixture(autouse=True, scope="session") -def temp_folder(): - yield - shutil.rmtree(TEMP_FOLDER) - - -@pytest.mark.parametrize( - "connector_name,filename,expected_name", - ( - ("source-default", "config.json", "SECRET_SOURCE-DEFAULT__CREDS"), - ("source-custom-filename-1", "config_custom.json", "SECRET_SOURCE-CUSTOM-FILENAME-1_CUSTOM__CREDS"), - ("source-custom-filename-2", "auth.json", "SECRET_SOURCE-CUSTOM-FILENAME-2_AUTH__CREDS"), - ("source-custom-filename-3", "config_auth-test---___---config.json", - "SECRET_SOURCE-CUSTOM-FILENAME-3_AUTH-TEST__CREDS"), - ("source-custom-filename-4", "_____config_test---config.json", - "SECRET_SOURCE-CUSTOM-FILENAME-4_TEST__CREDS"), - ) -) -def test_secret_name_generation(connector_name, filename, expected_name): - assert SecretsLoader.generate_secret_name(connector_name, filename) == expected_name - - -def read_last_log_message(capfd): - _, err = capfd.readouterr() - print(err) - return err.split("# ")[-1].strip() - - -def test_main(capfd, monkeypatch): - # without parameters and envs - monkeypatch.delenv(ENV_GCP_GSM_CREDENTIALS, raising=False) - monkeypatch.setattr("sys.argv", [None, TEST_CONNECTOR_NAME, "fake_arg"]) - assert main() == 1 - assert "one script argument only" in read_last_log_message(capfd) - - monkeypatch.setattr("sys.argv", [None, TEST_CONNECTOR_NAME]) - # without env values - assert main() == 1 - assert "shouldn't be empty" in read_last_log_message(capfd) - - # incorrect GCP_GSM_CREDENTIALS - monkeypatch.setenv(ENV_GCP_GSM_CREDENTIALS, "non-json") - assert main() == 1 - assert "incorrect GCP_GSM_CREDENTIALS value" in read_last_log_message(capfd) - - # empty GCP_GSM_CREDENTIALS - monkeypatch.setenv(ENV_GCP_GSM_CREDENTIALS, "{}") - assert main() == 1 - assert "GCP_GSM_CREDENTIALS shouldn't be empty!" in read_last_log_message(capfd) - - # successful result - monkeypatch.setenv(ENV_GCP_GSM_CREDENTIALS, '{"test": "test"}') - - monkeypatch.setattr(SecretsLoader, "read_from_gsm", lambda *args, **kwargs: {}) - monkeypatch.setattr(SecretsLoader, "write_to_storage", lambda *args, **kwargs: 0) - assert main() == 0 - - -@pytest.mark.parametrize( - "connector_name,gsm_secrets,expected_secrets", - ( - ( - "source-gsm-only", - { - "config": {"test_key": "test_value"}, - "config_oauth": {"test_key_1": "test_key_2"}, - }, - [ - ("config.json", {"test_key": "test_value"}), - ("config_oauth.json", {"test_key_1": "test_key_2"}), - ] - ), - ), - ids=["gsm_only", ] - -) -@patch('ci_common_utils.GoogleApi.get_access_token', lambda *args: ("fake_token", None)) -@patch('ci_common_utils.GoogleApi.project_id', "fake_id") -def test_read(connector_name, gsm_secrets, expected_secrets): - matcher_gsm_list = re.compile("https://secretmanager.googleapis.com/v1/projects/.+/secrets") - secrets_list = {"secrets": [{ - "name": f"projects//secrets/SECRET_{connector_name.upper()}_{i}_CREDS", - "labels": { - "filename": k, - "connector": connector_name, - } - } for i, k in enumerate(gsm_secrets)]} - - matcher_versions = re.compile("https://secretmanager.googleapis.com/v1/.+/versions") - versions_response_list = [{"json": { - "versions": [{ - "name": f"projects//secrets/SECRET_{connector_name.upper()}_{i}_CREDS/versions/1", - "state": "ENABLED", - }] - }} for i in range(len(gsm_secrets))] - - matcher_secret = re.compile("https://secretmanager.googleapis.com/v1/.+/1:access") - secrets_response_list = [{ - "json": {"payload": {"data": base64.b64encode(json.dumps(v).encode()).decode("utf-8")}} - } for v in gsm_secrets.values()] - - matcher_version = re.compile("https://secretmanager.googleapis.com/v1/.+:addVersion") - loader = SecretsLoader(connector_name=connector_name, gsm_credentials={}) - with requests_mock.Mocker() as m: - m.get(matcher_gsm_list, json=secrets_list) - m.post(matcher_gsm_list, json={"name": ""}) - m.post(matcher_version, json={}) - m.get(matcher_versions, versions_response_list) - m.get(matcher_secret, secrets_response_list) - - secrets = [(*k, v.replace(" ", "")) for k, v in loader.read_from_gsm().items()] - expected_secrets = [(connector_name, k[0], json.dumps(k[1]).replace(" ", "")) for k in expected_secrets] - # raise Exception("%s => %s" % (secrets, expected_secrets)) - # raise Exception(set(secrets).symmetric_difference(set(expected_secrets))) - assert not set(secrets).symmetric_difference(set(expected_secrets)) - - -@pytest.mark.parametrize( - "connector_name,secrets,expected_files", - ( - ("source-test", {"test.json": "test_value"}, - ["airbyte-integrations/connectors/source-test/secrets/test.json"]), - - ("source-test2", {"test.json": "test_value", "auth.json": "test_auth"}, - ["airbyte-integrations/connectors/source-test2/secrets/test.json", - "airbyte-integrations/connectors/source-test2/secrets/auth.json"]), - - ("base-normalization", {"test.json": "test_value", "auth.json": "test_auth"}, - ["airbyte-integrations/bases/base-normalization/secrets/test.json", - "airbyte-integrations/bases/base-normalization/secrets/auth.json"]), - ), - ids=["single", "multi", "base-normalization"], -) -def test_write(connector_name, secrets, expected_files): - loader = SecretsLoader(connector_name=connector_name, gsm_credentials={}) - loader.base_folder = TEMP_FOLDER - loader.write_to_storage({(connector_name, k): v for k, v in secrets.items()}) - for expected_file in expected_files: - target_file = TEMP_FOLDER / expected_file - assert target_file.exists() - has = False - for k, v in secrets.items(): - if target_file.name == k: - with open(target_file, "r") as f: - assert f.read() == v - has = True - break - assert has, f"incorrect file data: {target_file}" - - -@pytest.mark.parametrize( - "connector_name,dict_json_value,expected_secret", - ( - ("source-default", "{\"org_id\": 111}", "::add-mask::111"), - ("source-default", "{\"org\": 111}", ""), - ) -) -def test_validate_mask_values(connector_name, dict_json_value, expected_secret, capsys): - loader = SecretsLoader(connector_name=connector_name, gsm_credentials={}) - json_value = json.loads(dict_json_value) - loader.mask_secrets_from_action_log(None, json_value) - assert expected_secret in capsys.readouterr().out diff --git a/tools/ci_credentials/tests/test_secrets_manager.py b/tools/ci_credentials/tests/test_secrets_manager.py new file mode 100644 index 000000000000..c0239dd44d7f --- /dev/null +++ b/tools/ci_credentials/tests/test_secrets_manager.py @@ -0,0 +1,201 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# +import base64 +import json +import re +from unittest.mock import patch + +import pytest +import requests_mock +from ci_credentials import SecretsManager +from ci_credentials.models import RemoteSecret, Secret + + +@pytest.fixture +def matchers(): + return { + "secrets": re.compile("https://secretmanager.googleapis.com/v1/projects/.+/secrets"), + "versions": re.compile("https://secretmanager.googleapis.com/v1/.+/versions"), + "addVersion": re.compile("https://secretmanager.googleapis.com/v1/.+:addVersion"), + "access": re.compile("https://secretmanager.googleapis.com/v1/.+/1:access"), + "disable": re.compile("https://secretmanager.googleapis.com/v1/.+:disable"), + } + + +@pytest.mark.parametrize( + "connector_name,gsm_secrets,expected_secrets", + ( + ( + "source-gsm-only", + { + "config": {"test_key": "test_value"}, + "config_oauth": {"test_key_1": "test_key_2"}, + }, + [ + RemoteSecret( + "source-gsm-only", + "config.json", + '{"test_key":"test_value"}', + "projects//secrets/SECRET_SOURCE-GSM-ONLY_0_CREDS/versions/1", + ), + RemoteSecret( + "source-gsm-only", + "config_oauth.json", + '{"test_key_1":"test_key_2"}', + "projects//secrets/SECRET_SOURCE-GSM-ONLY_1_CREDS/versions/1", + ), + ], + ), + ), + ids=[ + "gsm_only", + ], +) +@patch("ci_common_utils.GoogleApi.get_access_token", lambda *args: ("fake_token", None)) +@patch("ci_common_utils.GoogleApi.project_id", "fake_id") +def test_read(matchers, connector_name, gsm_secrets, expected_secrets): + secrets_list = { + "secrets": [ + { + "name": f"projects//secrets/SECRET_{connector_name.upper()}_{i}_CREDS", + "labels": { + "filename": k, + "connector": connector_name, + }, + } + for i, k in enumerate(gsm_secrets) + ] + } + + versions_response_list = [ + { + "json": { + "versions": [ + { + "name": f"projects//secrets/SECRET_{connector_name.upper()}_{i}_CREDS/versions/1", + "state": "ENABLED", + } + ] + } + } + for i in range(len(gsm_secrets)) + ] + + secrets_response_list = [ + {"json": {"payload": {"data": base64.b64encode(json.dumps(v).encode()).decode("utf-8")}}} for v in gsm_secrets.values() + ] + + manager = SecretsManager(connector_name=connector_name, gsm_credentials={}) + with requests_mock.Mocker() as m: + m.get(matchers["secrets"], json=secrets_list) + m.post(matchers["secrets"], json={"name": ""}) + m.get(matchers["versions"], versions_response_list) + m.get(matchers["access"], secrets_response_list) + + secrets = manager.read_from_gsm() + assert secrets == expected_secrets + + +@pytest.mark.parametrize( + "connector_name,secrets,expected_files", + ( + ( + "source-test", + [Secret("source-test", "test_config.json", "test_value")], + ["airbyte-integrations/connectors/source-test/secrets/test_config.json"], + ), + ( + "source-test2", + [Secret("source-test2", "test.json", "test_value"), Secret("source-test2", "auth.json", "test_auth")], + [ + "airbyte-integrations/connectors/source-test2/secrets/test.json", + "airbyte-integrations/connectors/source-test2/secrets/auth.json", + ], + ), + ( + "base-normalization", + [Secret("base-normalization", "test.json", "test_value"), Secret("base-normalization", "auth.json", "test_auth")], + [ + "airbyte-integrations/bases/base-normalization/secrets/test.json", + "airbyte-integrations/bases/base-normalization/secrets/auth.json", + ], + ), + ), +) +def test_write(tmp_path, connector_name, secrets, expected_files): + manager = SecretsManager(connector_name=connector_name, gsm_credentials={}) + manager.base_folder = tmp_path + written_files = manager.write_to_storage(secrets) + for expected_file in expected_files: + target_file = tmp_path / expected_file + assert target_file.exists() + assert target_file in written_files + has = False + for secret in secrets: + if target_file.name == secret.configuration_file_name: + with open(target_file, "r") as f: + assert f.read() == secret.value + has = True + break + assert has, f"incorrect file data: {target_file}" + + +@pytest.mark.parametrize( + "connector_name,dict_json_value,expected_secret", + ( + ("source-default", '{"org_id": 111}', "::add-mask::111"), + ("source-default", '{"org": 111}', ""), + ), +) +def test_validate_mask_values(connector_name, dict_json_value, expected_secret, capsys): + manager = SecretsManager(connector_name=connector_name, gsm_credentials={}) + json_value = json.loads(dict_json_value) + manager.mask_secrets_from_action_log(None, json_value) + assert expected_secret in capsys.readouterr().out + + +@patch("ci_common_utils.GoogleApi.get_access_token", lambda *args: ("fake_token", None)) +@patch("ci_common_utils.GoogleApi.project_id", "fake_id") +@pytest.mark.parametrize( + "old_secret_value, updated_configurations", + [ + (json.dumps({"key": "value"}), [json.dumps({"key": "new_value_1"}), json.dumps({"key": "new_value_2"})]), + (json.dumps({"key": "value"}), [json.dumps({"key": "value"})]), + ], +) +def test_update_secrets(tmp_path, matchers, old_secret_value, updated_configurations): + existing_secret = RemoteSecret("source-test", "config.json", old_secret_value, "previous_version") + existing_secrets = [existing_secret] + + manager = SecretsManager(connector_name="source-test", gsm_credentials={}) + manager.base_folder = tmp_path + updated_configuration_directory = tmp_path / "airbyte-integrations/connectors/source-test/secrets/updated_configurations" + updated_configuration_directory.mkdir(parents=True) + + for i, updated_configuration in enumerate(updated_configurations): + stem, ext = existing_secret.configuration_file_name.split(".") + updated_configuration_file_name = f"{stem}|{i}.{ext}" + updated_configuration_path = updated_configuration_directory / updated_configuration_file_name + with open(updated_configuration_path, "w") as f: + f.write(updated_configuration) + + with requests_mock.Mocker() as m: + add_version_adapter = m.post(matchers["addVersion"], json={"name": "new_version"}) + disable_version_adapter = m.post(matchers["disable"], json={}) + updated_secrets = manager.update_secrets(existing_secrets) + + if old_secret_value != updated_configurations[-1]: + # We confirm the new version was created from the latest updated_configuration value + for secret in updated_secrets: + assert secret.connector_name == "source-test" + assert secret.configuration_file_name == "config.json" + assert secret.value == updated_configurations[-1] + assert secret.enabled_version == "new_version" + expected_add_version_payload = {"payload": {"data": base64.b64encode(updated_configurations[-1].encode()).decode("utf-8")}} + assert add_version_adapter.last_request.json() == expected_add_version_payload + assert disable_version_adapter.called_once + else: + assert not updated_secrets + assert not add_version_adapter.called + assert not disable_version_adapter.called diff --git a/tools/gradle/pmd/rules.xml b/tools/gradle/pmd/rules.xml index 982518c448f5..f6d7e883d19f 100644 --- a/tools/gradle/pmd/rules.xml +++ b/tools/gradle/pmd/rules.xml @@ -107,7 +107,6 @@ -