diff --git a/airbyte-integrations/connectors/source-spotlercrm/README.md b/airbyte-integrations/connectors/source-spotlercrm/README.md new file mode 100644 index 0000000000000..ab4a122fbfa48 --- /dev/null +++ b/airbyte-integrations/connectors/source-spotlercrm/README.md @@ -0,0 +1,33 @@ +# SpotlerCRM +This directory contains the manifest-only connector for `source-spotlercrm`. + +The Airbyte connector for [Spotler CRM](https://spotler.com/) enables seamless data integration, allowing users to sync customer data from Spotler CRM into their data warehouses or other tools. It supports automated data extraction from Spotler CRM, making it easier to analyze and leverage customer insights across multiple platforms. With this connector, businesses can efficiently streamline their customer relationship data and maintain up-to-date records for improved decision-making and marketing efforts. + +## 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-spotlercrm:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-spotlercrm build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-spotlercrm test +``` + diff --git a/airbyte-integrations/connectors/source-spotlercrm/acceptance-test-config.yml b/airbyte-integrations/connectors/source-spotlercrm/acceptance-test-config.yml new file mode 100644 index 0000000000000..bada5a52b4994 --- /dev/null +++ b/airbyte-integrations/connectors/source-spotlercrm/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-spotlercrm: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-spotlercrm/icon.svg b/airbyte-integrations/connectors/source-spotlercrm/icon.svg new file mode 100644 index 0000000000000..aac96aebb0302 --- /dev/null +++ b/airbyte-integrations/connectors/source-spotlercrm/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/airbyte-integrations/connectors/source-spotlercrm/manifest.yaml b/airbyte-integrations/connectors/source-spotlercrm/manifest.yaml new file mode 100644 index 0000000000000..8f061c813c47a --- /dev/null +++ b/airbyte-integrations/connectors/source-spotlercrm/manifest.yaml @@ -0,0 +1,950 @@ +version: 6.4.0 + +type: DeclarativeSource + +description: >- + The Airbyte connector for [Spotler CRM](https://spotler.com/) enables seamless + data integration, allowing users to sync customer data from Spotler CRM into + their data warehouses or other tools. It supports automated data extraction + from Spotler CRM, making it easier to analyze and leverage customer insights + across multiple platforms. With this connector, businesses can efficiently + streamline their customer relationship data and maintain up-to-date records + for improved decision-making and marketing efforts. + +check: + type: CheckStream + stream_names: + - accounts + +definitions: + streams: + accounts: + type: DeclarativeStream + name: accounts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /accounts + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/accounts" + contacts: + type: DeclarativeStream + name: contacts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /contacts + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + inject_on_first_request: true + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contacts" + opportunities: + type: DeclarativeStream + name: opportunities + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /opportunities + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/opportunities" + documents: + type: DeclarativeStream + name: documents + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /opportunity_lines + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + inject_on_first_request: true + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/documents" + campaigns: + type: DeclarativeStream + name: campaigns + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /campaigns + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + inject_on_first_request: true + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/campaigns" + " cases": + type: DeclarativeStream + name: " cases" + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /cases + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + inject_on_first_request: true + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/ cases" + activities: + type: DeclarativeStream + name: activities + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /activities + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + inject_on_first_request: true + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/activities" + opportunity_histories: + type: DeclarativeStream + name: opportunity_histories + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /opportunityhistories + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/opportunity_histories" + opportunity_lines: + type: DeclarativeStream + name: opportunity_lines + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /opportunity_lines + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - list + - "*" + - record + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: page + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: limit + pagination_strategy: + type: PageIncrement + start_from_page: 1 + page_size: 100 + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/opportunity_lines" + base_requester: + type: HttpRequester + url_base: https://apiv4.reallysimplesystems.com + authenticator: + type: BearerAuthenticator + api_token: "{{ config[\"access_token\"] }}" + +streams: + - $ref: "#/definitions/streams/accounts" + - $ref: "#/definitions/streams/contacts" + - $ref: "#/definitions/streams/opportunities" + - $ref: "#/definitions/streams/documents" + - $ref: "#/definitions/streams/campaigns" + - $ref: "#/definitions/streams/ cases" + - $ref: "#/definitions/streams/activities" + - $ref: "#/definitions/streams/opportunity_histories" + - $ref: "#/definitions/streams/opportunity_lines" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - access_token + properties: + access_token: + type: string + description: >- + Access Token to authenticate API requests. Generate it by logging into + your CRM system, navigating to Settings / Integrations / API V4, and + clicking 'generate new key'. + name: access_token + order: 0 + title: Access Token + airbyte_secret: true + additionalProperties: true + +metadata: + autoImportSchema: + accounts: true + contacts: false + opportunities: false + documents: true + campaigns: true + " cases": true + activities: true + opportunity_histories: true + opportunity_lines: true + testedStreams: + accounts: + streamHash: 228e48ed130b9347bbe207f40fc5e69cf803658c + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contacts: + streamHash: 4b40d70440c4fb24646635e55db0e9b932d50520 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + opportunities: + streamHash: 63348e089a396613fc2a32f9bebcee6d644c7949 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + documents: + streamHash: a6a65a975319144846413cc54a1bfee75b2f112c + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + campaigns: + streamHash: 2416e1340a7d1f01da2fef06bf5f90525632e820 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + " cases": + streamHash: 68481fbb96d90a65d9b2fc8fdaa06cc06485899b + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + activities: + streamHash: d651211072bd9a8f413d7bd4645ef294fe2f2115 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + opportunity_histories: + streamHash: 058ddbd93020908110d973c15e3da1161f4ba1b4 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + opportunity_lines: + streamHash: 20e98bbf72fc0e49eab8ee812677571b6312b7b1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: + docsUrl: https://support.reallysimplesystems.com/api-v4/ + +schemas: + accounts: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + addresscity: + type: + - string + - "null" + addresscountry: + type: + - string + - "null" + addresscounty/state: + type: + - string + - "null" + addressline: + type: + - string + - "null" + addresspostcode/zip: + type: + - string + - "null" + createdby: + type: + - number + - "null" + createddate: + type: + - string + - "null" + id: + type: number + modifiedby: + type: + - number + - "null" + modifieddate: + type: + - string + - "null" + name: + type: + - string + - "null" + notes: + type: + - string + - "null" + ownerid: + type: + - number + - "null" + phone: + type: + - string + - "null" + sector: + type: + - string + - "null" + slaid: + type: + - number + - "null" + source: + type: + - string + - "null" + website: + type: + - string + - "null" + required: + - id + contacts: + type: object + $schema: http://json-schema.org/schema# + properties: + accountid: + type: + - number + - "null" + addresscity: + type: + - string + - "null" + addresscountry: + type: + - string + - "null" + addresscounty/state: + type: + - string + - "null" + addresspostcode/zip: + type: + - string + - "null" + createdby: + type: + - number + - "null" + createddate: + type: + - string + - "null" + decisionmaker: + type: + - number + - "null" + email: + type: + - string + - "null" + first: + type: + - string + - "null" + hold: + type: + - number + - "null" + id: + type: number + jobtitle: + type: + - string + - "null" + last: + type: + - string + - "null" + leadscore: + type: + - number + - "null" + middle: + type: + - string + - "null" + modifiedby: + type: + - number + - "null" + modifieddate: + type: + - string + - "null" + phone: + type: + - string + - "null" + salutation: + type: + - string + - "null" + required: + - id + additionalProperties: true + opportunities: + type: object + $schema: http://json-schema.org/schema# + properties: + accountid: + type: + - number + - "null" + closedate: + type: + - string + - "null" + createdby: + type: + - number + - "null" + createddate: + type: + - string + - "null" + forecast: + type: + - string + - "null" + id: + type: number + modifiedby: + type: + - number + - "null" + modifieddate: + type: + - string + - "null" + name: + type: + - string + - "null" + nextstep: + type: + - string + - "null" + probability: + type: + - number + - "null" + repeat: + type: + - string + - "null" + source: + type: + - string + - "null" + status: + type: + - string + - "null" + required: + - id + additionalProperties: true + documents: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + createdby: + type: + - number + - "null" + id: + type: + - number + - "null" + modifiedby: + type: + - number + - "null" + opportunityid: + type: + - number + - "null" + product: + type: + - string + - "null" + quantity: + type: + - number + - "null" + unitprice: + type: + - number + - "null" + campaigns: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + active: + type: + - number + - "null" + dripfeed: + type: + - number + - "null" + id: + type: number + members: + type: + - number + - "null" + name: + type: + - string + - "null" + opportunities: + type: + - number + - "null" + ownerid: + type: + - number + - "null" + sales: + type: + - number + - "null" + status: + type: + - string + - "null" + required: + - id + " cases": + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + accountid: + type: + - number + - "null" + caselevelid: + type: + - number + - "null" + createdby: + type: + - number + - "null" + createddate: + type: + - string + - "null" + id: + type: number + modifiedby: + type: + - number + - "null" + modifieddate: + type: + - string + - "null" + opened: + type: + - string + - "null" + ownerid: + type: + - number + - "null" + status: + type: + - string + - "null" + subject: + type: + - string + - "null" + required: + - id + activities: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + accountid: + type: + - number + - "null" + allday: + type: + - number + - "null" + caseid: + type: + - number + - "null" + contactid: + type: + - number + - "null" + createddate: + type: + - string + - "null" + date: + type: + - string + - "null" + id: + type: number + modifieddate: + type: + - string + - "null" + priority: + type: + - number + - "null" + status: + type: + - string + - "null" + required: + - id + opportunity_histories: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + closedate: + type: + - string + - "null" + forecast: + type: + - string + - "null" + id: + type: number + modifiedby: + type: + - number + - "null" + modifieddate: + type: + - string + - "null" + opportunitystatus: + type: + - string + - "null" + probability: + type: + - number + - "null" + value: + type: + - number + - "null" + required: + - id + opportunity_lines: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + createdby: + type: + - number + - "null" + id: + type: number + modifiedby: + type: + - number + - "null" + opportunityid: + type: + - number + - "null" + product: + type: + - string + - "null" + quantity: + type: + - number + - "null" + unitprice: + type: + - number + - "null" + required: + - id diff --git a/airbyte-integrations/connectors/source-spotlercrm/metadata.yaml b/airbyte-integrations/connectors/source-spotlercrm/metadata.yaml new file mode 100644 index 0000000000000..024b408c0ce49 --- /dev/null +++ b/airbyte-integrations/connectors/source-spotlercrm/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "apiv4.reallysimplesystems.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-spotlercrm + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:6.4.0@sha256:f20270ba0ac84b315467c706232f3cbfbadab1f5565174eaf4c32cd3c5a43169 + connectorSubtype: api + connectorType: source + definitionId: 039127b5-9ff5-433e-950c-ae8d0a8912d4 + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-spotlercrm + githubIssueLabel: source-spotlercrm + icon: icon.svg + license: MIT + name: SpotlerCRM + releaseDate: 2024-11-08 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/spotlercrm + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/spotlercrm.md b/docs/integrations/sources/spotlercrm.md new file mode 100644 index 0000000000000..2370a6e6b4711 --- /dev/null +++ b/docs/integrations/sources/spotlercrm.md @@ -0,0 +1,32 @@ +# SpotlerCRM +The Airbyte connector for [Spotler CRM](https://spotler.com/) enables seamless data integration, allowing users to sync customer data from Spotler CRM into their data warehouses or other tools. It supports automated data extraction from Spotler CRM, making it easier to analyze and leverage customer insights across multiple platforms. With this connector, businesses can efficiently streamline their customer relationship data and maintain up-to-date records for improved decision-making and marketing efforts. + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `access_token` | `string` | Access Token. Access Token to authenticate API requests. Generate it by logging into your CRM system, navigating to Settings / Integrations / API V4, and clicking 'generate new key'. | | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| accounts | id | DefaultPaginator | ✅ | ❌ | +| contacts | id | DefaultPaginator | ✅ | ❌ | +| opportunities | id | DefaultPaginator | ✅ | ❌ | +| documents | | DefaultPaginator | ✅ | ❌ | +| campaigns | id | DefaultPaginator | ✅ | ❌ | +| cases | id | DefaultPaginator | ✅ | ❌ | +| activities | id | DefaultPaginator | ✅ | ❌ | +| opportunity_histories | id | DefaultPaginator | ✅ | ❌ | +| opportunity_lines | id | DefaultPaginator | ✅ | ❌ | + +## Changelog + +
+ Expand to review + +| Version | Date | Pull Request | Subject | +|------------------|-------------------|--------------|----------------| +| 0.0.1 | 2024-11-08 | | Initial release by [@parthiv11](https://github.com/parthiv11) via Connector Builder | + +