介绍
3CX Version 20 提供了一种新的方式来以编程手段配置您的系统,内部称之为 XAPI。通过 3CX 配置 API,您可以配置 3CX 的任何内容,这涵盖了管理控制台中可以进行的所有操作。该 API 是一个标准化的 Web REST API,基于 OData 技术,并兼容 OpenAPI 规范。
为了开始使用和尝试 XAPI,请下载最新版本的 Postman 和 3CX 配置 API JSON 文件。
将 JSON 文件导入到 Postman 后可以看到如下界面:
点击 3CX Configuration API,点击 Variables,可以看到 PBX_FQDN 的变量。将 Current Value 改成 3CX 系统的 FQDN:HTTPS_PORT (不要加 https:// )。

后续步骤将根据您选择的认证方法填写其他变量。
认证
3CX 配置 API 提供两种类型的认证令牌:
- “多租户管理员” 令牌(Multi-Company Admin) – 可以管理所有部门和实体。
- “用户” 令牌(User) – 可以管理自己及其权限范围内的实体。
多租户管理员认证
为了获取多租户管理员令牌,我们需要调用以下 API:
POST /connect/token Accept: application/json Authorization: Basic BASE64-ENCODED-USER-NAME-AND-PASSWORD Content-Type: application/x-www-form-urlencoded Body: client_id=customer-portal&grant_type=client_credentials
为了获取多公司管理员令牌,我们需要使用以下方法进行身份验证:
- 授权方式:基础认证 (Basic)
- 用户名:customer-portal (固定值)
- 密码:您需要在 3CX 电话系统管理控制台中生成密码(前提是您的 3CX 以多公司模式部署,有关如何部署多公司模式,请参考。
生成密码的步骤:
- 登录 3CX 管理控制台。
- 导航到“系统” > “多公司”(如果您的 3CX 不是多公司模式,将高级 > 参数 > MULTICOMPANYMODE 设为 1)。
- 点击“生成令牌”按钮。
生成的密码将用于后续的 Basic 认证中。
在 Postman 中获取访问令牌的步骤:
复制您在 3CX 管理控制台中生成的密码。
在 Postman 中,找到 3CX 配置 API 的 Variables 路径。
创建两个新变量:
- 名称:API_TOKEN
- 值:粘贴前面生成的 Token
- 名称:ACCESS_TOKEN (先留空,后续会用到)
保存这些变量。
在 Postman 中找到 “Multi-Company Admin authentication” 请求。
点击 “Send” 按钮运行该请求。
如果成功,响应体将类似于以下内容:
{
    "token_type": "Bearer",
    "expires_in": 60,
    "access_token": "ACCESS_TOKEN",
    "refresh_token": null
}
从响应体中复制 access_token 的值。
在 Postman 中,找到 3CX 配置 API 的 Variables 路径 (同步骤 2)。
编辑 ACCESS_TOKEN 变量,将值粘贴您复制的访问令牌。
保存 ACCESS_TOKEN 变量。
后续的 API 请求都需要在 Authorization 标头中使用此访问令牌,这样才能进行有效的认证。
用户(User)认证
除了多公司管理员令牌之外,您还可以选择使用某个特定用户身份进行身份验证,并仅在其权限范围内执行操作(具体取决于用户的角色和部门权限)。
创建用户
- 登录 3CX 电话系统管理控制台。
- 导航到“用户”。
- 创建一个新用户,可以设置任意角色(例如系统所有者),确保取消勾选“启用双重身份验证”选项,并为其指定一个有效的电子邮件地址。
- 用户创建后,会收到一封包含重置密码链接的欢迎电子邮件,请使用该链接重置密码。
获取用户令牌
为了获取用户令牌,我们需要调用以下 API:
POST /webclient/api/Login/GetAccessTokenAccept: application/jsonContent-Type: application/jsonBody: {"SecurityCode":"", "Password":"USER_PASS", "Username":"USER_NUM"}
解释:
- 方法:POST
- 路径:/webclient/api/Login/GetAccessToken
- 请求头- Accept: application/json (指定服务器返回的数据格式)
- Content-Type: application/json (指定发送给服务器的数据格式)
 
- 请求体 (JSON 格式)- SecurityCode: 留空 (双重身份验证代码,此处不需要)
- Password: 用户的 Web 客户端密码 (USER_PASS)
- Username: 用户的分机号 (USER_NUM)
 
在 Postman 中设置用户凭证
- 在 Postman 中,找到 3CX 配置 API 的 Variables 路径。
- 创建两个新变量:- 名称:USER_NUM
- 值:粘贴该用户的分机号
- 名称:USER_PASS
- 值:粘贴该用户的 Web 客户端密码
 
- 保存这些变量。
- 在 Postman 中找到 “User authentication” 请求。
- 点击 “Send” 按钮运行该请求。
获取访问令牌和刷新令牌
如果成功,响应体将类似于以下内容:
{  "Status": "AuthSuccess",  "Token": {    "token_type": "Bearer",    "expires_in": 60,    "access_token": "ACCESS_TOKEN",    "refresh_token": "REFRESH_TOKEN"  },  "TwoFactorAuth": null}
解释:
- Status: “AuthSuccess” (表示身份验证成功)
- Token: 令牌信息- token_type: “Bearer” (令牌类型)
- expires_in: 60 (访问令牌的有效期,单位为秒,此处为 1 小时)
- access_token: 访问令牌 (用于后续的 API 请求)
- refresh_token: 刷新令牌 (可用于获取新的访问令牌)
 
使用访问令牌
- 从响应体中复制 access_token 的值。
- 在 Postman 中,找到 3CX 配置 API 的 Variables 路径 (同步骤 1)。
- 编辑 ACCESS_TOKEN 变量,将值粘贴您复制的访问令牌。
- 保存 ACCESS_TOKEN 变量。
后续的 API 请求都需要在 Authorization 标头中使用此访问令牌,这样才能进行有效的认证。
注意
- 所有访问令牌会在 1 小时后过期,因此您的应用程序需要每隔 1 小时或收到 401 响应时重新进行编程身份验证。
快速测试 – 获取 3CX 版本
一旦完成身份验证,您可以调用以下 API 来获取 3CX 电话系统版本。这可以快速验证您的令牌是否有效可用:
GET /xapi/v1/Defs?%24select=IdAuthorization: Bearer ACCESS_TOKEN
解释:
- 方法:GET
- 路径:/xapi/v1/Defs?%24select=Id
- 请求头- Authorization: Bearer ACCESS_TOKEN (包含您的访问令牌)
 
如果身份验证成功,响应状态将为 200 OK,并且响应头中将包含 3CX 电话系统版本信息:
X-3CX-Version: 20.0.x.x
部门(Department)
检查部门是否存在
在 3CX 电话系统中,每个新部门的名称必须唯一。在创建部门之前,我们应该检查该部门名称是否存在。
检查方法:
调用以下 API:
GET /xapi/v1/Groups?$filter=Name eq '3CX Test'
解释:
- 方法:GET
- 路径:/xapi/v1/Groups
- 查询参数:$filter=Name eq '3CX Test'(根据名称 “3CX Test” 进行筛选)
响应结果:
- 如果部门不存在,响应体将包含一个空数组:
{  "@odata.context": "https://PBX_FQDN/xapi/v1/$metadata#Groups",  "value": []}
- 如果部门存在,响应体会列出该部门的属性。
创建部门
创建部门的方法:
调用以下 API:
POST /xapi/v1/Groups{  "AllowCallService": true,  "Id": 0,  // 系统自动分配  "Language": "EN",  "Name": "3CX Test",  "PromptSet": "1e6ed594-af95-4bb4-af56-b957ac87d6d7",  // 提示集标识 (具体含义查阅官方文档)  "Props": {    "LiveChatMaxCount": 20,  // 最大实时聊天数量    "PersonalContactsMaxCount": 500,  // 最大个人联系人数量    "PromptsMaxCount": 10,  // 最大提示数量    "SystemNumberFrom": "23960",  // 系统号码范围起始值    "SystemNumberTo": "23979",  // 系统号码范围结束值    "TrunkNumberFrom": "23900",  // 中继线号码范围起始值    "TrunkNumberTo": "23905",  // 中继线号码范围结束值    "UserNumberFrom": "23910",  // 用户号码范围起始值    "UserNumberTo": "23929"  // 用户号码范围结束值  },  "TimeZoneId": "51",  // 时区标识 (具体含义查阅官方文档)  "DisableCustomPrompt": true  // 禁用自定义提示}
- Language:部门语言- EN 英语(US)
- UK 英语(UK)
- DE 德语
- FR 法语
- ES 西班牙语
- IT 意大利语
- PT 葡萄牙语
- RU 俄语
- PL 波兰语
- ZH 中文
 
- Prompt:系统提示音语言- 点击查看列表
 
- UserNumberFrom – UserNumberTo- 允许用户使用的分机范围
 
- TrunkNumberFrom – TrunkNumberTo- 允许使用的中继号码范围
 
- SystemNumberFrom – SystemNumberTo- 允许用户使用的系统分机范围
 
创建部门后,响应体将包含已创建部门的属性。您应该特别注意以下两个属性,并将其保存下来以便用于后续的 API 请求:
- Number: 部门的号码 (例如 “GRP1023”)
- Id: 部门的标识符 (一个唯一的数字)
请将这两个值保存在适当的位置,例如 Postman 的变量中,以便在后续的 API 请求中引用。这将避免您重复输入这些值,并使您的脚本更加高效。
部门管理
更新部门信息
如果某个部门的属性需要更新,您可以按照以下步骤进行操作:
- 查找部门:使用以下 API 根据部门号码来查找部门信息:GET /xapi/v1/Groups?$filter=Number eq ‘GRPXXX’解释:- 方法:GET
- 路径:/xapi/v1/Groups
- 查询参数:$filter=Number eq 'GRPXXX'(根据部门号码 “GRPXXX” 进行筛选)
 GRPXXXersetzt (替换) 为您创建的部门的实际号码 (例如 GRP1023)。
- 更新部门:找到部门后,您可以使用以下 API 更新其部分属性:PATCH /xapi/v1/Groups(GROUP-ID){  “Id”: GROUP-ID,  “Name”: “3CX Test1”,  “Props”: {    “LiveChatMaxCount”: 20,    “PersonalContactsMaxCount”: 500,    “PromptsMaxCount”: 10,    “SystemNumberFrom”: “23960”,    “SystemNumberTo”: “23979”,    “TrunkNumberFrom”: “23900”,    “TrunkNumberTo”: “23905”,    “UserNumberFrom”: “23910”,    “UserNumberTo”: “23929” }}解释:- 方法:PATCH
- 路径:/xapi/v1/Groups(GROUP-ID) (将 GROUP-ID 替换为实际的部门标识符)
- 请求体 (JSON 格式):包含要更新的部门属性- Id:部门标识符 (该值应从第一步获取的查找结果中获得)
- Name:部门名称
- Props:包含一些可选属性,具体含义请参考 3CX 配置 API 文档
 
 
查找部门
您可以使用相同的方法 (GET /xapi/v1/Groups?$filter=Number eq ‘GRPXXX’) 根据部门号码来查找部门信息。
删除部门
要删除一个部门,请按照以下步骤操作:
- 查找部门:同更新部门一样,您需要先根据部门号码查找部门信息。
- 删除部门:找到部门后,您可以使用以下 API 删除该部门:POST /xapi/v1/Groups/Pbx.DeleteCompanyById{  “id”: GROUP-ID}解释:- 方法:POST
- 路径:/xapi/v1/Groups/Pbx.DeleteCompanyById
- 请求体 (JSON 格式):包含要删除的部门标识符- id:部门标识符 (该值应从第一步获取的查找结果中获得)
 
 
3CX Live Chat URL 管理
检查网站链接是否存在
您可以使用以下 API 检查某个特定的网站链接是否已经分配给某个部门:
GET /xapi/v1/WebsiteLinks?$filter=Link eq 'LiveChat753947'
解释:
- 方法:GET
- 路径:/xapi/v1/WebsiteLinks
- 查询参数:$filter=Link eq 'LiveChat753947'(根据链接 “LiveChat753947” 进行筛选)
创建 3CX Live Chat URL
如果要为某个部门创建一个新的 3CX Live Chat URL,请使用以下 API:
POST /xapi/v1/WebsiteLinks{  "Advanced": {    "CallTitle": "",    "CommunicationOptions": "PhoneAndChat",    "EnableDirectCall": true,    "IgnoreQueueOwnership": false  },  "CallsEnabled": true,  "ChatBox": {    "ButtonIconType": "Default",    "ButtonIconUrl": "",    "ChatDelay": 2000,    "Height": "28.5vh",    "LiveChatLanguage": "browser",    "LiveMessageUserinfoFormat": "Both",    "MessageDateformat": "Both",    "MinimizedStyle": "BottomRight",    "OperatorIcon": "",    "OperatorName": "",    "ShowOperatorActualName": true,    "WindowIcon": ""
用户 User
用户管理
获取部门用户列表
您可以使用以下 API 获取指定部门的用户列表:
GET /xapi/v1/Users?%24top=100&%24skip=0&%24orderby=Number&%24select=Id&%24select=FirstName&%24select=LastName&%24select=Number&%24select=EmailAddress&%24expand=Groups(%24expand%3DRights%29
解释:
- 方法:GET
- 路径:/xapi/v1/Users
- 查询参数:- $top=100: 返回结果的最大条目数 (可选,默认为 100)
- $skip=0: 跳过结果集中的前 N 个条目 (可选,默认为 0)
- $orderby=Number: 按照分机号对结果进行排序
- $select=Id,FirstName,LastName,Number,EmailAddress: 指定要返回的用户信息 (Id, 名, 姓, 分机号, 邮箱地址)
- $expand=Groups(%24expand%3DRights): 扩展用户所属的组信息,并进一步扩展组的权限信息
 
检查用户邮箱是否唯一
在同一个 3CX 电话系统中,邮箱地址不能用于不同的用户。创建用户之前,需要使用以下 API 检查目标邮箱是否已经被占用:
GET /xapi/v1/Users?%24top=1&%24filter=tolower%28EmailAddress%29 eq %27testsmbcreation%40testsmbcreation1.com%27&%24orderby=Number&%24select=Id&%24select=FirstName&%24select=LastName&%24select=Number&%24select=EmailAddress&%24expand=Groups(%24expand%3DRights%29
解释:
- 方法:GET
- 路径:/xapi/v1/Users
- 查询参数:- $top=1: 返回结果的最大条目数 (设置成 1,因为我们只需要检查是否存在)
- $filter=tolower(EmailAddress) eq 'testsmbcreation@testsmbcreation1.com': 筛选条件,使用 tolower 函数将邮箱地址转换为小写进行匹配 (替换 ‘testsmbcreation@testsmbcreation1.com‘ 为您要检查的邮箱地址)
- $orderby=Number: 按照分机号对结果进行排序 (可选)
- $select=Id,FirstName,LastName,Number,EmailAddress: 指定要返回的用户信息 (Id, 名, 姓, 分机号, 邮箱地址)
- $expand=Groups(%24expand%3DRights): 扩展用户所属的组信息,并进一步扩展组的权限信息
 
注意: 此操作需要使用 “多公司管理员” 或 “系统所有者” 权限的凭据,以检查所有 PBX 用户。
创建用户
如果邮箱地址可用,您可以使用以下 API 创建一个新用户:
POST /xapi/v1/Users{  "AccessPassword": "QrzxYQwa5!",  // 用户密码  "EmailAddress": "test@contoso.com",  // 用户邮箱地址  "FirstName": "TestFirstName",  // 名  "Id": 0,  // 系统自动分配  "Language": "EN",  // 用户语言 (默认为英语)  "LastName": "TestLastName",  // 姓  "Number": "211",  // 分机号  "PromptSet": "1e6ed594-af95-4bb4-af56-b957ac87d6d7",  // 提示集标识 (具体含义查阅官方文档)  "SendEmailMissedCalls": true,  // 是否通过电子邮件发送未接来电通知  "VMEmailOptions": "Notification",  // 语音邮件电子邮件选项 (此处设置为 "Notification")  "Require2FA": true  // 是否强制启用双重身份验证}
响应将包含新创建用户的 ID 信息。
创建用户友好 Url
有效链接:
POST /xapi/v1/WebsiteLinks/Pbx.ValidateLink
{
    "model": {
        "FriendlyName": "testsmbcreationtests",
        "Pair": "23910"
    }
}
更新用户信息:
PATCH /xapi/v1/Users(USER-ID)
{
    "CallUsEnableChat": true,
    "ClickToCallId": "thisisatest",
    "Id": 1732,
    "WebMeetingFriendlyName": "thisisatest"
}
用户 ID (USER-ID) 是通过 GET /xapi/v1/Users 获取的用户的 ID (例如 1234)。
在部门中分配用户角色
PATCH /xapi/v1/Users(USER-ID)
{
    "Groups": [{
            "GroupId": GROUP-ID,
            "Rights": {
                "RoleName": "group_owners"
            }
        }
    ],
    "Id": USER-ID
}
RoleName 有下面几种身份:
- “system_owners”
- “system_admins”
- “group_owners”
- “managers”
- “group_admins”
- “receptionists”
- “users”
删除用户
批量删除用户:用逗号分隔的用户 ID 列表指定要删除的用户。
POST /xapi/v1/Users/Pbx.BatchDelete
{
   "ids":[
            USER1-ID,
            USER2-ID
            ]
}
系统分机
创建共享通道
检查是否存在
GET /xapi/v1/Groups(GROUP-ID)?%24expand=Members
检查响应中是否有类型 “停泊 “的成员。
获取 DEFAULT 部门的信息(我们需要 ID)
GET /xapi/v1/Groups?$filter=Name eq 'DEFAULT'
创建共享停泊:
POST /xapi/v1/Parkings
{
    "Groups": [{
            "GroupId": GROUP-ID
        }, {
            "GroupId": DEFAULT-GROUP-ID
        }
    ],
    "Id": 0
}
删除呼叫停泊
删除分配给部门的呼叫停泊
获取部门成员(删除呼叫停泊)
GET /xapi/v1/Groups(1731)?%24expand=Members
为每个 “呼叫停泊” 类型的成员获取停泊详细信息(我们需要停泊 ID)并将其删除:
GET /xapi/v1/Parkings/Pbx.GetByNumber(number=%27SP271%27)
DELETE /xapi/v1/Parkings(PARKING-ID)
PARKING-ID 在前面的步骤中获得。
其他接口
的确,3CX 配置 API 为自动化任务和将您的 3CX 系统与其他应用程序集成打开了大门。 通过浏览 YAML 文件,您可以发现所有可用的端点,它们对应于您可以在 Web 客户端和管理控制台中执行的操作。
以下是快速入门步骤:
- 浏览到 3CX 配置 API YAML 文件。
- 将 YAML 文件保存到您的本地计算机上。
- 将 YAML 文件导入 Postman(或其他 API 客户端工具)中的新工作区或集合下。 这将使用所有 API 端点填充您的客户端,并使其更易于探索和测试。
通过遵循这些步骤,您将拥有用于以编程方式与您的 3CX 系统交互的强大工具集。如果您有使用 Postman 或类似工具的经验,这将是自动化任务和扩展 3CX 系统功能的好方法。
绝对没问题,欢迎您随时提供反馈! 如果您在使用 API 时遇到任何问题或想讨论相关主题,请随时在我们的论坛中提问 https://www.3cx.com/community/tags/api/。
