diff --git a/airbyte-integrations/connectors/source-acuity-scheduling/README.md b/airbyte-integrations/connectors/source-acuity-scheduling/README.md new file mode 100644 index 00000000000..8a3f95f31c2 --- /dev/null +++ b/airbyte-integrations/connectors/source-acuity-scheduling/README.md @@ -0,0 +1,34 @@ +# Acuity Scheduling +This directory contains the manifest-only connector for `source-acuity-scheduling`. + +Flexible scheduling software to help you succeed +With seamless client scheduling, secure payments, and workflow automation, all you have to do is show up on time. + +## 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-acuity-scheduling:dev`) that you can use to test the connector locally. +```bash +airbyte-ci connectors --name=source-acuity-scheduling build +``` + +### Test +This will run the acceptance tests for the connector. +```bash +airbyte-ci connectors --name=source-acuity-scheduling test +``` + diff --git a/airbyte-integrations/connectors/source-acuity-scheduling/acceptance-test-config.yml b/airbyte-integrations/connectors/source-acuity-scheduling/acceptance-test-config.yml new file mode 100644 index 00000000000..1ae6363356a --- /dev/null +++ b/airbyte-integrations/connectors/source-acuity-scheduling/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-acuity-scheduling: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-acuity-scheduling/icon.svg b/airbyte-integrations/connectors/source-acuity-scheduling/icon.svg new file mode 100644 index 00000000000..cf5618012c9 --- /dev/null +++ b/airbyte-integrations/connectors/source-acuity-scheduling/icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-acuity-scheduling/manifest.yaml b/airbyte-integrations/connectors/source-acuity-scheduling/manifest.yaml new file mode 100644 index 00000000000..3c97ebe7827 --- /dev/null +++ b/airbyte-integrations/connectors/source-acuity-scheduling/manifest.yaml @@ -0,0 +1,778 @@ +version: 6.48.15 + +type: DeclarativeSource + +description: >- + Flexible scheduling software to help you succeed + + With seamless client scheduling, secure payments, and workflow automation, all + you have to do is show up on time. + +check: + type: CheckStream + stream_names: + - appointments + +definitions: + streams: + appointments: + type: DeclarativeStream + name: appointments + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: appointments + http_method: GET + request_parameters: + max: "100000" + showall: "true" + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + incremental_sync: + type: DatetimeBasedCursor + cursor_field: insert_date + lookback_window: P1W + cursor_datetime_formats: + - "%Y-%m-%d" + datetime_format: "%Y-%m-%d" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config[\"start_date\"] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + field_name: minDate + inject_into: request_parameter + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + transformations: + - type: AddFields + fields: + - type: AddedFieldDefinition + path: + - insert_date + value: "{{ stream_slice.start_time }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/appointments" + calendars: + type: DeclarativeStream + name: calendars + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: calendars + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/calendars" + clients: + type: DeclarativeStream + name: clients + primary_key: + - email + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: clients + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/clients" + appointment-types: + type: DeclarativeStream + name: appointment-types + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: appointment-types + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/appointment-types" + blocks: + type: DeclarativeStream + name: blocks + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: blocks + http_method: GET + request_parameters: + max: "10000" + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + incremental_sync: + type: DatetimeBasedCursor + cursor_field: insert_date + lookback_window: P1W + cursor_datetime_formats: + - "%Y-%m-%d" + datetime_format: "%Y-%m-%d" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config[\"start_date\"] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + field_name: minDate + inject_into: request_parameter + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + transformations: + - type: AddFields + fields: + - type: AddedFieldDefinition + path: + - insert_date + value: "{{ stream_slice.start_time }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/blocks" + labels: + type: DeclarativeStream + name: labels + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: labels + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/labels" + forms: + type: DeclarativeStream + name: forms + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: forms + http_method: GET + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + decoder: + type: JsonDecoder + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/forms" + base_requester: + type: HttpRequester + url_base: https://acuityscheduling.com/api/v1 + authenticator: + type: BasicHttpAuthenticator + password: "{{ config[\"password\"] }}" + username: "{{ config[\"username\"] }}" + +streams: + - $ref: "#/definitions/streams/appointments" + - $ref: "#/definitions/streams/calendars" + - $ref: "#/definitions/streams/clients" + - $ref: "#/definitions/streams/appointment-types" + - $ref: "#/definitions/streams/blocks" + - $ref: "#/definitions/streams/labels" + - $ref: "#/definitions/streams/forms" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - username + - start_date + properties: + username: + type: string + order: 0 + title: Username + password: + type: string + order: 1 + title: Password + always_show: true + airbyte_secret: true + start_date: + type: string + order: 2 + 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$ + additionalProperties: true + +metadata: + autoImportSchema: + appointments: true + calendars: true + clients: true + appointment-types: true + blocks: true + labels: true + forms: true + testedStreams: + appointments: + streamHash: 583df5d3ff7b1808cfa5e2dd5cf6b6f7b82c3818 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + calendars: + streamHash: 0f0b6fd2e19930c693406ff8b814bd1b27ebe771 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + clients: + streamHash: 5b5ad6fd3c8e0552d1082c89924b189a96908dad + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + appointment-types: + streamHash: 610a45f21f5fc27da24e3a7b38f942772cdb970c + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + blocks: + streamHash: 135acc647612c65d16606b1de8f7c680e1e946b9 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + labels: + streamHash: 8b72b44745acf2445c0a67a3515991dbb2bfb318 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + forms: + streamHash: 2b13ee3df2f1f1b2a30171de8f1d826865690b96 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: {} + +schemas: + appointments: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + addonIDs: + type: + - array + - "null" + amountPaid: + type: + - string + - "null" + appointmentTypeID: + type: + - number + - "null" + calendar: + type: + - string + - "null" + calendarID: + type: + - number + - "null" + calendarTimezone: + type: + - string + - "null" + canClientCancel: + type: + - boolean + - "null" + canClientReschedule: + type: + - boolean + - "null" + canceled: + type: + - boolean + - "null" + category: + type: + - string + - "null" + confirmationPage: + type: + - string + - "null" + confirmationPagePaymentLink: + type: + - string + - "null" + date: + type: + - string + - "null" + dateCreated: + type: + - string + - "null" + datetime: + type: + - string + - "null" + datetimeCreated: + type: + - string + - "null" + duration: + type: + - string + - "null" + email: + type: + - string + - "null" + endTime: + type: + - string + - "null" + firstName: + type: + - string + - "null" + forms: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + id: + type: + - number + - "null" + name: + type: + - string + - "null" + values: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + fieldID: + type: + - number + - "null" + id: + type: + - number + - "null" + name: + type: + - string + - "null" + value: + type: + - string + - "null" + formsText: + type: + - string + - "null" + id: + type: number + insert_date: + type: string + lastName: + type: + - string + - "null" + location: + type: + - string + - "null" + notes: + type: + - string + - "null" + paid: + type: + - string + - "null" + phone: + type: + - string + - "null" + price: + type: + - string + - "null" + priceSold: + type: + - string + - "null" + time: + type: + - string + - "null" + timezone: + type: + - string + - "null" + required: + - id + - insert_date + calendars: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + email: + type: + - string + - "null" + id: + type: number + image: + type: + - boolean + - "null" + location: + type: + - string + - "null" + name: + type: + - string + - "null" + replyTo: + type: + - string + - "null" + thumbnail: + type: + - boolean + - "null" + timezone: + type: + - string + - "null" + required: + - id + clients: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + email: + type: string + firstName: + type: + - string + - "null" + lastName: + type: + - string + - "null" + notes: + type: + - string + - "null" + phone: + type: + - string + - "null" + required: + - email + appointment-types: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + type: + type: + - string + - "null" + description: + type: + - string + - "null" + active: + type: + - boolean + - "null" + addonIDs: + type: + - array + - "null" + calendarIDs: + type: + - array + - "null" + items: + type: + - number + - "null" + category: + type: + - string + - "null" + color: + type: + - string + - "null" + duration: + type: + - number + - "null" + formIDs: + type: + - array + - "null" + items: + type: + - number + - "null" + id: + type: number + image: + type: + - string + - "null" + name: + type: + - string + - "null" + paddingAfter: + type: + - number + - "null" + paddingBefore: + type: + - number + - "null" + price: + type: + - string + - "null" + private: + type: + - boolean + - "null" + schedulingUrl: + type: + - string + - "null" + required: + - id + blocks: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + calendarID: + type: + - number + - "null" + calendarTimezone: + type: + - string + - "null" + end: + type: + - string + - "null" + id: + type: number + insert_date: + type: string + managed: + type: + - boolean + - "null" + notes: + type: + - string + - "null" + serviceGroupID: + type: + - number + - "null" + start: + type: + - string + - "null" + required: + - id + - insert_date + labels: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + color: + type: + - string + - "null" + id: + type: number + name: + type: + - string + - "null" + required: + - id + forms: + type: object + $schema: http://json-schema.org/schema# + additionalProperties: true + properties: + description: + type: + - string + - "null" + appointmentTypeIDs: + type: + - array + - "null" + items: + type: + - number + - "null" + fields: + type: + - array + - "null" + items: + type: + - object + - "null" + properties: + type: + type: + - string + - "null" + id: + type: + - number + - "null" + lines: + type: + - number + - "null" + name: + type: + - string + - "null" + required: + type: + - boolean + - "null" + hidden: + type: + - boolean + - "null" + id: + type: number + name: + type: + - string + - "null" + required: + - id diff --git a/airbyte-integrations/connectors/source-acuity-scheduling/metadata.yaml b/airbyte-integrations/connectors/source-acuity-scheduling/metadata.yaml new file mode 100644 index 00000000000..ef9c4588803 --- /dev/null +++ b/airbyte-integrations/connectors/source-acuity-scheduling/metadata.yaml @@ -0,0 +1,35 @@ +metadataSpecVersion: "1.0" +data: + allowedHosts: + hosts: + - "acuityscheduling.com" + registryOverrides: + oss: + enabled: true + cloud: + enabled: true + remoteRegistries: + pypi: + enabled: false + packageName: airbyte-source-acuity-scheduling + connectorBuildOptions: + baseImage: docker.io/airbyte/source-declarative-manifest:6.57.0@sha256:d3e766c04130e607773c1ed8e3ef82b1b932ad514e15b3bb78f0ee13ab59d03d + connectorSubtype: api + connectorType: source + definitionId: bc7db25c-bdfb-4ec2-96ae-a4687cead916 + dockerImageTag: 0.0.1 + dockerRepository: airbyte/source-acuity-scheduling + githubIssueLabel: source-acuity-scheduling + icon: icon.svg + license: MIT + name: Acuity Scheduling + releaseDate: 2025-07-02 + releaseStage: alpha + supportLevel: community + documentationUrl: https://docs.airbyte.com/integrations/sources/acuity-scheduling + tags: + - language:manifest-only + - cdk:low-code + ab_internal: + ql: 100 + sl: 100 diff --git a/docs/integrations/sources/acuity-scheduling.md b/docs/integrations/sources/acuity-scheduling.md new file mode 100644 index 00000000000..fe0d4219411 --- /dev/null +++ b/docs/integrations/sources/acuity-scheduling.md @@ -0,0 +1,33 @@ +# Acuity Scheduling +Flexible scheduling software to help you succeed +With seamless client scheduling, secure payments, and workflow automation, all you have to do is show up on time. + +## Configuration + +| Input | Type | Description | Default Value | +|-------|------|-------------|---------------| +| `username` | `string` | Username. | | +| `password` | `string` | Password. | | +| `start_date` | `string` | Start date. | | + +## Streams +| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental | +|-------------|-------------|------------|---------------------|----------------------| +| appointments | id | No pagination | ✅ | ✅ | +| calendars | id | No pagination | ✅ | ❌ | +| clients | email | No pagination | ✅ | ❌ | +| appointment-types | id | No pagination | ✅ | ❌ | +| blocks | id | No pagination | ✅ | ✅ | +| labels | id | No pagination | ✅ | ❌ | +| forms | id | No pagination | ✅ | ❌ | + +## Changelog + +
+ Expand to review + +| Version | Date | Pull Request | Subject | +|------------------|-------------------|--------------|----------------| +| 0.0.1 | 2025-07-02 | | Initial release by [@chanronson](https://github.com/chanronson) via Connector Builder | + +