diff --git a/airbyte-integrations/connectors/source-front/README.md b/airbyte-integrations/connectors/source-front/README.md new file mode 100644 index 000000000000..f7e1ef1b9b18 --- /dev/null +++ b/airbyte-integrations/connectors/source-front/README.md @@ -0,0 +1,38 @@ +# Front +This directory contains the manifest-only connector for `source-front`. + +## Documentation reference: +Visit `https://dev.frontapp.com/reference/introduction` for API documentation + +## Authentication setup +`Source-front` uses bearer token authentication, +Visit `https://dev.frontapp.com/docs/create-and-revoke-api-tokens` for getting your API token. + +## Usage +There are multiple ways to use this connector: +- You can use this connector as any other connector in Airbyte Marketplace. +- You can load this connector in `pyairbyte` using `get_source`! +- You can open this connector in Connector Builder, edit it, and publish to your workspaces. + +Please refer to the manifest-only connector documentation for more details. + +## Local Development +We recommend you use the Connector Builder to edit this connector. + +But, if you want to develop this connector locally, you can use the following steps. + +### Environment Setup +You will need `airbyte-ci` installed. You can find the documentation [here](airbyte-ci). + +### Build +This will create a dev image (`source-front:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-front build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-front test +``` + diff --git a/airbyte-integrations/connectors/source-front/acceptance-test-config.yml b/airbyte-integrations/connectors/source-front/acceptance-test-config.yml new file mode 100644 index 000000000000..d780e158caa7 --- /dev/null +++ b/airbyte-integrations/connectors/source-front/acceptance-test-config.yml @@ -0,0 +1,17 @@ +# See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) +# for more information about how to configure these tests +connector_image: airbyte/source-front:dev +acceptance_tests: + spec: + tests: + - spec_path: "manifest.yaml" + connection: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + discovery: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + basic_read: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + incremental: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" + full_refresh: + bypass_reason: "This is a builder contribution, and we do not have secrets at this time" diff --git a/airbyte-integrations/connectors/source-front/icon.svg b/airbyte-integrations/connectors/source-front/icon.svg new file mode 100644 index 000000000000..b554c4c09911 --- /dev/null +++ b/airbyte-integrations/connectors/source-front/icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/airbyte-integrations/connectors/source-front/manifest.yaml b/airbyte-integrations/connectors/source-front/manifest.yaml new file mode 100644 index 000000000000..6d0a516dcd8a --- /dev/null +++ b/airbyte-integrations/connectors/source-front/manifest.yaml @@ -0,0 +1,6141 @@ +version: 4.6.2 + +type: DeclarativeSource + +description: |- + Website: https://app.frontapp.com/ + Auth page: https://dev.frontapp.com/docs/create-and-revoke-api-tokens + API Docs: https://dev.frontapp.com/reference/introduction + +check: + type: CheckStream + stream_names: + - accounts + +definitions: + streams: + events: + type: DeclarativeStream + name: events + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: events + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: emitted_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/events" + inboxes: + type: DeclarativeStream + name: inboxes + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: inboxes + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/inboxes" + inboxes_channels: + type: DeclarativeStream + name: inboxes_channels + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: inboxes/{{ stream_partition.inbox_id }}/channels + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: inbox_id + stream: + $ref: "#/definitions/streams/inboxes" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/inboxes_channels" + inboxes_conversations: + type: DeclarativeStream + name: inboxes_conversations + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: inboxes/{{ stream_partition.inbox_id }}/conversations + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: inbox_id + stream: + $ref: "#/definitions/streams/inboxes" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%ms" + - "%s" + datetime_format: "%ms" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/inboxes_conversations" + inboxes_teammates: + type: DeclarativeStream + name: inboxes_teammates + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: inboxes/{{ stream_partition.inbox_id }}/teammates + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: inbox_id + stream: + $ref: "#/definitions/streams/inboxes" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/inboxes_teammates" + conversations: + type: DeclarativeStream + name: conversations + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%ms" + - "%s" + datetime_format: "%ms" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations" + conversations_events: + type: DeclarativeStream + name: conversations_events + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/{{ stream_partition.conversation_id }}/events + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: conversation_id + stream: + $ref: "#/definitions/streams/conversations" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: emitted_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations_events" + conversations_followers: + type: DeclarativeStream + name: conversations_followers + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/{{ stream_partition.conversation_id }}/followers + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: conversation_id + stream: + $ref: "#/definitions/streams/conversations" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations_followers" + conversations_inboxes: + type: DeclarativeStream + name: conversations_inboxes + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/{{ stream_partition.conversation_id }}/inboxes + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: conversation_id + stream: + $ref: "#/definitions/streams/conversations" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations_inboxes" + conversations_messages: + type: DeclarativeStream + name: conversations_messages + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/{{ stream_partition.conversation_id }}/messages + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: conversation_id + stream: + $ref: "#/definitions/streams/conversations" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%ms" + - "%s" + datetime_format: "%ms" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations_messages" + links: + type: DeclarativeStream + name: links + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: links + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/links" + accounts: + type: DeclarativeStream + name: accounts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: accounts + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/accounts" + accounts_contacts: + type: DeclarativeStream + name: accounts_contacts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: accounts/{{ stream_partition.account_id }}/contacts + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: account_id + stream: + $ref: "#/definitions/streams/accounts" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/accounts_contacts" + contacts: + type: DeclarativeStream + name: contacts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: contacts + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contacts" + channels: + type: DeclarativeStream + name: channels + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: channels + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channels" + company_tags: + type: DeclarativeStream + name: company_tags + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: company/tags + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: teammate_id + stream: + $ref: "#/definitions/streams/teammates" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/company_tags" + teammates: + type: DeclarativeStream + name: teammates + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teammates + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teammates" + tags: + type: DeclarativeStream + name: tags + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: tags + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/tags" + tags_children: + type: DeclarativeStream + name: tags_children + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: tags/{{ stream_partition.tag_id }}/children + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: tag_id + stream: + $ref: "#/definitions/streams/tags" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/tags_children" + teammates_tags: + type: DeclarativeStream + name: teammates_tags + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teammates/{{ stream_partition.teammate_id }}/tags + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: teammate_id + stream: + $ref: "#/definitions/streams/teammates" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teammates_tags" + teams: + type: DeclarativeStream + name: teams + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams" + teams_tags: + type: DeclarativeStream + name: teams_tags + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams/{{ stream_partition.team_id }}/tags + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: team_id + stream: + $ref: "#/definitions/streams/teams" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams_tags" + contact_groups: + type: DeclarativeStream + name: contact_groups + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: contact_groups + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contact_groups" + conversations_drafts: + type: DeclarativeStream + name: conversations_drafts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/{{ stream_partition.conversation_id }}/drafts + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: conversation_id + stream: + $ref: "#/definitions/streams/conversations" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations_drafts" + contacts_notes: + type: DeclarativeStream + name: contacts_notes + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: contacts/{{ stream_partition.contact_id }}/notes + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: contact_id + stream: + $ref: "#/definitions/streams/contacts" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contacts_notes" + teammates_contact_groups: + type: DeclarativeStream + name: teammates_contact_groups + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teammates/{{ stream_partition.teammate_id }}/contact_groups + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: teammate_id + stream: + $ref: "#/definitions/streams/teammates" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teammates_contact_groups" + teams_contact_groups: + type: DeclarativeStream + name: teams_contact_groups + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams/{{ stream_partition.team_id }}/contact_groups + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: team_id + stream: + $ref: "#/definitions/streams/teams" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams_contact_groups" + knowledge_bases: + type: DeclarativeStream + name: knowledge_bases + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: knowledge_bases + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/knowledge_bases" + knowledge_bases_articles: + type: DeclarativeStream + name: knowledge_bases_articles + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: knowledge_bases/{{ stream_partition.knowledge_base_id }}/articles + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: knowledge_base_id + stream: + $ref: "#/definitions/streams/knowledge_bases" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/knowledge_bases_articles" + knowledge_bases_categories: + type: DeclarativeStream + name: knowledge_bases_categories + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: knowledge_bases/{{ stream_partition.knowledge_base_id }}/categories + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: knowledge_base_id + stream: + $ref: "#/definitions/streams/knowledge_bases" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/knowledge_bases_categories" + message_template_folders: + type: DeclarativeStream + name: message_template_folders + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: message_template_folders + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/message_template_folders" + teams_signatures: + type: DeclarativeStream + name: teams_signatures + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams/{{ stream_partition.team_id }}/signatures + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: team_id + stream: + $ref: "#/definitions/streams/teams" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams_signatures" + message_templates: + type: DeclarativeStream + name: message_templates + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: message_templates + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/message_templates" + teammates_message_templates: + type: DeclarativeStream + name: teammates_message_templates + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teammates/{{ stream_partition.teammate_id }}/message_templates + http_method: GET + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: teammate_id + stream: + $ref: "#/definitions/streams/teammates" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teammates_message_templates" + teams_message_templates: + type: DeclarativeStream + name: teams_message_templates + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams/{{ stream_partition.team_id }}/message_templates + http_method: GET + request_parameters: + limit: "{{ config['page_limit'] }}" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + max_retries: 3 + backoff_strategies: + - type: ExponentialBackoffStrategy + factor: 2 + response_filters: + - type: HttpResponseFilter + action: RATE_LIMITED + http_codes: + - 429 + error_message: Rate limit hit + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - _results + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: '{{ response.get("_pagination", {}).get("next", {}) }}' + stop_condition: "{{ not response.get('_pagination', {}).get('next') }}" + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: team_id + stream: + $ref: "#/definitions/streams/teams" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams_message_templates" + base_requester: + type: HttpRequester + url_base: https://api2.frontapp.com/ + authenticator: + type: BearerAuthenticator + api_token: '{{ config["api_key"] }}' + +streams: + - $ref: "#/definitions/streams/events" + - $ref: "#/definitions/streams/inboxes" + - $ref: "#/definitions/streams/inboxes_channels" + - $ref: "#/definitions/streams/inboxes_conversations" + - $ref: "#/definitions/streams/inboxes_teammates" + - $ref: "#/definitions/streams/conversations" + - $ref: "#/definitions/streams/conversations_events" + - $ref: "#/definitions/streams/conversations_followers" + - $ref: "#/definitions/streams/conversations_inboxes" + - $ref: "#/definitions/streams/conversations_messages" + - $ref: "#/definitions/streams/links" + - $ref: "#/definitions/streams/accounts" + - $ref: "#/definitions/streams/accounts_contacts" + - $ref: "#/definitions/streams/contacts" + - $ref: "#/definitions/streams/channels" + - $ref: "#/definitions/streams/company_tags" + - $ref: "#/definitions/streams/teammates" + - $ref: "#/definitions/streams/tags" + - $ref: "#/definitions/streams/tags_children" + - $ref: "#/definitions/streams/teammates_tags" + - $ref: "#/definitions/streams/teams" + - $ref: "#/definitions/streams/teams_tags" + - $ref: "#/definitions/streams/contact_groups" + - $ref: "#/definitions/streams/conversations_drafts" + - $ref: "#/definitions/streams/contacts_notes" + - $ref: "#/definitions/streams/teammates_contact_groups" + - $ref: "#/definitions/streams/teams_contact_groups" + - $ref: "#/definitions/streams/knowledge_bases" + - $ref: "#/definitions/streams/knowledge_bases_articles" + - $ref: "#/definitions/streams/knowledge_bases_categories" + - $ref: "#/definitions/streams/message_template_folders" + - $ref: "#/definitions/streams/teams_signatures" + - $ref: "#/definitions/streams/message_templates" + - $ref: "#/definitions/streams/teammates_message_templates" + - $ref: "#/definitions/streams/teams_message_templates" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - api_key + - start_date + properties: + api_key: + type: string + title: API Key + airbyte_secret: true + order: 0 + start_date: + type: string + title: Start date + format: date-time + pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ + order: 1 + page_limit: + type: string + description: Page limit for the responses + title: Page limit + default: "50" + order: 2 + additionalProperties: true + +metadata: + autoImportSchema: + events: true + inboxes: true + inboxes_channels: true + inboxes_conversations: true + inboxes_teammates: true + conversations: true + conversations_events: true + conversations_followers: true + conversations_inboxes: true + conversations_messages: true + links: true + accounts: true + accounts_contacts: true + contacts: true + channels: true + company_tags: true + teammates: true + tags: true + tags_children: true + teammates_tags: true + teams: true + teams_tags: true + contact_groups: true + conversations_drafts: true + contacts_notes: true + teammates_contact_groups: true + teams_contact_groups: true + knowledge_bases: true + knowledge_bases_articles: true + knowledge_bases_categories: true + message_template_folders: true + teams_signatures: true + message_templates: true + teammates_message_templates: true + teams_message_templates: true + testedStreams: + events: + streamHash: 8763b24a8a4fab0ee36210fe4dea6df6704a58ad + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + inboxes: + streamHash: ccfafe04fab65a323c5f128f449015e3138932e8 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + inboxes_channels: + streamHash: 776006ec048015c5050bb4ba116d444fdd41f0a3 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + inboxes_conversations: + streamHash: 7f3768152ece70759ab54e87551029dac6554e9e + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + inboxes_teammates: + streamHash: 759d4aa9072b9a27a0c8f0a749dbd9ed3480d42f + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations: + streamHash: 3fe9feed03dd9e4f80add7d2023211adb3bbc731 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations_events: + streamHash: 9d38e704e3059709b92097df3bcecd1d46c42c55 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations_followers: + streamHash: 3f7c7abd4a90eb3ccbe9fe574d3e85d995e284bf + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations_inboxes: + streamHash: c04fac92a2a79f256e7fcddee9f0ac1ebe5ca72a + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations_messages: + streamHash: 4c9117b15f2e568d8a7fc964fc50eeb17c5a7d0e + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + links: + streamHash: 349ff49de35c11125591b0f5153f98bf62a84e8d + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + accounts: + streamHash: 6bfc980bc1097267f5d4a738bad844e028174436 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + accounts_contacts: + streamHash: 3314e83f63586e0ecc021e372a21339eb9e1708a + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contacts: + streamHash: 4b9188d48d7d3675fd70701cc13fa0974abbeaf3 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + channels: + streamHash: 7bce9c3212161c97afe70093b60b48c87b12cdf9 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + company_tags: + streamHash: c20a9a13efdf976b95d3d6786a56bf10257d8ef1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teammates: + streamHash: 80da0a398e42e31a10dae69ec8f034e65915a082 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + tags: + streamHash: ec297329b1fb74a54021e37ead7eca7e35f37fe7 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + tags_children: + streamHash: bb92b7d7bcfb19be47abb15916b44b18bd1a745d + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teammates_tags: + streamHash: b746adcba31f8842964b5388d911f50050eb4089 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams: + streamHash: ef84a17900406262094001a6c1e4157a639cb9b6 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams_tags: + streamHash: ab51090dff3c43d8708771fcf6b54dd4a524c976 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contact_groups: + streamHash: afe88d167d005fe56aa9cc567e959e44acbee34e + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations_drafts: + streamHash: f150684526dd62b12908cef47811b557a8c120ad + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contacts_notes: + streamHash: 2ea6410e6225b8b10b746cfbb9f3080ea4a3381d + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teammates_contact_groups: + streamHash: b95815402d33cf05192216d5029922c6878d5184 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams_contact_groups: + streamHash: 1fb134248abefda30e4f3a90d583b5fbe4f3d4a1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + knowledge_bases: + streamHash: 969d9bc06efb925b396134d4acb3329c834ad341 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + knowledge_bases_articles: + streamHash: 53782f24dcf75ceff43cde4f51678fa0edc2d77d + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + knowledge_bases_categories: + streamHash: 6752124f21596f2f347f2b7bcfcec6256cca7a47 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + message_template_folders: + streamHash: 21e43119af71f2d313786e94e014602f9d161ef9 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams_signatures: + streamHash: e52e4696f894fc4674b443c416fbf8e2796b6150 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + message_templates: + streamHash: 087a259777fdcf9ad6325035dd332e807ea739a1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teammates_message_templates: + streamHash: a41b9efbf0680193347303f2212d8592b984c6b2 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams_message_templates: + streamHash: 912c3b103e8d6a9d3f0cc05871a09b50e31c4cbf + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: {} + +schemas: + events: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + self: + type: + - string + - "null" + conversation: + type: + - object + - "null" + properties: + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + comments: + type: + - string + - "null" + events: + type: + - string + - "null" + followers: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + last_message: + type: + - string + - "null" + messages: + type: + - string + - "null" + self: + type: + - string + - "null" + assignee: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + recipient: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + scheduled_reminders: + type: + - array + - "null" + status: + type: + - string + - "null" + subject: + type: + - string + - "null" + tags: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + waiting_since: + type: + - number + - "null" + emitted_at: + type: number + id: + type: string + source: + type: + - object + - "null" + properties: + _meta: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + data: + anyOf: + - type: array + items: + type: object + properties: + type: + type: string + _links: + type: object + properties: + related: + type: object + properties: + channels: + type: string + conversations: + type: string + owner: + type: string + teammates: + type: string + self: + type: string + address: + type: string + custom_fields: + type: object + id: + type: string + is_private: + type: boolean + is_public: + type: boolean + name: + type: string + send_as: + type: string + - type: object + properties: + _links: + type: object + properties: + related: + type: object + properties: + conversations: + type: string + inboxes: + type: string + owner: + type: string + self: + type: string + actions: + type: array + items: + type: string + custom_fields: + type: object + email: + type: string + first_name: + type: string + id: + type: string + is_admin: + type: boolean + is_available: + type: boolean + is_blocked: + type: boolean + is_private: + type: boolean + last_name: + type: string + name: + type: string + username: + type: string + target: + type: + - object + - "null" + properties: + _meta: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + data: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversation: + type: + - string + - "null" + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + mentions: + type: + - string + - "null" + message_seen: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + author: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + blurb: + type: + - string + - "null" + body: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + is_draft: + type: + - boolean + - "null" + is_inbound: + type: + - boolean + - "null" + is_pinned: + type: + - boolean + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + name: + type: + - string + - "null" + posted_at: + type: + - number + - "null" + recipients: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + subject: + type: + - string + - "null" + text: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + username: + type: + - string + - "null" + required: + - id + - emitted_at + inboxes: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + channels: + type: + - string + - "null" + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + teammates: + type: + - string + - "null" + self: + type: + - string + - "null" + address: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_public: + type: + - boolean + - "null" + name: + type: + - string + - "null" + send_as: + type: + - string + - "null" + required: + - id + inboxes_channels: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + inbox: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + address: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_valid: + type: + - boolean + - "null" + name: + type: + - string + - "null" + send_as: + type: + - string + - "null" + settings: + type: + - object + - "null" + properties: + all_teammates_can_reply: + type: + - boolean + - "null" + undo_send_time: + type: + - number + - "null" + required: + - id + inboxes_conversations: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + comments: + type: + - string + - "null" + events: + type: + - string + - "null" + followers: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + last_message: + type: + - string + - "null" + messages: + type: + - string + - "null" + self: + type: + - string + - "null" + assignee: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + created_at: + type: number + custom_fields: + type: + - object + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + recipient: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: {} + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + scheduled_reminders: + type: + - array + - "null" + status: + type: + - string + - "null" + subject: + type: + - string + - "null" + tags: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + waiting_since: + type: + - number + - "null" + required: + - id + - created_at + inboxes_teammates: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: string + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + required: + - id + conversations: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + comments: + type: + - string + - "null" + events: + type: + - string + - "null" + followers: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + last_message: + type: + - string + - "null" + messages: + type: + - string + - "null" + self: + type: + - string + - "null" + assignee: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + created_at: + type: number + custom_fields: + type: + - object + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + recipient: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + scheduled_reminders: + type: + - array + - "null" + status: + type: + - string + - "null" + subject: + type: + - string + - "null" + tags: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + waiting_since: + type: + - number + - "null" + required: + - id + - created_at + conversations_events: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + self: + type: + - string + - "null" + conversation: + type: + - object + - "null" + properties: + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + comments: + type: + - string + - "null" + events: + type: + - string + - "null" + followers: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + last_message: + type: + - string + - "null" + messages: + type: + - string + - "null" + self: + type: + - string + - "null" + assignee: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + recipient: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + scheduled_reminders: + type: + - array + - "null" + status: + type: + - string + - "null" + subject: + type: + - string + - "null" + tags: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + waiting_since: + type: + - number + - "null" + emitted_at: + type: number + id: + type: string + source: + type: + - object + - "null" + properties: + _meta: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + data: + anyOf: + - type: object + properties: + _links: + type: object + properties: + related: + type: object + properties: + conversations: + type: string + inboxes: + type: string + owner: + type: string + self: + type: string + actions: + type: array + items: + type: string + custom_fields: + type: object + email: + type: string + first_name: + type: string + id: + type: string + is_admin: + type: boolean + is_available: + type: boolean + is_blocked: + type: boolean + is_private: + type: boolean + last_name: + type: string + name: + type: string + username: + type: string + - type: array + items: + type: object + properties: + type: + type: string + _links: + type: object + properties: + related: + type: object + properties: + channels: + type: string + conversations: + type: string + owner: + type: string + teammates: + type: string + self: + type: string + address: + type: string + custom_fields: + type: object + id: + type: string + is_private: + type: boolean + is_public: + type: boolean + name: + type: string + send_as: + type: string + target: + type: + - object + - "null" + properties: + _meta: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + data: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversation: + type: + - string + - "null" + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + mentions: + type: + - string + - "null" + message_seen: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + author: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + blurb: + type: + - string + - "null" + body: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + highlight: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + is_draft: + type: + - boolean + - "null" + is_inbound: + type: + - boolean + - "null" + is_pinned: + type: + - boolean + - "null" + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + name: + type: + - string + - "null" + posted_at: + type: + - number + - "null" + recipients: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + subject: + type: + - string + - "null" + text: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + username: + type: + - string + - "null" + required: + - id + - emitted_at + conversations_followers: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: string + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + required: + - id + conversations_inboxes: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + channels: + type: + - string + - "null" + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + teammates: + type: + - string + - "null" + self: + type: + - string + - "null" + address: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + is_public: + type: + - boolean + - "null" + name: + type: + - string + - "null" + send_as: + type: + - string + - "null" + conversations_messages: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversation: + type: + - string + - "null" + message_seen: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + author: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + blurb: + type: + - string + - "null" + body: + type: + - string + - "null" + created_at: + type: number + id: + type: string + is_draft: + type: + - boolean + - "null" + is_inbound: + type: + - boolean + - "null" + recipients: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contact: + type: + - string + - "null" + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + subject: + type: + - string + - "null" + text: + type: + - string + - "null" + required: + - id + - created_at + links: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + external_url: + type: + - string + - "null" + id: + type: string + name: + type: + - string + - "null" + required: + - id + accounts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contacts: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + domains: + type: + - array + - "null" + id: + type: string + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + accounts_contacts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + notes: + type: + - string + - "null" + self: + type: + - string + - "null" + account: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contacts: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + domains: + type: + - array + - "null" + id: + type: + - string + - "null" + name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + custom_fields: + type: + - object + - "null" + groups: + type: + - array + - "null" + handles: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + handle: + type: + - string + - "null" + source: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + contacts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + notes: + type: + - string + - "null" + self: + type: + - string + - "null" + avatar_url: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + groups: + type: + - array + - "null" + handles: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + handle: + type: + - string + - "null" + source: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + links: + type: + - array + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + channels: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + inbox: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + address: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_valid: + type: + - boolean + - "null" + name: + type: + - string + - "null" + send_as: + type: + - string + - "null" + settings: + type: + - object + - "null" + properties: + all_teammates_can_reply: + type: + - boolean + - "null" + undo_send_time: + type: + - number + - "null" + required: + - id + company_tags: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + teammates: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: string + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + required: + - id + tags: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + children: + type: + - string + - "null" + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + parent_tag: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + tags_children: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + parent_tag: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + teammates_tags: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + teams: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + self: + type: + - string + - "null" + id: + type: string + name: + type: + - string + - "null" + required: + - id + teams_tags: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + highlight: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + is_visible_in_conversation_lists: + type: + - boolean + - "null" + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + contact_groups: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contacts: + type: + - string + - "null" + self: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + name: + type: + - string + - "null" + required: + - id + conversations_drafts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + version: + type: + - string + - "null" + type: + type: + - string + - "null" + metadata: + type: + - object + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversation: + type: + - string + - "null" + message_replied_to: + type: + - string + - "null" + message_seen: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + author: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + blurb: + type: + - string + - "null" + body: + type: + - string + - "null" + created_at: + type: number + draft_mode: + type: + - string + - "null" + id: + type: string + is_draft: + type: + - boolean + - "null" + is_inbound: + type: + - boolean + - "null" + recipients: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: {} + handle: + type: + - string + - "null" + name: + type: + - string + - "null" + role: + type: + - string + - "null" + subject: + type: + - string + - "null" + text: + type: + - string + - "null" + required: + - id + - created_at + contacts_notes: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + author: + type: + - string + - "null" + author: + type: + - object + - "null" + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + conversations: + type: + - string + - "null" + inboxes: + type: + - string + - "null" + self: + type: + - string + - "null" + custom_fields: + type: + - object + - "null" + email: + type: + - string + - "null" + first_name: + type: + - string + - "null" + id: + type: + - string + - "null" + is_admin: + type: + - boolean + - "null" + is_available: + type: + - boolean + - "null" + is_blocked: + type: + - boolean + - "null" + last_name: + type: + - string + - "null" + username: + type: + - string + - "null" + body: + type: + - string + - "null" + created_at: + type: number + is_private: + type: + - boolean + - "null" + required: + - created_at + teammates_contact_groups: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contacts: + type: + - string + - "null" + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + id: + type: string + is_private: + type: + - boolean + - "null" + name: + type: + - string + - "null" + required: + - id + teams_contact_groups: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + contacts: + type: + - string + - "null" + self: + type: + - string + - "null" + id: + type: + - string + - "null" + is_private: + type: + - boolean + - "null" + name: + type: + - string + - "null" + knowledge_bases: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + articles: + type: + - string + - "null" + categories: + type: + - string + - "null" + content: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: string + locales: + type: + - array + - "null" + items: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + knowledge_bases_articles: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + content: + type: + - string + - "null" + knowledge_base: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: + - string + - "null" + locales: + type: + - array + - "null" + items: + type: + - string + - "null" + updated_at: + type: number + required: + - updated_at + knowledge_bases_categories: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + articles: + type: + - string + - "null" + content: + type: + - string + - "null" + knowledge_base: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: + - string + - "null" + is_hidden: + type: + - boolean + - "null" + locales: + type: + - array + - "null" + items: + type: + - string + - "null" + updated_at: + type: number + required: + - updated_at + message_template_folders: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + child_folders: + type: + - string + - "null" + owner: + type: + - string + - "null" + parent_folder: + type: + - string + - "null" + self: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: string + name: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + teams_signatures: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + body: + type: + - string + - "null" + id: + type: string + is_default: + type: + - boolean + - "null" + is_private: + type: + - boolean + - "null" + is_visible_for_all_teammate_channels: + type: + - boolean + - "null" + name: + type: + - string + - "null" + sender_info: + type: + - string + - "null" + required: + - id + message_templates: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + owner: + type: + - string + - "null" + parent_folder: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + body: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: string + is_available_for_all_inboxes: + type: + - boolean + - "null" + name: + type: + - string + - "null" + subject: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at + teammates_message_templates: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + owner: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + body: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: string + is_available_for_all_inboxes: + type: + - boolean + - "null" + name: + type: + - string + - "null" + subject: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + required: + - id + teams_message_templates: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + _links: + type: + - object + - "null" + properties: + related: + type: + - object + - "null" + properties: + owner: + type: + - string + - "null" + parent_folder: + type: + - string + - "null" + self: + type: + - string + - "null" + attachments: + type: + - array + - "null" + body: + type: + - string + - "null" + created_at: + type: + - number + - "null" + id: + type: string + is_available_for_all_inboxes: + type: + - boolean + - "null" + name: + type: + - string + - "null" + subject: + type: + - string + - "null" + updated_at: + type: number + required: + - id + - updated_at diff --git a/airbyte-integrations/connectors/source-front/metadata.yaml b/airbyte-integrations/connectors/source-front/metadata.yaml new file mode 100644 index 000000000000..8a3e291d9bd9 --- /dev/null +++ b/airbyte-integrations/connectors/source-front/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "api2.frontapp.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-front + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:4.6.2@sha256:f5fcd3d4703b7590b6166a7853c5ed1686731607cd30a159a8c24e2fe2c1ee98 + connectorSubtype: api + connectorType: source + definitionId: ae390de9-bdd5-4bfa-9d14-34010b44ca50 + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-front + githubIssueLabel: source-front + icon: icon.svg + license: MIT + name: Front + releaseDate: 2024-09-11 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/front + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/front.md b/docs/integrations/sources/front.md new file mode 100644 index 000000000000..34dbd0938563 --- /dev/null +++ b/docs/integrations/sources/front.md @@ -0,0 +1,67 @@ +# Front +This page contains the setup guide and reference information for the [Front](https://app.frontapp.com) source connector. + +## Documentation reference: +Visit `https://dev.frontapp.com/reference/introduction` for API documentation + +## Authentication setup +`Source-front` uses bearer token authentication, +Visit `https://dev.frontapp.com/docs/create-and-revoke-api-tokens` for getting your API token. + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `api_key` | `string` | API Key. | | +| `start_date` | `string` | Start date. | | +| `page_limit` | `string` | Page limit. Page limit for the responses | 50 | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| events | id | DefaultPaginator | ✅ | ✅ | +| inboxes | id | DefaultPaginator | ✅ | ❌ | +| inboxes_channels | id | DefaultPaginator | ✅ | ❌ | +| inboxes_conversations | id | DefaultPaginator | ✅ | ✅ | +| inboxes_teammates | id | DefaultPaginator | ✅ | ❌ | +| conversations | id | DefaultPaginator | ✅ | ✅ | +| conversations_events | id | DefaultPaginator | ✅ | ✅ | +| conversations_followers | id | DefaultPaginator | ✅ | ❌ | +| conversations_inboxes | | DefaultPaginator | ✅ | ❌ | +| conversations_messages | id | DefaultPaginator | ✅ | ✅ | +| links | id | DefaultPaginator | ✅ | ❌ | +| accounts | id | DefaultPaginator | ✅ | ✅ | +| accounts_contacts | id | DefaultPaginator | ✅ | ✅ | +| contacts | id | DefaultPaginator | ✅ | ✅ | +| channels | id | DefaultPaginator | ✅ | ❌ | +| company_tags | id | DefaultPaginator | ✅ | ✅ | +| teammates | id | DefaultPaginator | ✅ | ❌ | +| tags | id | DefaultPaginator | ✅ | ✅ | +| tags_children | id | DefaultPaginator | ✅ | ✅ | +| teammates_tags | id | DefaultPaginator | ✅ | ✅ | +| teams | id | DefaultPaginator | ✅ | ❌ | +| teams_tags | id | DefaultPaginator | ✅ | ✅ | +| contact_groups | id | DefaultPaginator | ✅ | ❌ | +| conversations_drafts | id | DefaultPaginator | ✅ | ✅ | +| contacts_notes | | DefaultPaginator | ✅ | ✅ | +| teammates_contact_groups | id | DefaultPaginator | ✅ | ❌ | +| teams_contact_groups | | DefaultPaginator | ✅ | ❌ | +| knowledge_bases | id | DefaultPaginator | ✅ | ✅ | +| knowledge_bases_articles | | DefaultPaginator | ✅ | ✅ | +| knowledge_bases_categories | | DefaultPaginator | ✅ | ✅ | +| message_template_folders | id | DefaultPaginator | ✅ | ✅ | +| teams_signatures | id | DefaultPaginator | ✅ | ❌ | +| message_templates | id | DefaultPaginator | ✅ | ✅ | +| teammates_message_templates | id | DefaultPaginator | ✅ | ❌ | +| teams_message_templates | id | DefaultPaginator | ✅ | ✅ | + +## Changelog + +
+ Expand to review + +| Version | Date |PR| Subject | +|------------------|------------|---|----------------| +| 0.0.1 | 2024-09-11 |[45387](https://github.com/airbytehq/airbyte/pull/45387)| Initial release by [@btkcodedev](https://github.com/btkcodedev) via Connector Builder| + +
\ No newline at end of file