diff --git a/airbyte-integrations/connectors/source-breezy-hr/README.md b/airbyte-integrations/connectors/source-breezy-hr/README.md
new file mode 100644
index 000000000000..6ea12a72a121
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezy-hr/README.md
@@ -0,0 +1,32 @@
+# Breezy HR
+This directory contains the manifest-only connector for `source-breezy-hr`.
+
+An Airbyte source for Breezy applicant tracking system.
+## Usage
+
+- 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-breezy-hr:dev`) that you can use to test the connector locally.
+```bash
+airbyte-ci connectors --name=source-breezy-hr build
+```
+
+### Test
+This will run the acceptance tests for the connector.
+```bash
+airbyte-ci connectors --name=source-breezy-hr test
+```
+
diff --git a/airbyte-integrations/connectors/source-breezy-hr/acceptance-test-config.yml b/airbyte-integrations/connectors/source-breezy-hr/acceptance-test-config.yml
new file mode 100644
index 000000000000..b456ffb684a3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezy-hr/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-breezy-hr: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-breezy-hr/icon.svg b/airbyte-integrations/connectors/source-breezy-hr/icon.svg
new file mode 100644
index 000000000000..ad57c83492f3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezy-hr/icon.svg
@@ -0,0 +1,44 @@
+
diff --git a/airbyte-integrations/connectors/source-breezy-hr/manifest.yaml b/airbyte-integrations/connectors/source-breezy-hr/manifest.yaml
new file mode 100644
index 000000000000..de966629d521
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezy-hr/manifest.yaml
@@ -0,0 +1,535 @@
+version: 4.5.2
+
+type: DeclarativeSource
+
+description: An Airbyte source for Breezy applicant tracking system.
+
+check:
+ type: CheckStream
+ stream_names:
+ - positions
+
+definitions:
+ streams:
+ positions:
+ type: DeclarativeStream
+ name: positions
+ retriever:
+ type: SimpleRetriever
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: /positions
+ http_method: GET
+ error_handler:
+ type: CompositeErrorHandler
+ error_handlers:
+ - type: DefaultErrorHandler
+ backoff_strategies:
+ - type: WaitUntilTimeFromHeader
+ header: X-RateLimit-Reset
+ response_filters:
+ - type: HttpResponseFilter
+ action: IGNORE
+ http_codes:
+ - 400
+ - 401
+ - 500
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path: []
+ transformations:
+ - type: AddFields
+ fields:
+ - path:
+ - type
+ value: "{{ record['type']['name'] }}"
+ - type: AddFields
+ fields:
+ - path:
+ - country_id
+ value: "{{ record['location']['country']['id'] }}"
+ - type: RemoveFields
+ field_pointers:
+ - - application_form
+ - type: RemoveFields
+ field_pointers:
+ - - friendly_id
+ - type: RemoveFields
+ field_pointers:
+ - - experience
+ - type: RemoveFields
+ field_pointers:
+ - - education
+ - type: RemoveFields
+ field_pointers:
+ - - requisition_id
+ - type: RemoveFields
+ field_pointers:
+ - - description
+ - type: RemoveFields
+ field_pointers:
+ - - category
+ - type: RemoveFields
+ field_pointers:
+ - - all_admins
+ - type: RemoveFields
+ field_pointers:
+ - - all_users
+ - type: RemoveFields
+ field_pointers:
+ - - bias_enabled
+ - type: RemoveFields
+ field_pointers:
+ - - questionnaire_id
+ - type: RemoveFields
+ field_pointers:
+ - - scorecard_id
+ - type: RemoveFields
+ field_pointers:
+ - - candidate_type
+ - type: RemoveFields
+ field_pointers:
+ - - creator_id
+ - type: AddFields
+ fields:
+ - path:
+ - position_id
+ value: "{{ record['_id'] }}"
+ - type: RemoveFields
+ field_pointers:
+ - - _id
+ - type: AddFields
+ fields:
+ - path:
+ - country_name
+ value: "{{ record['location']['country']['name'] }}"
+ - type: RemoveFields
+ field_pointers:
+ - - location
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/positions"
+ candidates:
+ type: DeclarativeStream
+ name: candidates
+ retriever:
+ type: SimpleRetriever
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: /position/{{stream_partition.positions}}/candidates
+ http_method: GET
+ request_parameters:
+ sort: updated_date
+ error_handler:
+ type: CompositeErrorHandler
+ error_handlers:
+ - type: DefaultErrorHandler
+ max_retries: 100
+ backoff_strategies:
+ - type: ConstantBackoffStrategy
+ backoff_time_in_seconds: 5
+ response_filters:
+ - type: HttpResponseFilter
+ action: RETRY
+ predicate: "{{ response.status_code == 429 }}"
+ http_codes:
+ - 429
+ error_message: Failed with Error 429 status code, retrying again
+ - type: DefaultErrorHandler
+ response_filters:
+ - type: HttpResponseFilter
+ action: IGNORE
+ http_codes:
+ - 400
+ - 401
+ - 500
+ error_message: Failed with Error 400, 401 or 500 status codes
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path: []
+ partition_router:
+ type: SubstreamPartitionRouter
+ parent_stream_configs:
+ - type: ParentStreamConfig
+ parent_key: position_id
+ partition_field: positions
+ stream:
+ $ref: "#/definitions/streams/positions"
+ transformations:
+ - type: AddFields
+ fields:
+ - path:
+ - stage
+ value: "{{ record['stage']['name'] }}"
+ - type: AddFields
+ fields:
+ - path:
+ - pos_id
+ value: >-
+ {{stream_partition.positions}}-{% set id = record['_id'] if
+ record.get('_id') else "" %} {{ id }}
+ - type: AddFields
+ fields:
+ - path:
+ - position_id
+ value: >-
+ {% set id = record['pos_id'].split('- ')[0] if
+ record.get('pos_id', None) else "" %} {{ id }}
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/candidates"
+ pipelines:
+ type: DeclarativeStream
+ name: pipelines
+ retriever:
+ type: SimpleRetriever
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: /pipelines
+ http_method: GET
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - "*"
+ transformations:
+ - type: RemoveFields
+ field_pointers:
+ - - pipeline
+ - type: RemoveFields
+ field_pointers:
+ - - creation_date
+ - type: RemoveFields
+ field_pointers:
+ - - updated_date
+ - type: RemoveFields
+ field_pointers:
+ - - type
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/pipelines"
+ base_requester:
+ type: HttpRequester
+ url_base: https://api.breezy.hr/v3/company/{{ config['company_id'] }}
+ authenticator:
+ type: ApiKeyAuthenticator
+ api_token: '{{ config["api_key"] }}'
+ inject_into:
+ type: RequestOption
+ field_name: AUTHORIZATION
+ inject_into: header
+
+streams:
+ - $ref: "#/definitions/streams/positions"
+ - $ref: "#/definitions/streams/candidates"
+ - $ref: "#/definitions/streams/pipelines"
+
+spec:
+ type: Spec
+ connection_specification:
+ type: object
+ $schema: http://json-schema.org/draft-07/schema#
+ required:
+ - api_key
+ - company_id
+ properties:
+ api_key:
+ type: string
+ order: 0
+ title: API Key
+ airbyte_secret: true
+ company_id:
+ type: string
+ order: 1
+ title: Company ID
+ airbyte_secret: true
+ additionalProperties: true
+
+metadata:
+ autoImportSchema:
+ positions: false
+ candidates: false
+ pipelines: false
+ testedStreams: {}
+
+schemas:
+ positions:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ type:
+ type:
+ - string
+ - "null"
+ country_id:
+ type:
+ - string
+ - "null"
+ country_name:
+ type:
+ - string
+ - "null"
+ creation_date:
+ type:
+ - string
+ - "null"
+ custom_attributes:
+ type:
+ - array
+ - "null"
+ department:
+ type:
+ - string
+ - "null"
+ name:
+ type:
+ - string
+ - "null"
+ org_type:
+ type:
+ - string
+ - "null"
+ pipeline_id:
+ type:
+ - string
+ - "null"
+ position_id:
+ type:
+ - number
+ - string
+ - "null"
+ state:
+ type:
+ - string
+ - "null"
+ tags:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ updated_date:
+ type:
+ - string
+ - "null"
+ candidates:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ _id:
+ type:
+ - string
+ - "null"
+ assigned_to:
+ type:
+ - object
+ - "null"
+ properties:
+ _id:
+ type:
+ - string
+ - "null"
+ email_address:
+ type:
+ - string
+ - "null"
+ hex_color:
+ type:
+ - string
+ - "null"
+ initial:
+ type:
+ - string
+ - "null"
+ name:
+ type:
+ - string
+ - "null"
+ username:
+ type:
+ - string
+ - "null"
+ bias_status:
+ type:
+ - string
+ - "null"
+ creation_date:
+ type:
+ - string
+ - "null"
+ email_address:
+ type:
+ - string
+ - "null"
+ headline:
+ type:
+ - string
+ - "null"
+ initial:
+ type:
+ - string
+ - "null"
+ meta_id:
+ type:
+ - string
+ - "null"
+ name:
+ type:
+ - string
+ - "null"
+ origin:
+ type:
+ - string
+ - "null"
+ overall_score:
+ type:
+ - object
+ - "null"
+ properties:
+ average_score:
+ type:
+ - number
+ - "null"
+ good:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ neutral:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ poor:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ score:
+ type:
+ - number
+ - "null"
+ scored_count:
+ type:
+ - number
+ - "null"
+ very_good:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ very_poor:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ phone_number:
+ type:
+ - string
+ - "null"
+ pos_id:
+ type:
+ - string
+ - "null"
+ position_id:
+ type:
+ - string
+ - "null"
+ profile_photo_url:
+ type:
+ - string
+ - "null"
+ resume:
+ type:
+ - object
+ - "null"
+ properties:
+ _id:
+ type:
+ - string
+ - "null"
+ error:
+ type:
+ - boolean
+ - "null"
+ file_name:
+ type:
+ - string
+ - "null"
+ url:
+ type:
+ - string
+ - "null"
+ source:
+ type:
+ - object
+ - "null"
+ properties:
+ type:
+ type:
+ - string
+ - "null"
+ id:
+ type:
+ - string
+ - "null"
+ name:
+ type:
+ - string
+ - "null"
+ stage:
+ type:
+ - string
+ - "null"
+ tags:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - string
+ - "null"
+ updated_date:
+ type:
+ - string
+ - "null"
+ pipelines:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ _id:
+ type:
+ - string
+ - "null"
+ name:
+ type:
+ - string
+ - "null"
diff --git a/airbyte-integrations/connectors/source-breezy-hr/metadata.yaml b/airbyte-integrations/connectors/source-breezy-hr/metadata.yaml
new file mode 100644
index 000000000000..4308b889356a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezy-hr/metadata.yaml
@@ -0,0 +1,36 @@
+metadataSpecVersion: "1.0"
+data:
+ allowedHosts:
+ hosts:
+ - "*"
+ registryOverrides:
+ oss:
+ enabled: true
+ cloud:
+ enabled: true
+ remoteRegistries:
+ pypi:
+ enabled: false
+ packageName: airbyte-source-breezy-hr
+ connectorBuildOptions:
+ baseImage: docker.io/airbyte/source-declarative-manifest:4.5.2@sha256:efe8a454f740dc6a07252c4a457777e7c81d95f0d2ea8e9d68114d3610e9a602
+ connectorSubtype: api
+ connectorType: source
+ definitionId: bc2c2e4f-41a1-40e3-9e82-eea19cf958ff
+ dockerImageTag: 0.0.1
+ dockerRepository: airbyte/source-breezy-hr
+ githubIssueLabel: source-breezy-hr
+ icon: icon.svg
+ license: MIT
+ name: Breezy HR
+ releaseDate: 2024-08-20
+ releaseStage: alpha
+ supportLevel: community
+ documentationUrl: https://docs.airbyte.com/integrations/sources/breezy-hr
+ tags:
+ - language:manifest-only
+ - cdk:low-code
+
+ ab_internal:
+ ql: 100
+ sl: 100
diff --git a/docs/integrations/sources/breezy-hr.md b/docs/integrations/sources/breezy-hr.md
new file mode 100644
index 000000000000..eeaae996b736
--- /dev/null
+++ b/docs/integrations/sources/breezy-hr.md
@@ -0,0 +1,27 @@
+# Breezy HR
+An Airbyte source for Breezy applicant tracking system.
+## Configuration
+
+| Input | Type | Description | Default Value |
+|-------|------|-------------|---------------|
+| `api_key` | `string` | API Key. | |
+| `company_id` | `string` | Company ID. | |
+
+## Streams
+| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental |
+|-------------|-------------|------------|---------------------|----------------------|
+| positions | | No pagination | ✅ | ❌ |
+| candidates | | No pagination | ✅ | ❌ |
+| pipelines | | No pagination | ✅ | ❌ |
+
+
+## Changelog
+
+
+ Expand to review
+
+| Version | Date | Subject |
+|------------------|------------|----------------|
+| 0.0.1 | 2024-08-20 | Initial release by natikgadzhi via Connector Builder|
+
+
\ No newline at end of file