diff --git a/airbyte-integrations/connectors/source-nylas/README.md b/airbyte-integrations/connectors/source-nylas/README.md new file mode 100644 index 000000000000..3ffd3aaff4a3 --- /dev/null +++ b/airbyte-integrations/connectors/source-nylas/README.md @@ -0,0 +1,33 @@ +# Nylas +This directory contains the manifest-only connector for `source-nylas`. + +The Nylas platform provides an integration layer that makes it easy to connect and sync email, calendar, and contact data from any email service provider. + +## 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-nylas:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-nylas build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-nylas test +``` + diff --git a/airbyte-integrations/connectors/source-nylas/acceptance-test-config.yml b/airbyte-integrations/connectors/source-nylas/acceptance-test-config.yml new file mode 100644 index 000000000000..0402f05fc9f0 --- /dev/null +++ b/airbyte-integrations/connectors/source-nylas/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-nylas: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-nylas/icon.svg b/airbyte-integrations/connectors/source-nylas/icon.svg new file mode 100644 index 000000000000..d469266a2ce6 --- /dev/null +++ b/airbyte-integrations/connectors/source-nylas/icon.svg @@ -0,0 +1 @@ + diff --git a/airbyte-integrations/connectors/source-nylas/manifest.yaml b/airbyte-integrations/connectors/source-nylas/manifest.yaml new file mode 100644 index 000000000000..54b39a8be350 --- /dev/null +++ b/airbyte-integrations/connectors/source-nylas/manifest.yaml @@ -0,0 +1,1893 @@ +version: 4.6.2 + +type: DeclarativeSource + +description: >- + The Nylas platform provides an integration layer that makes it easy to connect + and sync email, calendar, and contact data from any email service provider. + +check: + type: CheckStream + stream_names: + - connectors + +definitions: + streams: + calendars: + type: DeclarativeStream + name: calendars + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/calendars + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/calendars" + connectors: + type: DeclarativeStream + name: connectors + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/connectors + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/connectors" + contacts: + type: DeclarativeStream + name: contacts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/contacts + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contacts" + contact_groups: + type: DeclarativeStream + name: contact_groups + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/contacts/groups + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contact_groups" + credentials: + type: DeclarativeStream + name: credentials + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/connectors/{{ stream_partition['provider'] }}/creds + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + partition_router: + type: ListPartitionRouter + values: + - google + - microsoft + - imap + - icloud + cursor_field: provider + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/credentials" + drafts: + type: DeclarativeStream + name: drafts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/drafts + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: date + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: '{{ config["end_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/drafts" + events: + type: DeclarativeStream + name: events + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/events + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + - type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + - type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + request_option: + type: RequestOption + inject_into: request_parameter + field_name: calendar_id + partition_field: calendar_id + stream: + $ref: "#/definitions/streams/calendars" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: updated_at + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + inject_into: request_parameter + field_name: start + end_time_option: + type: RequestOption + inject_into: request_parameter + field_name: end + end_datetime: + type: MinMaxDatetime + datetime: '{{ config["end_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/events" + folders: + type: DeclarativeStream + name: folders + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/folders + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/folders" + grants: + type: DeclarativeStream + name: grants + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/grants" + messages: + type: DeclarativeStream + name: messages + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/messages + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: date + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + inject_into: request_parameter + field_name: received_after + end_time_option: + type: RequestOption + inject_into: request_parameter + field_name: received_before + end_datetime: + type: MinMaxDatetime + datetime: '{{ config["end_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/messages" + scheduled_messages: + type: DeclarativeStream + name: scheduled_messages + primary_key: + - schedule_id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/messages/schedules + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/scheduled_messages" + threads: + type: DeclarativeStream + name: threads + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /v3/grants/{{ stream_partition['grant_id'] }}/threads + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page_token + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: CursorPagination + page_size: 50 + cursor_value: '{{ response.get("next_cursor", {}) }}' + stop_condition: '{{ not response.get("next_cursor", {}) }}' + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: grant_id + stream: + $ref: "#/definitions/streams/grants" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: latest_message_received_date + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: '{{ config["start_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + inject_into: request_parameter + field_name: latest_message_after + end_time_option: + type: RequestOption + inject_into: request_parameter + field_name: latest_message_before + end_datetime: + type: MinMaxDatetime + datetime: '{{ config["end_date"] }}' + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/threads" + base_requester: + type: HttpRequester + url_base: https://api.{{ config['api_server'] }}.nylas.com + authenticator: + type: BearerAuthenticator + api_token: '{{ config["api_key"] }}' + +streams: + - $ref: "#/definitions/streams/calendars" + - $ref: "#/definitions/streams/connectors" + - $ref: "#/definitions/streams/contacts" + - $ref: "#/definitions/streams/contact_groups" + - $ref: "#/definitions/streams/credentials" + - $ref: "#/definitions/streams/drafts" + - $ref: "#/definitions/streams/events" + - $ref: "#/definitions/streams/folders" + - $ref: "#/definitions/streams/grants" + - $ref: "#/definitions/streams/messages" + - $ref: "#/definitions/streams/scheduled_messages" + - $ref: "#/definitions/streams/threads" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - api_key + - api_server + - start_date + - end_date + properties: + api_key: + type: string + order: 0 + title: API Key + airbyte_secret: true + api_server: + type: string + enum: + - us + - eu + order: 1 + title: API Server + 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: 2 + end_date: + type: string + title: End 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: 3 + additionalProperties: true + +metadata: + autoImportSchema: + calendars: true + connectors: true + contacts: true + contact_groups: true + credentials: true + drafts: true + events: true + folders: true + grants: true + messages: true + scheduled_messages: true + threads: true + testedStreams: + calendars: + streamHash: 8ce376b421dc40756474988a420ba528c517b63b + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + connectors: + streamHash: 8860f0729152f057bfd47bf362cdcb3dae1848af + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contacts: + streamHash: c5ea5e2a4567ae654d0cf8d511429d34b45ccdff + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contact_groups: + streamHash: a7b170881039fd54748ed36848eb49afa19ea3eb + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + credentials: + streamHash: b8332a933b9a575fd406c98605ff2fcc7ac0455c + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + drafts: + streamHash: cc113e910b984b75acd11636e5a0f1e4453eaaac + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + events: + streamHash: 33793621acac323eae11fdee060370dc2ede1539 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + folders: + streamHash: 4ae4854ad2f394b0682e516d2800fd46fd185381 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + grants: + streamHash: fbfb85dfc701727ff86ca59f2a0d1ef9fb1ac80a + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + messages: + streamHash: dc5cfd3fec70b6a7cf775320818e6ecb2d206a8b + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + scheduled_messages: + streamHash: abc9f94a2d927df38619ce9d32a0bd90cb1fbbd8 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + threads: + streamHash: 1c17fe01d8112a4c05c327ca5e9993fbdf857a8a + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: {} + +schemas: + calendars: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + hex_color: + type: + - string + - "null" + hex_foreground_color: + type: + - string + - "null" + id: + type: string + is_owned_by_user: + type: + - boolean + - "null" + is_primary: + type: + - boolean + - "null" + name: + type: + - string + - "null" + object: + type: + - string + - "null" + read_only: + type: + - boolean + - "null" + timezone: + type: + - string + - "null" + required: + - id + connectors: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + created_at: + type: + - number + - "null" + provider: + type: + - string + - "null" + scope: + type: + - array + - "null" + items: + type: + - string + - "null" + settings: + type: + - object + - "null" + properties: + client_id: + type: + - string + - "null" + project_id: + type: + - string + - "null" + tenant: + type: + - string + - "null" + topic_name: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + contacts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + company_name: + type: + - string + - "null" + emails: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + given_name: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + groups: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + id: + type: + - string + - "null" + id: + type: string + im_addresses: + type: + - array + - "null" + job_title: + type: + - string + - "null" + middle_name: + type: + - string + - "null" + nickname: + type: + - string + - "null" + object: + type: + - string + - "null" + phone_numbers: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + number: + type: + - string + - "null" + physical_addresses: + type: + - array + - "null" + picture_url: + type: + - string + - "null" + source: + type: + - string + - "null" + surname: + type: + - string + - "null" + updated_at: + type: + - number + - "null" + web_pages: + type: + - array + - "null" + required: + - id + contact_groups: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + grant_id: + type: + - string + - "null" + group_type: + type: + - string + - "null" + id: + type: string + name: + type: + - string + - "null" + object: + type: + - string + - "null" + path: + type: + - string + - "null" + required: + - id + credentials: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + data: + type: + - array + - "null" + request_id: + type: + - string + - "null" + drafts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + attachments: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + content_disposition: + type: + - string + - "null" + content_id: + type: + - string + - "null" + content_type: + type: + - string + - "null" + filename: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: + - string + - "null" + is_inline: + type: + - boolean + - "null" + size: + type: + - number + - "null" + bcc: + type: + - array + - "null" + body: + type: + - string + - "null" + cc: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + date: + type: number + folders: + type: + - array + - "null" + items: + type: + - string + - "null" + from: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: string + object: + type: + - string + - "null" + reply_to: + type: + - array + - "null" + snippet: + type: + - string + - "null" + starred: + type: + - boolean + - "null" + subject: + type: + - string + - "null" + thread_id: + type: + - string + - "null" + to: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + unread: + type: + - boolean + - "null" + required: + - id + - date + events: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + busy: + type: + - boolean + - "null" + calendar_id: + type: + - string + - "null" + color_id: + type: + - string + - "null" + conferencing: + type: + - object + - "null" + properties: + details: + type: + - object + - "null" + properties: + meeting_code: + type: + - string + - "null" + password: + type: + - string + - "null" + phone: + type: + - array + - "null" + items: + type: + - string + - "null" + pin: + type: + - string + - "null" + url: + type: + - string + - "null" + provider: + type: + - string + - "null" + created_at: + type: + - number + - "null" + creator: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + hide_participants: + type: + - boolean + - "null" + html_link: + type: + - string + - "null" + ical_uid: + type: + - string + - "null" + id: + type: string + location: + type: + - string + - "null" + master_event_id: + type: + - string + - "null" + object: + type: + - string + - "null" + organizer: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + original_start_time: + type: + - number + - "null" + participants: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + status: + type: + - string + - "null" + read_only: + type: + - boolean + - "null" + reminders: + type: + - object + - "null" + properties: + overrides: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + reminder_method: + type: + - string + - "null" + reminder_minutes: + type: + - number + - "null" + use_default: + type: + - boolean + - "null" + resources: + type: + - array + - "null" + sequence: + type: + - number + - "null" + status: + type: + - string + - "null" + title: + type: + - string + - "null" + updated_at: + type: number + visibility: + type: + - string + - "null" + when: + type: + - object + - "null" + properties: + end_date: + type: + - string + - "null" + end_time: + type: + - number + - "null" + end_timezone: + type: + - string + - "null" + object: + type: + - string + - "null" + start_date: + type: + - string + - "null" + start_time: + type: + - number + - "null" + start_timezone: + type: + - string + - "null" + required: + - id + - updated_at + folders: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + attributes: + type: + - array + - "null" + items: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: string + name: + type: + - string + - "null" + system_folder: + type: + - boolean + - "null" + total_count: + type: + - number + - "null" + unread_count: + type: + - number + - "null" + required: + - id + grants: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + created_at: + type: + - number + - "null" + email: + type: + - string + - "null" + grant_status: + type: + - string + - "null" + id: + type: string + ip: + type: + - string + - "null" + provider: + type: + - string + - "null" + provider_user_id: + type: + - string + - "null" + scope: + type: + - array + - "null" + items: + type: + - string + - "null" + settings: + type: + - object + - "null" + updated_at: + type: + - number + - "null" + user_agent: + type: + - string + - "null" + required: + - id + messages: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + attachments: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + content_disposition: + type: + - string + - "null" + content_id: + type: + - string + - "null" + content_type: + type: + - string + - "null" + filename: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: + - string + - "null" + is_inline: + type: + - boolean + - "null" + size: + type: + - number + - "null" + bcc: + type: + - array + - "null" + body: + type: + - string + - "null" + cc: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + date: + type: number + folders: + type: + - array + - "null" + items: + type: + - string + - "null" + from: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: string + object: + type: + - string + - "null" + reply_to: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + snippet: + type: + - string + - "null" + starred: + type: + - boolean + - "null" + subject: + type: + - string + - "null" + thread_id: + type: + - string + - "null" + to: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + unread: + type: + - boolean + - "null" + required: + - id + - date + scheduled_messages: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + close_time: + type: + - number + - "null" + schedule_id: + type: string + status: + type: + - object + - "null" + properties: + description: + type: + - string + - "null" + code: + type: + - string + - "null" + reason: + type: + - string + - "null" + required: + - schedule_id + threads: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + draft_ids: + type: + - array + - "null" + items: + type: + - string + - "null" + earliest_message_date: + type: + - number + - "null" + folders: + type: + - array + - "null" + items: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + has_attachments: + type: + - boolean + - "null" + has_drafts: + type: + - boolean + - "null" + id: + type: string + latest_draft_or_message: + type: + - object + - "null" + properties: + attachments: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + content_disposition: + type: + - string + - "null" + content_id: + type: + - string + - "null" + content_type: + type: + - string + - "null" + filename: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: + - string + - "null" + is_inline: + type: + - boolean + - "null" + size: + type: + - number + - "null" + bcc: + type: + - array + - "null" + body: + type: + - string + - "null" + cc: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + date: + type: + - number + - "null" + folders: + type: + - array + - "null" + items: + type: + - string + - "null" + from: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + grant_id: + type: + - string + - "null" + id: + type: + - string + - "null" + object: + type: + - string + - "null" + reply_to: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + snippet: + type: + - string + - "null" + starred: + type: + - boolean + - "null" + subject: + type: + - string + - "null" + thread_id: + type: + - string + - "null" + to: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + unread: + type: + - boolean + - "null" + latest_message_received_date: + type: number + latest_message_sent_date: + type: + - number + - "null" + message_ids: + type: + - array + - "null" + items: + type: + - string + - "null" + object: + type: + - string + - "null" + participants: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + email: + type: + - string + - "null" + name: + type: + - string + - "null" + snippet: + type: + - string + - "null" + starred: + type: + - boolean + - "null" + subject: + type: + - string + - "null" + unread: + type: + - boolean + - "null" + required: + - id + - latest_message_received_date diff --git a/airbyte-integrations/connectors/source-nylas/metadata.yaml b/airbyte-integrations/connectors/source-nylas/metadata.yaml new file mode 100644 index 000000000000..c499e447bb22 --- /dev/null +++ b/airbyte-integrations/connectors/source-nylas/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "api.*.nylas.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-nylas + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:4.6.2@sha256:f5fcd3d4703b7590b6166a7853c5ed1686731607cd30a159a8c24e2fe2c1ee98 + connectorSubtype: api + connectorType: source + definitionId: 136a1ee6-5b95-4e09-9f3f-5c8df35df690 + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-nylas + githubIssueLabel: source-nylas + icon: icon.svg + license: MIT + name: Nylas + releaseDate: 2024-09-03 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/nylas + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/nylas.md b/docs/integrations/sources/nylas.md new file mode 100644 index 000000000000..c1fc02724ca1 --- /dev/null +++ b/docs/integrations/sources/nylas.md @@ -0,0 +1,38 @@ +# Nylas +The Nylas platform provides an integration layer that makes it easy to connect and sync email, calendar, and contact data from any email service provider. + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `api_key` | `string` | API Key. | | +| `api_server` | `string` | API Server. | | +| `start_date` | `string` | Start date. | | +| `end_date` | `string` | End date. | | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| calendars | id | DefaultPaginator | ✅ | ❌ | +| connectors | | No pagination | ✅ | ❌ | +| contacts | id | DefaultPaginator | ✅ | ❌ | +| contact_groups | id | DefaultPaginator | ✅ | ❌ | +| credentials | | No pagination | ✅ | ❌ | +| drafts | id | DefaultPaginator | ✅ | ✅ | +| events | id | DefaultPaginator | ✅ | ✅ | +| folders | id | DefaultPaginator | ✅ | ❌ | +| grants | id | DefaultPaginator | ✅ | ❌ | +| messages | id | DefaultPaginator | ✅ | ✅ | +| scheduled_messages | schedule_id | No pagination | ✅ | ❌ | +| threads | id | DefaultPaginator | ✅ | ✅ | + +## Changelog + +
+ Expand to review + +| Version | Date | Subject | +|------------------|------------|----------------| +| 0.0.1 | 2024-09-03 | Initial release by [@topefolorunso](https://github.com/topefolorunso) via Connector Builder| + +
\ No newline at end of file