diff --git a/airbyte-integrations/connectors/source-workflowmax/README.md b/airbyte-integrations/connectors/source-workflowmax/README.md
new file mode 100644
index 000000000000..3a04f1980335
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workflowmax/README.md
@@ -0,0 +1,55 @@
+# Workflowmax
+This directory contains the manifest-only connector for [`source-workflowmax`](https://app.workflowmax2.com/).
+
+## Documentation reference:
+Visit `https://app.swaggerhub.com/apis-docs/WorkflowMax-BlueRock/WorkflowMax-BlueRock-OpenAPI3/0.1#/` for V1 API documentation
+
+## Authentication setup
+`Workflowmax` uses bearer token authentication, You have to input your bearer access_token in the field of API key for authentication.
+
+### Using postman to get access token
+- Move to Authorization tab of an empty http request and selected Oauth 2.0
+- Set use token type as `access token`
+- Set header prefix as `Bearer`
+- Set grant type as `Authorization code`
+- Check `Authorize using browser`
+- Set Auth URL as `https://oauth.workflowmax2.com/oauth/authorize`
+- Set Access token URL as `https://oauth.workflowmax2.com/oauth/token`
+- Set Client ID, Client secret, Scope defined as your Workflowmax settings, Example Scope: `openid profile email workflowmax offline_access`
+- Set state as any number, Example: `1`
+- Set Client Authentication as `Send as Basic Auth Header`
+ Click `Get New Access Token` for retrieving access token
+
+Then authorize your source with the required information.
+1. Go to set up `The Source` page.
+2. Enter your Workflowmax application's access token.
+3. Click Save button.
+
+## 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-workflowmax:dev`) that you can use to test the connector locally.
+```bash
+airbyte-ci connectors --name=source-workflowmax build
+```
+
+### Test
+This will run the acceptance tests for the connector.
+```bash
+airbyte-ci connectors --name=source-workflowmax test
+```
+
diff --git a/airbyte-integrations/connectors/source-workflowmax/acceptance-test-config.yml b/airbyte-integrations/connectors/source-workflowmax/acceptance-test-config.yml
new file mode 100644
index 000000000000..94c3a754f01a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workflowmax/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-workflowmax: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-workflowmax/icon.svg b/airbyte-integrations/connectors/source-workflowmax/icon.svg
new file mode 100644
index 000000000000..ce32a309886f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workflowmax/icon.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/airbyte-integrations/connectors/source-workflowmax/manifest.yaml b/airbyte-integrations/connectors/source-workflowmax/manifest.yaml
new file mode 100644
index 000000000000..727c44efa06a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workflowmax/manifest.yaml
@@ -0,0 +1,2275 @@
+version: 5.12.0
+
+type: DeclarativeSource
+
+description: >-
+ Website: https://app.workflowmax2.com/
+
+ API Documentation:
+ https://app.swaggerhub.com/apis-docs/WorkflowMax-BlueRock/WorkflowMax-BlueRock-OpenAPI3/0.1#/
+
+check:
+ type: CheckStream
+ stream_names:
+ - stafflist
+
+definitions:
+ streams:
+ stafflist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: staff.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: '{{ config["account_id"] }}'
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - StaffList
+ - Staff
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: stafflist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/stafflist"
+ clientlist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: client.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Clients
+ - Client
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: clientlist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/clientlist"
+ clients_documents:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: client.api/documents/{{ stream_partition.uuid }}
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: '{{ config["account_id"] }}'
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Documents
+ - Document
+ partition_router:
+ type: SubstreamPartitionRouter
+ parent_stream_configs:
+ - type: ParentStreamConfig
+ parent_key: UUID
+ partition_field: uuid
+ stream:
+ $ref: "#/definitions/streams/clientlist"
+ name: clients_documents
+ primary_key:
+ - uuid
+ transformations:
+ - type: AddFields
+ fields:
+ - path:
+ - uuid
+ value: "{{ now_utc() }}"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/clients_documents"
+ clientgrouplist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: clientgroup.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Groups
+ - Group
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: clientgrouplist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/clientgrouplist"
+ costlist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: cost.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Costs
+ - Cost
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: costlist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/costlist"
+ invoice_current:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: invoice.api/current
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Invoices
+ - Invoice
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: invoice_current
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/invoice_current"
+ invoicelist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: invoice.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Invoices
+ - Invoice
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: invoicelist
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: Date
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/invoicelist"
+ joblist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: job.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Jobs
+ - Job
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: joblist
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: DateModifiedUtc
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/joblist"
+ job_tasks:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: job.api/tasks
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Jobs
+ - Job
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: job_tasks
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: DateModifiedUtc
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/job_tasks"
+ leadlist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: lead.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Leads
+ - Lead
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: leadlist
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: Date
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/leadlist"
+ purchaseorderlist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: purchaseorder.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - PurchaseOrders
+ - PurchaseOrder
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: purchaseorderlist
+ primary_key:
+ - ID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: Date
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/purchaseorderlist"
+ tasklist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: task.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - TaskList
+ - Task
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: tasklist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/tasklist"
+ quotelist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: quote.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: "{{ config['account_id'] }}"
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Quotes
+ - Quote
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: quotelist
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: Date
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/quotelist"
+ supplierlist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: supplier.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: '{{ config["account_id"] }}'
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Suppliers
+ - Supplier
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: supplierlist
+ primary_key:
+ - UUID
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/supplierlist"
+ timelist:
+ type: DeclarativeStream
+ retriever:
+ type: SimpleRetriever
+ decoder:
+ type: XmlDecoder
+ requester:
+ $ref: "#/definitions/base_requester"
+ path: time.api/list
+ http_method: GET
+ request_headers:
+ accept: application/json
+ account_id: '{{ config["account_id"] }}'
+ 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 limits hit
+ record_selector:
+ type: RecordSelector
+ extractor:
+ type: DpathExtractor
+ field_path:
+ - Response
+ - Times
+ - Time
+ paginator:
+ type: DefaultPaginator
+ page_token_option:
+ type: RequestOption
+ inject_into: request_parameter
+ field_name: page
+ page_size_option:
+ type: RequestOption
+ field_name: per_page
+ inject_into: request_parameter
+ pagination_strategy:
+ type: PageIncrement
+ start_from_page: 1
+ page_size: 100
+ inject_on_first_request: true
+ name: timelist
+ primary_key:
+ - UUID
+ incremental_sync:
+ type: DatetimeBasedCursor
+ cursor_field: Date
+ cursor_datetime_formats:
+ - "%Y-%m-%dT%H:%M:%S.%fZ"
+ - "%Y-%m-%dT%H:%M:%S.%f%z"
+ - "%Y-%m-%dT%H:%M:%S"
+ datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ"
+ start_datetime:
+ type: MinMaxDatetime
+ datetime: '{{ config["start_date"] }}'
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
+ start_time_option:
+ type: RequestOption
+ field_name: from
+ inject_into: request_parameter
+ end_time_option:
+ type: RequestOption
+ field_name: to
+ 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"
+ schema_loader:
+ type: InlineSchemaLoader
+ schema:
+ $ref: "#/schemas/timelist"
+ base_requester:
+ type: HttpRequester
+ url_base: https://api.workflowmax2.com/
+ authenticator:
+ type: BearerAuthenticator
+ api_token: '{{ config["api_key_2"] }}'
+
+streams:
+ - $ref: "#/definitions/streams/stafflist"
+ - $ref: "#/definitions/streams/clientlist"
+ - $ref: "#/definitions/streams/clients_documents"
+ - $ref: "#/definitions/streams/clientgrouplist"
+ - $ref: "#/definitions/streams/costlist"
+ - $ref: "#/definitions/streams/invoice_current"
+ - $ref: "#/definitions/streams/invoicelist"
+ - $ref: "#/definitions/streams/joblist"
+ - $ref: "#/definitions/streams/job_tasks"
+ - $ref: "#/definitions/streams/leadlist"
+ - $ref: "#/definitions/streams/purchaseorderlist"
+ - $ref: "#/definitions/streams/tasklist"
+ - $ref: "#/definitions/streams/quotelist"
+ - $ref: "#/definitions/streams/supplierlist"
+ - $ref: "#/definitions/streams/timelist"
+
+spec:
+ type: Spec
+ connection_specification:
+ type: object
+ $schema: http://json-schema.org/draft-07/schema#
+ required:
+ - api_key_2
+ - account_id
+ - start_date
+ properties:
+ api_key_2:
+ type: string
+ order: 0
+ title: API Key
+ airbyte_secret: true
+ account_id:
+ type: string
+ description: The account id for workflowmax
+ order: 1
+ title: Account ID
+ 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:
+ stafflist: true
+ clientlist: true
+ clients_documents: true
+ clientgrouplist: true
+ costlist: true
+ invoice_current: true
+ invoicelist: true
+ joblist: true
+ job_tasks: true
+ leadlist: true
+ purchaseorderlist: true
+ tasklist: true
+ quotelist: true
+ supplierlist: true
+ timelist: true
+ testedStreams:
+ stafflist:
+ streamHash: 0281ff074eaaddd0df15d59a9e380a4d3a2e78f7
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ clientlist:
+ streamHash: ed44da9fa9dede0bc317bd77fd7c5ea703c87984
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ clients_documents:
+ streamHash: eaefdc9fbdc6601e406e568c20d31b54b094ded1
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ clientgrouplist:
+ streamHash: fb0a03a180e3c7dcd5f656b36f7e38e81cf3ffbc
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ costlist:
+ streamHash: 9f6bf81d11204f550546939f31b62294c8ddda62
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ invoice_current:
+ streamHash: 9e10c89d53f93d2605368d088f16ea9844c673fa
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ invoicelist:
+ streamHash: 81044cef1059acff4b8fe3d356745188974d5e53
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ joblist:
+ streamHash: 04869000bc6ae9fd7002ac2753b32da85d74585a
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ job_tasks:
+ streamHash: 091958d11795783980a11c1ac66af864f0d959a4
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ leadlist:
+ streamHash: 9b33ad5d3be07bc0e75daa324c891fa144472654
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ purchaseorderlist:
+ streamHash: e27532c632350ef5f0d5df0d5fd1bd3ea00944e9
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ tasklist:
+ streamHash: 3f627ebd2139cb196ef8b5f46d91e8a1f776aee9
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ quotelist:
+ streamHash: 03bdc0373f16d0230a3fe260b2c89b60444ec6f8
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ supplierlist:
+ streamHash: 6e4845faf573b7fc9931be4b85dd2197612ea395
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ timelist:
+ streamHash: b308b2b28e6e7f0749d0642b27061b943365efb5
+ hasResponse: true
+ responsesAreSuccessful: true
+ hasRecords: true
+ primaryKeysArePresent: true
+ primaryKeysAreUnique: true
+ assist: {}
+
+schemas:
+ stafflist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Address:
+ type:
+ - string
+ - "null"
+ Email:
+ type:
+ - string
+ - "null"
+ Mobile:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ PayrollCode:
+ type:
+ - string
+ - "null"
+ Phone:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ WebURL:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ clientlist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ AccountManager:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Address:
+ type:
+ - string
+ - "null"
+ City:
+ type:
+ - string
+ - "null"
+ Contacts:
+ type:
+ - object
+ - "null"
+ properties:
+ Contact:
+ type:
+ - array
+ - "null"
+ items:
+ type:
+ - object
+ - "null"
+ properties:
+ Addressee:
+ type:
+ - string
+ - "null"
+ Email:
+ type:
+ - string
+ - "null"
+ IsPrimary:
+ type:
+ - string
+ - "null"
+ Mobile:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Phone:
+ type:
+ - string
+ - "null"
+ Position:
+ type:
+ - string
+ - "null"
+ Salutation:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Country:
+ type:
+ - string
+ - "null"
+ Fax:
+ type:
+ - string
+ - "null"
+ IsArchived:
+ type:
+ - string
+ - "null"
+ IsDeleted:
+ type:
+ - string
+ - "null"
+ IsProspect:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Phone:
+ type:
+ - string
+ - "null"
+ PostCode:
+ type:
+ - string
+ - "null"
+ PostalAddress:
+ type:
+ - string
+ - "null"
+ ReferralSource:
+ type:
+ - string
+ - "null"
+ Type:
+ type:
+ - object
+ - "null"
+ properties: {}
+ UUID:
+ type: string
+ WebURL:
+ type:
+ - string
+ - "null"
+ Website:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ clients_documents:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ CreatedBy:
+ type:
+ - string
+ - "null"
+ Date:
+ type:
+ - string
+ - "null"
+ Folder:
+ type:
+ - string
+ - "null"
+ Text:
+ type:
+ - string
+ - "null"
+ Title:
+ type:
+ - string
+ - "null"
+ URL:
+ type:
+ - string
+ - "null"
+ uuid:
+ type: string
+ required:
+ - uuid
+ clientgrouplist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ Taxable:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ costlist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Code:
+ type:
+ - string
+ - "null"
+ Description:
+ type:
+ - string
+ - "null"
+ Note:
+ type:
+ - string
+ - "null"
+ Supplier:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ UnitCost:
+ type:
+ - string
+ - "null"
+ UnitPrice:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ invoice_current:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Amount:
+ type:
+ - string
+ - "null"
+ AmountIncludingTax:
+ type:
+ - string
+ - "null"
+ AmountOutstanding:
+ type:
+ - string
+ - "null"
+ AmountPaid:
+ type:
+ - string
+ - "null"
+ AmountTax:
+ type:
+ - string
+ - "null"
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Contact:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Date:
+ type:
+ - string
+ - "null"
+ Description:
+ type:
+ - string
+ - "null"
+ DueDate:
+ type:
+ - string
+ - "null"
+ ID:
+ type:
+ - string
+ - "null"
+ JobText:
+ type:
+ - string
+ - "null"
+ Status:
+ type:
+ - string
+ - "null"
+ Type:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ invoicelist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Amount:
+ type:
+ - string
+ - "null"
+ AmountIncludingTax:
+ type:
+ - string
+ - "null"
+ AmountOutstanding:
+ type:
+ - string
+ - "null"
+ AmountPaid:
+ type:
+ - string
+ - "null"
+ AmountTax:
+ type:
+ - string
+ - "null"
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Contact:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Date:
+ type: string
+ Description:
+ type:
+ - string
+ - "null"
+ DueDate:
+ type:
+ - string
+ - "null"
+ ID:
+ type:
+ - string
+ - "null"
+ JobText:
+ type:
+ - string
+ - "null"
+ Status:
+ type:
+ - string
+ - "null"
+ Type:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ - Date
+ joblist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Assigned:
+ type:
+ - object
+ - "null"
+ properties:
+ Staff:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Budget:
+ type:
+ - string
+ - "null"
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ ClientOrderNumber:
+ type:
+ - string
+ - "null"
+ DateCreatedUtc:
+ type:
+ - string
+ - "null"
+ DateModifiedUtc:
+ type: string
+ Description:
+ type:
+ - string
+ - "null"
+ DueDate:
+ type:
+ - string
+ - "null"
+ ID:
+ type:
+ - string
+ - "null"
+ Manager:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Partner:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ StartDate:
+ type:
+ - string
+ - "null"
+ State:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ WebURL:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ - DateModifiedUtc
+ job_tasks:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Assigned:
+ type:
+ - object
+ - "null"
+ properties:
+ Staff:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Budget:
+ type:
+ - string
+ - "null"
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ ClientOrderNumber:
+ type:
+ - string
+ - "null"
+ Contact:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ DateCreatedUtc:
+ type:
+ - string
+ - "null"
+ DateModifiedUtc:
+ type: string
+ Description:
+ type:
+ - string
+ - "null"
+ DueDate:
+ type:
+ - string
+ - "null"
+ ID:
+ type:
+ - string
+ - "null"
+ Manager:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Partner:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ StartDate:
+ type:
+ - string
+ - "null"
+ State:
+ type:
+ - string
+ - "null"
+ Tasks:
+ type:
+ - object
+ - "null"
+ properties:
+ Task:
+ type:
+ - object
+ - "null"
+ properties:
+ ActualMinutes:
+ type:
+ - string
+ - "null"
+ Assigned:
+ type:
+ - object
+ - "null"
+ properties:
+ Staff:
+ type:
+ - object
+ - "null"
+ properties:
+ AllocatedMinutes:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Billable:
+ type:
+ - string
+ - "null"
+ Completed:
+ type:
+ - string
+ - "null"
+ Description:
+ type:
+ - string
+ - "null"
+ DueDate:
+ type:
+ - string
+ - "null"
+ EstimatedMinutes:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ StartDate:
+ type:
+ - string
+ - "null"
+ TaskUUID:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ WebURL:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ - DateModifiedUtc
+ leadlist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Contact:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Date:
+ type: string
+ Description:
+ type:
+ - string
+ - "null"
+ Dropbox:
+ type:
+ - string
+ - "null"
+ EstimatedValue:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Owner:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ State:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ - Date
+ purchaseorderlist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Amount:
+ type:
+ - string
+ - "null"
+ AmountIncludingTax:
+ type:
+ - string
+ - "null"
+ AmountTax:
+ type:
+ - string
+ - "null"
+ Date:
+ type: string
+ DeliveryAddress:
+ type:
+ - string
+ - "null"
+ Description:
+ type:
+ - string
+ - "null"
+ ID:
+ type: string
+ Job:
+ type:
+ - object
+ - "null"
+ properties:
+ ID:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ State:
+ type:
+ - string
+ - "null"
+ Supplier:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ required:
+ - ID
+ - Date
+ tasklist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Description:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ quotelist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Amount:
+ type:
+ - string
+ - "null"
+ AmountIncludingTax:
+ type:
+ - string
+ - "null"
+ AmountTax:
+ type:
+ - string
+ - "null"
+ Budget:
+ type:
+ - string
+ - "null"
+ Client:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Contact:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Date:
+ type: string
+ Description:
+ type:
+ - string
+ - "null"
+ EstimatedCost:
+ type:
+ - string
+ - "null"
+ EstimatedCostIncludingTax:
+ type:
+ - string
+ - "null"
+ EstimatedCostTax:
+ type:
+ - string
+ - "null"
+ ID:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ OptionExplanation:
+ type:
+ - string
+ - "null"
+ State:
+ type:
+ - string
+ - "null"
+ Type:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ ValidDate:
+ type:
+ - string
+ - "null"
+ required:
+ - UUID
+ - Date
+ supplierlist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Fax:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Phone:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ timelist:
+ type: object
+ $schema: http://json-schema.org/schema#
+ additionalProperties: true
+ properties:
+ Billable:
+ type:
+ - string
+ - "null"
+ Date:
+ type: string
+ Job:
+ type:
+ - object
+ - "null"
+ properties:
+ ID:
+ type:
+ - string
+ - "null"
+ Name:
+ type:
+ - string
+ - "null"
+ Minutes:
+ type:
+ - string
+ - "null"
+ Note:
+ type:
+ - string
+ - "null"
+ Staff:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ Task:
+ type:
+ - object
+ - "null"
+ properties:
+ Name:
+ type:
+ - string
+ - "null"
+ UUID:
+ type:
+ - string
+ - "null"
+ UUID:
+ type: string
+ required:
+ - UUID
+ - Date
diff --git a/airbyte-integrations/connectors/source-workflowmax/metadata.yaml b/airbyte-integrations/connectors/source-workflowmax/metadata.yaml
new file mode 100644
index 000000000000..18395f04071c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workflowmax/metadata.yaml
@@ -0,0 +1,35 @@
+metadataSpecVersion: "1.0"
+data:
+ allowedHosts:
+ hosts:
+ - "api.workflowmax2.com"
+ registryOverrides:
+ oss:
+ enabled: true
+ cloud:
+ enabled: true
+ remoteRegistries:
+ pypi:
+ enabled: false
+ packageName: airbyte-source-workflowmax
+ connectorBuildOptions:
+ baseImage: docker.io/airbyte/source-declarative-manifest:5.13.0@sha256:ffc5977f59e1f38bf3f5dd70b6fa0520c2450ebf85153c5a8df315b8c918d5c3
+ connectorSubtype: api
+ connectorType: source
+ definitionId: a3eb6410-f3c3-48ba-8b27-29a56de1e9db
+ dockerImageTag: 0.0.1
+ dockerRepository: airbyte/source-workflowmax
+ githubIssueLabel: source-workflowmax
+ icon: icon.svg
+ license: MIT
+ name: Workflowmax
+ releaseDate: 2024-10-13
+ releaseStage: alpha
+ supportLevel: community
+ documentationUrl: https://docs.airbyte.com/integrations/sources/workflowmax
+ tags:
+ - language:manifest-only
+ - cdk:low-code
+ ab_internal:
+ ql: 100
+ sl: 100
diff --git a/docs/integrations/sources/workflowmax.md b/docs/integrations/sources/workflowmax.md
new file mode 100644
index 000000000000..3d12baa3de93
--- /dev/null
+++ b/docs/integrations/sources/workflowmax.md
@@ -0,0 +1,65 @@
+# Workflowmax
+This directory contains the manifest-only connector for [`source-workflowmax`](https://app.workflowmax2.com/).
+
+## Documentation reference:
+Visit `https://app.swaggerhub.com/apis-docs/WorkflowMax-BlueRock/WorkflowMax-BlueRock-OpenAPI3/0.1#/` for V1 API documentation
+
+## Authentication setup
+`Workflowmax` uses bearer token authentication, You have to input your bearer access_token in the field of API key for authentication.
+
+### Using postman to get access token
+- Move to Authorization tab of an empty http request and selected Oauth 2.0
+- Set use token type as `access token`
+- Set header prefix as `Bearer`
+- Set grant type as `Authorization code`
+- Check `Authorize using browser`
+- Set Auth URL as `https://oauth.workflowmax2.com/oauth/authorize`
+- Set Access token URL as `https://oauth.workflowmax2.com/oauth/token`
+- Set Client ID, Client secret, Scope defined as your Workflowmax settings, Example Scope: `openid profile email workflowmax offline_access`
+- Set state as any number, Example: `1`
+- Set Client Authentication as `Send as Basic Auth Header`
+ Click `Get New Access Token` for retrieving access token
+
+Then authorize your source with the required information.
+1. Go to set up `The Source` page.
+2. Enter your Workflowmax application's access token.
+3. Click Save button.
+
+
+## Configuration
+
+| Input | Type | Description | Default Value |
+|-------|------|-------------|---------------|
+| `api_key_2` | `string` | API Key. | |
+| `account_id` | `string` | Account ID. The account id for workflowmax | |
+| `start_date` | `string` | Start date. | |
+
+## Streams
+| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental |
+|-------------|-------------|------------|---------------------|----------------------|
+| stafflist | UUID | DefaultPaginator | ✅ | ❌ |
+| clientlist | UUID | DefaultPaginator | ✅ | ❌ |
+| clients_documents | uuid | No pagination | ✅ | ❌ |
+| clientgrouplist | UUID | DefaultPaginator | ✅ | ❌ |
+| costlist | UUID | DefaultPaginator | ✅ | ❌ |
+| invoice_current | UUID | DefaultPaginator | ✅ | ❌ |
+| invoicelist | UUID | DefaultPaginator | ✅ | ✅ |
+| joblist | UUID | DefaultPaginator | ✅ | ✅ |
+| job_tasks | UUID | DefaultPaginator | ✅ | ✅ |
+| leadlist | UUID | DefaultPaginator | ✅ | ✅ |
+| purchaseorderlist | ID | DefaultPaginator | ✅ | ✅ |
+| tasklist | UUID | DefaultPaginator | ✅ | ❌ |
+| quotelist | UUID | DefaultPaginator | ✅ | ✅ |
+| supplierlist | UUID | DefaultPaginator | ✅ | ❌ |
+| timelist | UUID | DefaultPaginator | ✅ | ✅ |
+
+## Changelog
+
+
+ Expand to review
+
+| Version | Date | Pull Request | Subject |
+|------------------|-------------------|--------------|----------------|
+| 0.0.1 | 2024-10-13 | [46866](https://github.com/airbytehq/airbyte/pull/46866) | Initial release by [@btkcodedev](https://github.com/btkcodedev) via Connector Builder |
+
+