This is an automated email from the ASF dual-hosted git repository.
davidzollo pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 6fc40c206c [Feature][Connector-V2][Zendesk] Add Zendesk source
connector (#11030)
6fc40c206c is described below
commit 6fc40c206c7c4eda8a29725400bd84546da39188
Author: Gabriel Baldez <[email protected]>
AuthorDate: Tue Jul 7 12:47:47 2026 -0300
[Feature][Connector-V2][Zendesk] Add Zendesk source connector (#11030)
---
.../connectors/changelog/connector-http-zendesk.md | 6 ++
docs/en/connectors/source/Zendesk.md | 108 +++++++++++++++++++++
.../connectors/changelog/connector-http-zendesk.md | 6 ++
docs/zh/connectors/source/Zendesk.md | 108 +++++++++++++++++++++
plugin-mapping.properties | 1 +
.../{ => connector-http-zendesk}/pom.xml | 30 +++---
.../seatunnel/zendesk/source/ZendeskSource.java | 54 +++++++++++
.../zendesk/source/ZendeskSourceFactory.java | 53 ++++++++++
.../source/config/ZendeskSourceOptions.java | 41 ++++++++
.../source/config/ZendeskSourceParameter.java | 45 +++++++++
.../seatunnel/zendesk/ZendeskFactoryTest.java | 31 ++++++
.../zendesk/ZendeskSourceParameterTest.java | 61 ++++++++++++
seatunnel-connectors-v2/connector-http/pom.xml | 1 +
seatunnel-dist/pom.xml | 6 ++
14 files changed, 532 insertions(+), 19 deletions(-)
diff --git a/docs/en/connectors/changelog/connector-http-zendesk.md
b/docs/en/connectors/changelog/connector-http-zendesk.md
new file mode 100644
index 0000000000..1cf41e674b
--- /dev/null
+++ b/docs/en/connectors/changelog/connector-http-zendesk.md
@@ -0,0 +1,6 @@
+<details><summary> Change Log </summary>
+
+| Change | Commit | Version |
+| --- | --- | --- |
+
+</details>
diff --git a/docs/en/connectors/source/Zendesk.md
b/docs/en/connectors/source/Zendesk.md
new file mode 100644
index 0000000000..94b7382a8d
--- /dev/null
+++ b/docs/en/connectors/source/Zendesk.md
@@ -0,0 +1,108 @@
+import ChangeLog from '../changelog/connector-http-zendesk.md';
+
+# Zendesk
+
+> Zendesk source connector
+
+## Description
+
+Used to read data from the [Zendesk REST
API](https://developer.zendesk.com/api-reference/). It authenticates with a
Zendesk account email and API token (sent as an HTTP Basic `Authorization`
header) and reads a Zendesk endpoint such as tickets, users, or organizations
into SeaTunnel rows.
+
+## Key features
+
+- [x] [batch](../../introduction/concepts/connector-v2-features.md)
+- [ ] [stream](../../introduction/concepts/connector-v2-features.md)
+- [ ] [exactly-once](../../introduction/concepts/connector-v2-features.md)
+- [x] [column projection](../../introduction/concepts/connector-v2-features.md)
+- [ ] [parallelism](../../introduction/concepts/connector-v2-features.md)
+- [ ] [support user-defined
split](../../introduction/concepts/connector-v2-features.md)
+
+## Options
+
+| name | type | required | default value |
+|-----------------------------|---------|----------|---------------|
+| url | String | Yes | - |
+| email | String | Yes | - |
+| api_token | String | Yes | - |
+| method | String | No | get |
+| schema | Config | No | - |
+| format | String | No | text |
+| params | Map | No | - |
+| body | String | No | - |
+| json_field | Config | No | - |
+| content_field | String | No | - |
+| poll_interval_millis | int | No | - |
+| retry | int | No | - |
+| retry_backoff_multiplier_ms | int | No | 100 |
+| retry_backoff_max_ms | int | No | 10000 |
+| enable_multi_lines | boolean | No | false |
+| common-options | config | No | - |
+
+### url [String]
+
+The Zendesk REST API endpoint to read from, for example
`https://your-subdomain.zendesk.com/api/v2/tickets.json`.
+
+### email [String]
+
+The Zendesk account email used for API token authentication. It is combined
with `api_token` as `{email}/token:{api_token}` and sent as an HTTP Basic
`Authorization` header.
+
+### api_token [String]
+
+The Zendesk API token. See the [Zendesk API token
docs](https://support.zendesk.com/hc/en-us/articles/4408889192858) for how to
generate one.
+
+### method [String]
+
+http request method, only supports GET, POST method.
+
+### schema [Config]
+
+The structure of the data, including field names and field types. For more
details, please refer to [Schema
Feature](../../introduction/concepts/schema-feature.md).
+
+### format [String]
+
+the format of upstream data, now only support `json` `text`, default `text`.
+
+### params [Map]
+
+http params
+
+### json_field [Config]
+
+This parameter helps you configure the schema, so this parameter must be used
with schema. It maps JSON paths in the response to schema fields. See the [Http
source](./Http.md) connector for details and examples.
+
+### content_field [String]
+
+This parameter can extract a sub-section of the JSON response (for example the
array under a top-level key such as `tickets` or `users`) before mapping to
rows. See the [Http source](./Http.md) connector for details and examples.
+
+### common options
+
+Source plugin common parameters, please refer to [Source Common
Options](../common-options/source-common-options.md) for details.
+
+## Example
+
+```hocon
+source {
+ Zendesk {
+ url = "https://your-subdomain.zendesk.com/api/v2/tickets.json"
+ email = "[email protected]"
+ api_token = "${ZENDESK_API_TOKEN}"
+ method = "GET"
+ format = "json"
+ content_field = "$.tickets.*"
+ schema = {
+ fields {
+ id = bigint
+ subject = string
+ status = string
+ priority = string
+ created_at = string
+ updated_at = string
+ }
+ }
+ }
+}
+```
+
+## Changelog
+
+<ChangeLog />
diff --git a/docs/zh/connectors/changelog/connector-http-zendesk.md
b/docs/zh/connectors/changelog/connector-http-zendesk.md
new file mode 100644
index 0000000000..1cf41e674b
--- /dev/null
+++ b/docs/zh/connectors/changelog/connector-http-zendesk.md
@@ -0,0 +1,6 @@
+<details><summary> Change Log </summary>
+
+| Change | Commit | Version |
+| --- | --- | --- |
+
+</details>
diff --git a/docs/zh/connectors/source/Zendesk.md
b/docs/zh/connectors/source/Zendesk.md
new file mode 100644
index 0000000000..963c4f1b57
--- /dev/null
+++ b/docs/zh/connectors/source/Zendesk.md
@@ -0,0 +1,108 @@
+import ChangeLog from '../changelog/connector-http-zendesk.md';
+
+# Zendesk
+
+> Zendesk 数据源连接器
+
+## 描述
+
+用于从 [Zendesk REST API](https://developer.zendesk.com/api-reference/) 读取数据。它使用
Zendesk 账号邮箱和 API token 进行认证(以 HTTP Basic `Authorization` 请求头发送),并将某个 Zendesk
接口(如 tickets、users、organizations)读取为 SeaTunnel 的行数据。
+
+## 主要特性
+
+- [x] [批处理](../../introduction/concepts/connector-v2-features.md)
+- [ ] [流处理](../../introduction/concepts/connector-v2-features.md)
+- [ ] [精确一次](../../introduction/concepts/connector-v2-features.md)
+- [x] [列投影](../../introduction/concepts/connector-v2-features.md)
+- [ ] [并行度](../../introduction/concepts/connector-v2-features.md)
+- [ ] [支持用户自定义分片](../../introduction/concepts/connector-v2-features.md)
+
+## 选项
+
+| 名称 | 类型 | 是否必填 | 默认值 |
+|-----------------------------|---------|----------|-----------|
+| url | String | 是 | - |
+| email | String | 是 | - |
+| api_token | String | 是 | - |
+| method | String | 否 | get |
+| schema | Config | 否 | - |
+| format | String | 否 | text |
+| params | Map | 否 | - |
+| body | String | 否 | - |
+| json_field | Config | 否 | - |
+| content_field | String | 否 | - |
+| poll_interval_millis | int | 否 | - |
+| retry | int | 否 | - |
+| retry_backoff_multiplier_ms | int | 否 | 100 |
+| retry_backoff_max_ms | int | 否 | 10000 |
+| enable_multi_lines | boolean | 否 | false |
+| common-options | config | 否 | - |
+
+### url [String]
+
+要读取的 Zendesk REST API 接口地址,例如
`https://your-subdomain.zendesk.com/api/v2/tickets.json`。
+
+### email [String]
+
+用于 API token 认证的 Zendesk 账号邮箱。它会与 `api_token` 组合为 `{email}/token:{api_token}`
并以 HTTP Basic `Authorization` 请求头发送。
+
+### api_token [String]
+
+Zendesk API token。获取方式请参考 [Zendesk API token
文档](https://support.zendesk.com/hc/en-us/articles/4408889192858)。
+
+### method [String]
+
+http 请求方法,仅支持 GET、POST 方法。
+
+### schema [Config]
+
+数据的结构,包括字段名称和字段类型。更多详情请参考 [Schema
Feature](../../introduction/concepts/schema-feature.md)。
+
+### format [String]
+
+上游数据的格式,目前仅支持 `json` 和 `text`,默认 `text`。
+
+### params [Map]
+
+http 请求参数。
+
+### json_field [Config]
+
+该参数用于配置 schema,因此必须与 schema 一起使用。它将响应中的 JSON 路径映射到 schema 字段。详情和示例请参考 [Http
source](./Http.md) 连接器。
+
+### content_field [String]
+
+该参数可以在映射为行之前,提取 JSON 响应中的某个子部分(例如顶层键 `tickets` 或 `users` 下的数组)。详情和示例请参考 [Http
source](./Http.md) 连接器。
+
+### common options
+
+数据源插件通用参数,详情请参考 [Source Common
Options](../common-options/source-common-options.md)。
+
+## 示例
+
+```hocon
+source {
+ Zendesk {
+ url = "https://your-subdomain.zendesk.com/api/v2/tickets.json"
+ email = "[email protected]"
+ api_token = "${ZENDESK_API_TOKEN}"
+ method = "GET"
+ format = "json"
+ content_field = "$.tickets.*"
+ schema = {
+ fields {
+ id = bigint
+ subject = string
+ status = string
+ priority = string
+ created_at = string
+ updated_at = string
+ }
+ }
+ }
+}
+```
+
+## 变更日志
+
+<ChangeLog />
diff --git a/plugin-mapping.properties b/plugin-mapping.properties
index 838c9fa4d4..e33882e199 100644
--- a/plugin-mapping.properties
+++ b/plugin-mapping.properties
@@ -96,6 +96,7 @@ seatunnel.sink.Tablestore = connector-tablestore
seatunnel.source.Tablestore = connector-tablestore
seatunnel.source.Lemlist = connector-http-lemlist
seatunnel.source.Klaviyo = connector-http-klaviyo
+seatunnel.source.Zendesk = connector-http-zendesk
seatunnel.sink.Slack = connector-slack
seatunnel.source.OneSignal = connector-http-onesignal
seatunnel.source.Jira = connector-http-jira
diff --git a/seatunnel-connectors-v2/connector-http/pom.xml
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/pom.xml
similarity index 59%
copy from seatunnel-connectors-v2/connector-http/pom.xml
copy to seatunnel-connectors-v2/connector-http/connector-http-zendesk/pom.xml
index 6842f7c413..cac65b0721 100644
--- a/seatunnel-connectors-v2/connector-http/pom.xml
+++ b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/pom.xml
@@ -22,27 +22,19 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.seatunnel</groupId>
- <artifactId>seatunnel-connectors-v2</artifactId>
+ <artifactId>connector-http</artifactId>
<version>${revision}</version>
</parent>
- <artifactId>connector-http</artifactId>
- <packaging>pom</packaging>
- <name>SeaTunnel : Connectors V2 : Http :</name>
- <modules>
- <module>connector-http-base</module>
- <module>connector-http-feishu</module>
- <module>connector-http-wechat</module>
- <module>connector-http-myhours</module>
- <module>connector-http-lemlist</module>
- <module>connector-http-klaviyo</module>
- <module>connector-http-onesignal</module>
- <module>connector-http-jira</module>
- <module>connector-http-gitlab</module>
- <module>connector-http-github</module>
- <module>connector-http-notion</module>
- <module>connector-http-persistiq</module>
- <module>connector-http-airtable</module>
- </modules>
+ <artifactId>connector-http-zendesk</artifactId>
+ <name>SeaTunnel : Connectors V2 : Http : Zendesk</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.seatunnel</groupId>
+ <artifactId>connector-http-base</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
</project>
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSource.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSource.java
new file mode 100644
index 0000000000..5d3a9ffcc9
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSource.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk.source;
+
+import org.apache.seatunnel.api.configuration.ReadonlyConfig;
+import org.apache.seatunnel.api.table.type.SeaTunnelRow;
+import
org.apache.seatunnel.connectors.seatunnel.common.source.AbstractSingleSplitReader;
+import
org.apache.seatunnel.connectors.seatunnel.common.source.SingleSplitReaderContext;
+import org.apache.seatunnel.connectors.seatunnel.http.source.HttpSource;
+import org.apache.seatunnel.connectors.seatunnel.http.source.HttpSourceReader;
+import
org.apache.seatunnel.connectors.seatunnel.zendesk.source.config.ZendeskSourceParameter;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ZendeskSource extends HttpSource {
+ private final ZendeskSourceParameter zendeskSourceParameter = new
ZendeskSourceParameter();
+
+ public ZendeskSource(ReadonlyConfig pluginConfig) {
+ super(pluginConfig);
+ this.zendeskSourceParameter.buildWithConfig(pluginConfig);
+ }
+
+ @Override
+ public String getPluginName() {
+ return "Zendesk";
+ }
+
+ @Override
+ public AbstractSingleSplitReader<SeaTunnelRow> createReader(
+ SingleSplitReaderContext readerContext) throws Exception {
+ return new HttpSourceReader(
+ this.zendeskSourceParameter,
+ readerContext,
+ this.deserializationSchema,
+ jsonField,
+ contentField);
+ }
+}
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSourceFactory.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSourceFactory.java
new file mode 100644
index 0000000000..52d37b67d3
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/ZendeskSourceFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk.source;
+
+import org.apache.seatunnel.api.configuration.util.OptionRule;
+import org.apache.seatunnel.api.source.SeaTunnelSource;
+import org.apache.seatunnel.api.source.SourceSplit;
+import org.apache.seatunnel.api.table.connector.TableSource;
+import org.apache.seatunnel.api.table.factory.Factory;
+import org.apache.seatunnel.api.table.factory.TableSourceFactoryContext;
+import org.apache.seatunnel.connectors.seatunnel.http.source.HttpSourceFactory;
+import
org.apache.seatunnel.connectors.seatunnel.zendesk.source.config.ZendeskSourceOptions;
+
+import com.google.auto.service.AutoService;
+
+import java.io.Serializable;
+
+@AutoService(Factory.class)
+public class ZendeskSourceFactory extends HttpSourceFactory {
+ @Override
+ public String factoryIdentifier() {
+ return "Zendesk";
+ }
+
+ @Override
+ public <T, SplitT extends SourceSplit, StateT extends Serializable>
+ TableSource<T, SplitT, StateT>
createSource(TableSourceFactoryContext context) {
+ return () -> (SeaTunnelSource<T, SplitT, StateT>) new
ZendeskSource(context.getOptions());
+ }
+
+ @Override
+ public OptionRule optionRule() {
+ return getHttpBuilder()
+ .required(ZendeskSourceOptions.EMAIL)
+ .required(ZendeskSourceOptions.API_TOKEN)
+ .build();
+ }
+}
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceOptions.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceOptions.java
new file mode 100644
index 0000000000..1a02832d66
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceOptions.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk.source.config;
+
+import org.apache.seatunnel.api.configuration.Option;
+import org.apache.seatunnel.api.configuration.Options;
+import org.apache.seatunnel.connectors.seatunnel.http.config.HttpCommonOptions;
+
+public class ZendeskSourceOptions extends HttpCommonOptions {
+ public static final String AUTHORIZATION = "Authorization";
+ public static final String BASIC = "Basic ";
+ public static final String ACCEPT = "Accept";
+ public static final String APPLICATION_JSON = "application/json";
+
+ public static final Option<String> EMAIL =
+ Options.key("email")
+ .stringType()
+ .noDefaultValue()
+ .withDescription("Zendesk account email used for API token
authentication");
+
+ public static final Option<String> API_TOKEN =
+ Options.key("api_token")
+ .stringType()
+ .noDefaultValue()
+ .withDescription("Zendesk API token");
+}
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceParameter.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceParameter.java
new file mode 100644
index 0000000000..2bc6505c0f
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/main/java/org/apache/seatunnel/connectors/seatunnel/zendesk/source/config/ZendeskSourceParameter.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk.source.config;
+
+import org.apache.seatunnel.api.configuration.ReadonlyConfig;
+import org.apache.seatunnel.connectors.seatunnel.http.config.HttpParameter;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.HashMap;
+
+public class ZendeskSourceParameter extends HttpParameter {
+
+ @Override
+ public void buildWithConfig(ReadonlyConfig pluginConfig) {
+ super.buildWithConfig(pluginConfig);
+ // Zendesk API token authentication uses HTTP Basic auth with the form
+ // "{email}/token:{api_token}", see
https://developer.zendesk.com/api-reference
+ this.headers = this.getHeaders() == null ? new HashMap<>() :
this.getHeaders();
+ this.headers.put(ZendeskSourceOptions.ACCEPT,
ZendeskSourceOptions.APPLICATION_JSON);
+ String credentials =
+ pluginConfig.get(ZendeskSourceOptions.EMAIL)
+ + "/token:"
+ + pluginConfig.get(ZendeskSourceOptions.API_TOKEN);
+ String encoded =
+
Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8));
+ this.headers.put(ZendeskSourceOptions.AUTHORIZATION,
ZendeskSourceOptions.BASIC + encoded);
+ this.setHeaders(this.headers);
+ }
+}
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskFactoryTest.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskFactoryTest.java
new file mode 100644
index 0000000000..7e91fde694
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskFactoryTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk;
+
+import
org.apache.seatunnel.connectors.seatunnel.zendesk.source.ZendeskSourceFactory;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+class ZendeskFactoryTest {
+
+ @Test
+ void optionRule() {
+ Assertions.assertNotNull((new ZendeskSourceFactory()).optionRule());
+ }
+}
diff --git
a/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskSourceParameterTest.java
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskSourceParameterTest.java
new file mode 100644
index 0000000000..649af63a16
--- /dev/null
+++
b/seatunnel-connectors-v2/connector-http/connector-http-zendesk/src/test/java/org/apache/seatunnel/connectors/seatunnel/zendesk/ZendeskSourceParameterTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.connectors.seatunnel.zendesk;
+
+import org.apache.seatunnel.api.configuration.ReadonlyConfig;
+import
org.apache.seatunnel.connectors.seatunnel.zendesk.source.config.ZendeskSourceParameter;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+class ZendeskSourceParameterTest {
+
+ @Test
+ void buildWithConfigSetsBasicAuthHeaderAndPreservesExistingHeaders() {
+ Map<String, String> customHeaders = new HashMap<>();
+ customHeaders.put("X-Custom-Header", "custom-value");
+
+ Map<String, Object> options = new HashMap<>();
+ options.put("url",
"https://your-subdomain.zendesk.com/api/v2/tickets.json");
+ options.put("email", "[email protected]");
+ options.put("api_token", "secret-token");
+ options.put("headers", customHeaders);
+
+ ZendeskSourceParameter parameter = new ZendeskSourceParameter();
+ parameter.buildWithConfig(ReadonlyConfig.fromMap(options));
+
+ Map<String, String> headers = parameter.getHeaders();
+ String expected =
+ "Basic "
+ + Base64.getEncoder()
+ .encodeToString(
+ "[email protected]/token:secret-token"
+
.getBytes(StandardCharsets.UTF_8));
+ // Zendesk API-token auth uses HTTP Basic with
{email}/token:{api_token}
+ Assertions.assertEquals(expected, headers.get("Authorization"));
+ // requests ask for a JSON response
+ Assertions.assertEquals("application/json", headers.get("Accept"));
+ // existing custom headers are preserved
+ Assertions.assertEquals("custom-value",
headers.get("X-Custom-Header"));
+ }
+}
diff --git a/seatunnel-connectors-v2/connector-http/pom.xml
b/seatunnel-connectors-v2/connector-http/pom.xml
index 6842f7c413..a3bddc1c59 100644
--- a/seatunnel-connectors-v2/connector-http/pom.xml
+++ b/seatunnel-connectors-v2/connector-http/pom.xml
@@ -43,6 +43,7 @@
<module>connector-http-notion</module>
<module>connector-http-persistiq</module>
<module>connector-http-airtable</module>
+ <module>connector-http-zendesk</module>
</modules>
</project>
diff --git a/seatunnel-dist/pom.xml b/seatunnel-dist/pom.xml
index afe4ca33f7..a318daa163 100644
--- a/seatunnel-dist/pom.xml
+++ b/seatunnel-dist/pom.xml
@@ -232,6 +232,12 @@
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.seatunnel</groupId>
+ <artifactId>connector-http-zendesk</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.apache.seatunnel</groupId>
<artifactId>connector-http-onesignal</artifactId>