diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Service/CorpArchitectureAuthEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Service/CorpArchitectureAuthEvent.cs
new file mode 100644
index 00000000..20629c07
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Events/Service/CorpArchitectureAuthEvent.cs
@@ -0,0 +1,21 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Events
+{
+ ///
+ /// 表示 INFO.corp_arch_auth 事件的数据。
+ /// REF: https://developer.work.weixin.qq.com/document/path/97378
+ ///
+ public class CorpArchitectureAuthEvent : WechatWorkEvent, WechatWorkEvent.Serialization.IXmlSerializable
+ {
+ ///
+ /// 获取或设置第三方应用的 SuiteId。
+ ///
+ [System.Xml.Serialization.XmlElement("SuiteId")]
+ public string SuiteId { get; set; } = default!;
+
+ ///
+ /// 获取或设置授权方的 CorpId。
+ ///
+ [System.Xml.Serialization.XmlElement("AuthCorpId")]
+ public string AuthorizerCorpId { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs
new file mode 100644
index 00000000..326c8d2a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work
+{
+ public static class WechatWorkClientExecuteCgibinIdConvertExtensions
+ {
+ ///
+ /// 异步调用 [POST] /cgi-bin/idconvert/unionid_to_external_userid 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/95926
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinIdConvertUnionIdToExternalUserIdAsync(this WechatWorkClient client, Models.CgibinIdConvertUnionIdToExternalUserIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "idconvert", "unionid_to_external_userid")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/idconvert/batch/external_userid_to_pending_id 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/95926
+ /// REF: https://developer.work.weixin.qq.com/document/path/95900
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinIdConvertBatchExternalUserIdToPendingIdAsync(this WechatWorkClient client, Models.CgibinIdConvertBatchExternalUserIdToPendingIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "idconvert", "batch", "external_userid_to_pending_id")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/idconvert/external_tagid 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/95926
+ /// REF: https://developer.work.weixin.qq.com/document/path/96169
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinIdConvertExternalTagIdAsync(this WechatWorkClient client, Models.CgibinIdConvertExternalTagIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "idconvert", "external_tagid")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/idconvert/open_kfid 接口。
+ /// REF: https://developer.work.weixin.qq.com/document/path/97064
+ /// REF: https://developer.work.weixin.qq.com/document/path/96169
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinIdConvertOpenKfIdAsync(this WechatWorkClient client, Models.CgibinIdConvertOpenKfIdRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "idconvert", "open_kfid")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.cs
new file mode 100644
index 00000000..54abe0fc
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.cs
@@ -0,0 +1,24 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/batch/external_userid_to_pending_id 接口的请求。
+ ///
+ public class CgibinIdConvertBatchExternalUserIdToPendingIdRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置群聊 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("chat_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("chat_id")]
+ public string? ChatId { get; set; }
+
+ ///
+ /// 获取或设置外部联系人账号列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_userid")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_userid")]
+ public IList ExternalUserIdList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs
new file mode 100644
index 00000000..c77a111c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs
@@ -0,0 +1,35 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/batch/external_userid_to_pending_id 接口的响应。
+ ///
+ public class CgibinIdConvertBatchExternalUserIdToPendingIdResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class Result
+ {
+ ///
+ /// 获取或设置外部联系人账号。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_userid")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_userid")]
+ public string ExternalUserId { get; set; } = default!;
+
+ ///
+ /// 获取或设置临时部联系人账号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pending_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("pending_id")]
+ public string PendingExternalUserId { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置结果列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("result")]
+ [System.Text.Json.Serialization.JsonPropertyName("result")]
+ public Types.Result[] ResultList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.cs
new file mode 100644
index 00000000..d99bc89b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/external_tagid 接口的请求。
+ ///
+ public class CgibinIdConvertExternalTagIdRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置客户标签 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_tagid_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_tagid_list")]
+ public IList ExternalTagIdList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.cs
new file mode 100644
index 00000000..fe479f35
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.cs
@@ -0,0 +1,42 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/external_tagid 接口的响应。
+ ///
+ public class CgibinIdConvertExternalTagIdResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class Result
+ {
+ ///
+ /// 获取或设置客户标签 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_tagid")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_tagid")]
+ public string ExternalTagId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商下的客户标签 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_external_tagid")]
+ [System.Text.Json.Serialization.JsonPropertyName("open_external_tagid")]
+ public string OpenExternalTagId { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置结果列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("items")]
+ [System.Text.Json.Serialization.JsonPropertyName("items")]
+ public Types.Result[] ResultList { get; set; } = default!;
+
+ ///
+ /// 获取或设置无效的客户标签 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("invalid_external_tagid_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("invalid_external_tagid_list")]
+ public string[]? InvalidExternalTagIdList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.cs
new file mode 100644
index 00000000..544e216b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.cs
@@ -0,0 +1,17 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/open_kfid 接口的请求。
+ ///
+ public class CgibinIdConvertOpenKfIdRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置客服账号 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_kfid_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("open_kfid_list")]
+ public IList OpenKfIdList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.cs
new file mode 100644
index 00000000..506c5940
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.cs
@@ -0,0 +1,42 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/open_kfid 接口的响应。
+ ///
+ public class CgibinIdConvertOpenKfIdResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class Result
+ {
+ ///
+ /// 获取或设置客服账号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("open_kfid")]
+ [System.Text.Json.Serialization.JsonPropertyName("open_kfid")]
+ public string OpenKfId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务商下的客服账号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("new_open_kfid")]
+ [System.Text.Json.Serialization.JsonPropertyName("new_open_kfid")]
+ public string NewOpenKfId { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置结果列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("items")]
+ [System.Text.Json.Serialization.JsonPropertyName("items")]
+ public Types.Result[] ResultList { get; set; } = default!;
+
+ ///
+ /// 获取或设置无效的客服账号 ID 列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("invalid_open_kfid_list")]
+ [System.Text.Json.Serialization.JsonPropertyName("invalid_open_kfid_list")]
+ public string[]? InvalidOpenKfIdList { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.cs
new file mode 100644
index 00000000..1f13e833
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/unionid_to_external_userid 接口的请求。
+ ///
+ public class CgibinIdConvertUnionIdToExternalUserIdRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置用户的微信 UnionId。
+ ///
+ [Newtonsoft.Json.JsonProperty("unionid")]
+ [System.Text.Json.Serialization.JsonPropertyName("unionid")]
+ public string? UnionId { get; set; }
+
+ ///
+ /// 获取或设置用户的微信 OpenId。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置主体类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("subject_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("subject_type")]
+ public int SubjectType { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs
new file mode 100644
index 00000000..006f0cc6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/idconvert/unionid_to_external_userid 接口的响应。
+ ///
+ public class CgibinIdConvertUnionIdToExternalUserIdResponse : WechatWorkResponse
+ {
+ ///
+ /// 获取或设置外部联系人账号。
+ ///
+ [Newtonsoft.Json.JsonProperty("external_userid")]
+ [System.Text.Json.Serialization.JsonPropertyName("external_userid")]
+ public string? ExternalUserId { get; set; }
+
+ ///
+ /// 获取或设置临时部联系人账号 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pending_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("pending_id")]
+ public string? PendingExternalUserId { get; set; }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/EventSamples/Service/CorpArchitectureAuthEvent.xml b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/EventSamples/Service/CorpArchitectureAuthEvent.xml
new file mode 100644
index 00000000..8e5d3e83
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/EventSamples/Service/CorpArchitectureAuthEvent.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ 1403610513
+
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.json
new file mode 100644
index 00000000..f004740c
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdRequest.json
@@ -0,0 +1,4 @@
+{
+ "chat_id": "xxxxxx",
+ "external_userid": ["oAAAAAAA", "oBBBBB"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.json
new file mode 100644
index 00000000..55ed2fae
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.json
@@ -0,0 +1,14 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "result": [
+ {
+ "external_userid": "oAAAAAAA",
+ "pending_id": "pAAAAA"
+ },
+ {
+ "external_userid": "oBBBBB",
+ "pending_id": "pBBBBB"
+ }
+ ]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.json
new file mode 100644
index 00000000..b5b8d164
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdRequest.json
@@ -0,0 +1,3 @@
+{
+ "external_tagid_list": ["TAG_ID1", "TAG_ID2", "TAG_ID3", "TAG_ID4"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.json
new file mode 100644
index 00000000..9bb2bb76
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertExternalTagIdResponse.json
@@ -0,0 +1,15 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "items": [
+ {
+ "external_tagid": "TAG_ID1",
+ "open_external_tagid": "OPEN_TAG_ID1"
+ },
+ {
+ "external_tagid": "TAG_ID2",
+ "open_external_tagid": "OPEN_TAG_ID2"
+ }
+ ],
+ "invalid_external_tagid_list": ["TAG_ID3", "TAG_ID4"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.json
new file mode 100644
index 00000000..764b00cc
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdRequest.json
@@ -0,0 +1,3 @@
+{
+ "open_kfid_list": ["KFID1", "KFID2", "KFID3", "KFID4"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.json
new file mode 100644
index 00000000..8e01fa9d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertOpenKfIdResponse.json
@@ -0,0 +1,15 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "items": [
+ {
+ "open_kfid": "KFID1",
+ "new_open_kfid": "NEW_KFID1"
+ },
+ {
+ "open_kfid": "KFID2",
+ "new_open_kfid": "NEW_KFID2"
+ }
+ ],
+ "invalid_open_kfid_list": ["KFID3", "KFID4"]
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.json
new file mode 100644
index 00000000..29b9c22d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdRequest.json
@@ -0,0 +1,5 @@
+{
+ "unionid": "oAAAAAAA",
+ "openid": "oBBBB",
+ "subject_type": 1
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.json
new file mode 100644
index 00000000..041f5adb
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.json
@@ -0,0 +1,6 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "external_userid": "ooAAAAAAAAAAA",
+ "pending_id": "ooBBBBBB"
+}