OpsIQ 文档

建造、操作和 扩展 OpsIQ.

这是完整文件,用于 OpsIQ。设置产品,运行支持,配置AI,管理CRM,安装部件,构建连接器,调用 REST API,接收webhoks,软件包市场应用,并运行自备部署.

客户指南管理指南开发者指南CRM参考文献连接器 SDK净 值 API自行主办
范围

本手册的范围

什么都行,你这帮混蛋 OpsIQ,在一个地方:每个屏幕是如何工作的,如何连接自己的系统,以及如何在屏幕上建起。从任何地方开始,区域都遵循与管理员侧边栏相同的顺序。

范围
文件地图该手册围绕 OpsIQ 产品,遵循与管理员侧边栏相同的顺序。文件地图OpsIQ 产品AUDIENCE运算符布隆迪开发者RUN管理员现场工作现场使用 OpsIQ产品屏幕和工作流程包含扩展 OpsIQ连接器, APIs 部件包含运行 OpsIQ安保、警衔和部署包含参考文献包裹, API 和网络图克合同包含1CHOOSE AUDIENCE运算符或开发者2FOLLOW THE UI区域镜像 OpsIQ3USE SOURCE TRUTH状态来自建楼
该手册围绕 OpsIQ 产品,遵循与管理员侧边栏相同的顺序。
门户工作室实地指南

使用 Portal 架构的专用管理员和开发者指南,页面,组件,预览,帮助中心,身份, SCIM,规范释放,扩展,迁移和认证.

打开门户网站工作室指南

里面有什么东西?

运行产品

管理中的每个屏幕:分析,直播,票房,CRM、知识基础、网站情报、促销和客户账户门户。每个网页都做什么,数字是什么意思,当它们看错时该怎么办。

连接您的系统

网站小部件、电子邮箱、入站和出站 webhook,以及适用于以下平台的连接器库: Shopify, WooCommerce, WHMCS, Zendesk, Stripe, Slack 和 Gmail。

自己建构一个

连接器构建器,用于无编码连接器、动作和触发器,如果您不愿使用连接器,则使用 REST API 包含每个动作、范围和错误代码。

运行它

作用和权限、安保、克龙、诊断、备份以及托管和自托管的部署。

何处起步

1
如果你跑的话 OpsIQ 每日活动

以侧边栏顺序读取屏幕部分。每个部分都打开页面的目的,这样您就可以在有需要时立即停止。

2
如果你管理它

添加设置、 安全性、 诊断性、 Cron 和 Production 。 这些是决定其它是否继续工作的章节 。

3
如果你正在构建一个融合

从连接器开始,然后是连接器构建器,然后就是REST API 和网友。你应当依部就班地诵读,你必定看见一切迹象。OpsIQ 可以和另一个系统交谈。

💡
有两个东西会改变你所看到的。 权限隐藏页无法打开, 因此您在侧边栏上可能缺少一个描述的段落。 请管理员检查您的作用。 而连接器带有一个 Production, Beta, Preview 或模板的成熟标签; 运行的构建及其连接符显示是您拥有的权威, 而不是此页面 。
从这里开始

或 OpsIQ 做为您的事业

OpsIQ是一个完整的AI- First业务操作平台。它取代了您的分析器,实时聊天,帮助台,CRM, SEO工具包、集成中间软件和开发者平台,其中每个工具都共享相同的客户环境。8-12分离SaaS产品,您安装OpsIQ一次,从一个屏幕操作所有东西。

平台
OpsIQ 统一平台一个中央AI大脑连接到直播聊天,CRM,票房,站点情报,升级和分析.实时聊天晋升大赦国际CRM站点英特尔车票分析OpsIQ爱的BRARE1ONE WORKSPACE每一个工具在一个管理员中2SHARED BRAIN一个客户背景3ANYWHERE云端或自托管
OpsIQ 是一个共享客户背景的平台, 每个工具的种子, 由相同的AI大脑提供动力。

什么都行,你这帮混蛋 OpsIQ - 详细情况

网站分析和访客情报

实时访客跟踪

每一个页面载重、点击、滚动和导航事件都会被实时捕获。看看现在的网站上是谁,他们正在浏览什么网页,花费了多长时间,以及它们来自何处,都没有任何第三方饼干。

访问日志和会话

每个访问者的全部历史都包含设备、浏览器、操作系统、国家、城市、参考者、UTM参数、登陆页和身份分辨率。会话组的页面查看行程,以便您看到访问者所走的整个道路。

会话重放

时间线式的回放 。 请确切地看到用户所做的 : 鼠标移动、 点击、 滚动、 页面转换、 并形成互动 。 用它来诊断 UX 问题, 理解下拉点, 并验证转换流量 。

现场直播

实时访问者活动。 请查看页面浏览、 聊天开始、 格式提交和意向信号每隔几秒钟更新一次 。 按国家、 设备或参考器过滤以聚焦特定的流量段 。

顶端页面

页面按访问、 约定时间、 弹出率、 转换率、以及支持活动排序。 请确定您最出色的内容和需要改进的页面 。

地理情报

国家、城市和区域的地图分解,设备和浏览器的分发、交通源分析、搜索引擎查询器跟踪和市场渗透。

内向漏斗

跟踪访客意向信号(定价页面访问,重复返回,文档浏览模式,支持互动),以识别可能购买,churn或需要帮助的访客.

A/B实验

在您的网站上直接运行拆分测试 OpsIQ。创建变量、设定流量分配、定义转换目标并衡量统计意义。不需要外部测试工具。

JavaScript 错误跟踪

抓取客户端 JavaScript 自动查看错误消息、 堆栈跟踪、 受影响的浏览器、 频率计数以及触发错误的页面。 调试前端问题, 不另进行错误监测 。

事件日志

每个可被跟踪的事件(页面浏览,自定义事件,聊天互动,表单提交,购买)都包含有完整元数据的可搜索可过滤日志.

销售和改划

追踪订单、收入、退款、续订、以及交通来源、活动和游客旅行的属性转换。

由行为模式识别的高意向访问者. 分数线索基于页面访问,现场时间,回回回频率,支持交互,以及自定义信号. feed引导直接进入CRM管道.

站点情报(SEO和内容分析)

站点爬行

自动爬行您整个网站, 以发现页面、 检测断开的链接、 找到缺失的元标记、 检查图像替代文本、 验证空格 URLs,并绘制您的站点结构图。每天、每周或按要求运行的时间表。

技术SEO审计

综合技术分析:页面速度分数、移动响应能力、核心网络维生素、SSL 证书状态,重定向链条,重复内容检测,爬行深度分析,以及结构化数据验证.

内容审计

评价每一页的内容质量、字数、可读性、关键词密度、标题结构、内部/外部链接比率和新鲜度。找出内容薄、重复的页和内容差距。

AI 动力搜索

语义搜索您整个网站内容。 询问自然语言关于您内容的问题, 并获得AI- synthemated 答案, 以及源页面引用 。

跟踪应急救援人员的级别

监视搜索引擎在谷歌和其他引擎中的目标关键词的排名。跟踪位置随时间而变化,与竞争对手进行比较,并查看哪个页面排列了哪些术语。

关键词研究

以您的内容、 竞争者分析和搜索量数据为基础, 发现关键词机会。 获取新内容主题、 长尾变异和内容优化目标的建议 。

后链路分析

监视您的输入链接配置。 查看哪些站点链接您, 跟踪新的和丢失的链接, 分析主锚文本分布, 并识别链接构建机会 。

本地 SEO 网格

对于有实际位置的企业: 将本地搜索的能见度直观地显示在一个地理网格上。 查看您的排名如何因位置、 距离您的业务和搜索意图而变化 。

谷歌商业简介同步

连接您的 Google 业务简介 OpsIQ。同步评论、文章、QQA、相片和商业信息。从内部管理您的英镑列表。OpsIQ 回应审查,发布帖子,并监督见解.

排定的报告

自动的SEO和分析报告(每日、每周、每月),包括排名变化、流量趋势、发现的技术问题和内容性能。白标签输出可供各机构使用。

AI 强力支持

客户AI聊天

AI在您的网站上解答客户问题 24/7使用您的知识库、连接的平台数据(订单、账户、订阅)和自定义培训提示。支持多个 AI 提供者: Claude ()Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google)和格鲁克(xAI).

行政助理

管理员面板内部的AI副驾驶,帮助您撰写出票回复,起草客户通信,分析支持趋势,在连接的平台上查找客户数据,并通过连接器系统执行动作.

AI 知识基础

AI 是基于您的知识库文章、 FAQ 条目、 产品文档和连接的平台数据。 它不会产生幻觉。 它从您的实际商业信息中解答,或者在不确定时会升级。

自动对人体进行手动

当AI无法解决一个问题,检测出挫折感,或者客户要求人类时,它会自动地将完全对话的上下文交给你的团队. Configable definit/timout auto-return back to AI.

AI 培训提示

为客户界面AI和管理员界面AI编写单独的指令提示。控制语气、边界、升级规则、被禁话题和特定商业行为。支持每个工作空间配置。

AI 历史和审计

每一次AI对话都记录了全部请求/答复细节、象征性使用、成本跟踪、供应商使用和模型版本。 审查对话,以查明培训差距并改进AI的准确性。

大赦国际的见解

对AI对话模式的自动化分析. 见常见问题,解析率,交接频率,客户满意程度按话题,以及AI需要更好培训的领域.

工作空间 AI 配置

每个相接站点/工作空间都可以使用自己的AI供应商,模型,温度,符号预算,以及培训提示. A SaaS公司可以使用克洛德来做主要产品,而GPT-4o可以使用副品牌.

管理大赦国际和 BYOK

两个AI模式: 管理AI(包含在你的计划中,没有)API 或带出自己的密钥(使用自己的密匙) OpenAI/Anthropic/谷歌/xAI 音乐 API 键,用于完全控制模型选择和成本。两者都是一等的,每个特性都使用两种模式。

AI 象征性预算和成本控制

设置每月象征性预算、 每位对话限制和低余额提示。 每个提供者、 每个工作空间和每个谈话的跟踪支出。 防止使用硬顶的逃逸成本。

车票和服务台

原住票制度

与部门、优先事项(低/中/高/紧急)、状态、SLA跟踪、内部笔记、客户答复、文件附件和线性对话等完全的服务台。不需要外部服务台。

AI 分解和自动校正

AI自动按部门和优先级对进站门票进行分解。 启用自动重写安全门票。 AI在可配置延迟( 默认) 后起草并发送回复 : 2这样人类才能先介入

电子邮件摄入

连接邮箱( Gmail, IMAP,或提供商专用的)自动从入境邮件中创建出票。对出票通知邮件的回复更新出票线索。

车票入口已嵌入

在您的网站上嵌入一个客户端的出票门户。客户可以提交出票,查看其历史,回复开出出出票以及检查状态,所有都标注在您的设计上。

合并车票

将重复的门票合并成一线. 合并门票在主题线上显示[Merged],所有对话历史保存在幸存的门券中.

返回大赦国际

人行代理接手一票后,使用"回AI"让AI恢复自动再版的该票,当人行部分解决后有用,但客户有AI能够处理的后续问题.

收件箱副驾驶员

由收件箱视图提供的AI辅助出票管理. 副驾驶建议回答,总结谈话历史,建议优先/部门任务,并可以在连接的平台上执行动作.

聊天和实时支持

聊天收件箱

实时客户聊天由统一的收件箱管理。 查看所有活跃的对话, 客户身份, 对话历史, 以及AI的建议。 多位代理可以合作谈话 。

主动聊天规则

基于访客行为的触发聊天信息:页面上的时间, 特定 URL 访问、 滚动深度、 回访次数、 退出意图或自定义事件。 例如: 显示帮助消息 60 秒,在定价页面上。

聊天部件

嵌入在您的网站上的自定义聊天部件。 支持 AI 聊天、 直播代理聊天、 文件提交、 知识库搜索和访客身份。 响应性、 可访问性和品牌性 。

CSAT调查

聊天和票务互动后收集客户满意度评级。设计调查时会提出自己的问题、评分尺度和后续提示。结果反馈到团队业绩和AI的洞察力。

聊天后电子邮件调查

聊天结束后,有已知邮件的访客可以收到一封带有AI摘要的被处理内容的有名邮件并点击"Wes it easy"一击"是/否. 每条线索一次,签名单用链接,每封发送记录,结果在回馈页面上作为自己的信号登陆在聊天中星旁边.

反馈身份循环

每个带一个人的反馈项目都显示:姓名、电子邮件、点击到他们整个客户行程以及CRM联系人,并按其实际历史单击Email或AI-草稿答复。

写入 AI

单独的 AI 撰写助理,负责 电子邮件草稿、 票单回复、 公告和客户通信。 使用自己的即时( 不是聊天大脑) 来撰写专业的商务文件 。

AI-第一国际CRM

CRM 指挥中心

显示您全部内容的单一屏幕CRM状态:管道值、交易速度、即将完成的任务、风险交易、代理活动和AI建议。CRM主页是您每天的起点。

联系人和公司

管理客户联系人,其信息有完整配置:姓名,电子邮件,电话,公司,标签,生命周期舞台,对话历史,票房历史,购买历史,以及自定义字段. Link contact to company for B2B关系管理.

交易和管道板

视觉 Kanban 风格的交易板上可自定义的相继阶段。 将交易拖放到相继的相接阶段, 设定值, 指定所有者, 跟踪关闭日期, 并查看每个相继步骤的管道值。 支持多条管道 。

AI 交易辅导

AI分析每一项交易并提供指导:风险信号(经过了安静,提到的竞争者,预算问题),次好的行动建议,赢概率,以及建议的后续时间.

预测和报告

报告包括按阶段、所有者、来源、换算率、平均交易规模和销售周期长度分列的预测。

探矿剂(SDR)

AI-动力探矿从您的访客数据中识别潜在的客户,引导信号,以及连接的平台活动。 建议拓展目标,起草初始信息,并评分领先质量。

后续序列

自动多步骤的跟踪序列: 电子邮件、 等 、 电子邮件, 检查响应, 升级。 定义新线索的序列、 被搁置的交易、 购入后检查和重新接触活动 。

寿命周期和保留

跟踪客户生命周期阶段(铅、前景、客户、突起),自动过渡。

数据管理代理

AI代理 持续清理和丰富你的CRM数据 : 复制联系人、 填充缺失字段、 验证电子邮件、 标准化公司名称、 和旗下陈旧记录 。

盖起我的CRM

自然语言CRM配置:告诉AI你的销售过程是什么样子,它构建了您的管道阶段,自定义字段,交易模板,以及自动化规则.

CRM健康检查

自动审计您的CRM数据质量:重复联系人,不采取下一步交易,断绝管道,缺失联系人信息,并进行数据完整性评分.

信任拨号

每个CRM AI代理的三层自主控制:自动驾驶(AI Affairs expert),副驾驶(AI建议,人批准),和手动(AI只观察). 设定每个代理,每个动作类型,以及每个交易值阈值的拨号.

四个人工智能特工

密码CRM管理着四个专门的人工智能代理人:管理(数据质量)、特别提款权(探矿)、保留(预防腐败)和分析员(报告和见解)。

连接器和集成

预建连接器

准备使用的连接器Shopify, WooCommerce马根托大商业公司2, PrestaShop, OpenCart, OsCommerce, (原始内容存档于2018-09-21).WordPress, WHMCS, Zendesk, StripeAmazon SES, Postmark, Resend, SendGrid, 邮件枪,Gmail, IMAP, Slack,和 Google Business Profile。每个连接器都带来特定平台的AI动作,知识和数据同步.

连接器构建器

构建任何平台的自定义连接器, 没有代码、 AI 辅助或完整代码。 构建器支持 REST 和 GraphQLAPIs, OAuth授权代码流, Webhook 自动注册Stripe和简单的签名方案、平面图(平面、页面、光标和链接标题)、列表/错误转换、多行动上下文和市场包装。

AI 辅助连接器作者

连接器BuilderAI 帮助您构建连接器:描述您想要的并推荐动作,写请求处理器和地图 API 响应。自动处理认证、页码和错误处理。

OAuth 任何连接符的流程

一般应用 OAuth 使用任何连接器的许可流。 PKCE 支持, 站点范围状态管理, 自动刷新。 连接器定义它们 OAuth 参数和 OpsIQ 处理流动。

能力巴士(平台全宽扩展)

连接器不只是添加平台动作,它们可以通过能力"buses"来为核心特性提供动力. 连接机宣布一个能力(日历,浓缩,在CRM中签名;在站点情报中本地_列表,排名_数据;在分析中网络_分析;支付中支付_提供者;在邮箱中电子邮件_同步;在通信中视频_会议)并执行其小的方法集; 连接符可以将连接器的功能转换成一个核心特性. OpsIQ 通过能力注册系统发现 并把它连接到UI,客户 360 时间线, 和 AI 动作。 几个连接器可以提供相同的能力, 没有锁定。 请参见连接器/ PLATFORM_ CONNECTORS. md 。

预先安装的与市场级

连接器生活在两个层次中之一。预安装的连接器(连接器/)在框外具有登记功能,保持倾向于仅是无密钥的参考和每个能力使用最多的提供者(例如Google Calendence,Gmail, Google Business Profile). 市场连接器(marketplace_connecters/)是可以发现的,但在安装前是惰性的,例如微软.365日历、展望、DocuSignStripe, GA4, SerpApi, Zoom. 每座桥都浮出市场列表, 这样UI和AI就可以在能力没有现成提供者, 从未有破碎的按钮时, 提示“ 从市场中安装”( 通知到安装) 。

连接器市场

发布您的连接符到 OpsIQ 市场 包件连接器 json,知识。json,工作流程_recipes. 互联网档案馆的存檔,存档日期2013-12-02.json,并签名的档案。市场支持免费和付费的多源帐单连接器。

连接签名

所有连接器都用加密签名进行完整性验证。 签名在安装时被检查。 使用已辞职的_ all_ connectioners工具在更新后重新签名 。

SmartLookup

连接器动作的解析模糊比对系统。定义查找规则和 OpsIQ 匹配用户查询到使用模糊分数和智能Rank算法的平台实体。 例如: find_country ("germ") 匹配德国与 88.9% 自信,你应该相信

行动合同

将军OpsIQ API发布每个注册JSON操作为可发现的命名动作。使用元. 动作进行实时的完整和准确的打字合同; 连接器包通过统一的ActionExecutor来声明自己的供应商行动。

连接器配方

预建的工作流程配方,将多个连接器动作结合到共同的业务工作流程中来. 例:"当新订单被接入时, Shopify,创建出票,更新CRM,并发送 Slack 通知".

知识同步

连接者声明与AI知识库同步的知识主题. 平台特定帮助文章,设置指南,和故障排除步骤在AI没有人工知识条目的情况下自动提供给AI.

开发者平台

净 值 API

一个名字 JSON API 覆盖每个注册管理员 JSON 操作,与API-键认证,工作空间隔离,范围,速率限制,一能写作,OpenAPI,以及生成的Postman收藏.

Webhook

所有重大事件的出网选择:订单、发票、订阅、门票、聊天、线索、用户注册和推车弃用。15 连续失败。

网络标记签名

每个出站的网络hook都与 HMAC-SHA256. 验证您的接收端上的签名,以确保网络huk的真实性。 Stable event_id 用于一能处理 。

部件 SDK

JavaScript SDK 用于包含身份解析、自定义事件跟踪、程序聊天控制和页面特定配置的跟踪部件。安装 React, Vue, Next.js 的食谱。WordPress, Shopify 静态 HTML.

插件和 SDK 设备

用于通用框架的服务器侧 SDK 和插件. WordPress 插头, WHMCS 模块,以及通用的 PHP/Node.js 集成库。

活动 API

推动自定义事件 OpsIQ 从您的后端: 购买、 签名、 特性使用、 错误或任何商务事件。 事件出现在访客时间表中, 并输入分析语句和 AI 语句 。

触发烹饪本

构建事件所触发的自动工作流程:新票,聊天开始,访客身份识别,交易阶段变更,或自定义事件. Triggers执行连接器动作,发送webhooks,更新记录,或通知您的团队.

API 构建器

视觉 API 和 管理员内部的 Webhook 构建器。配置端点、测试请求、检查响应和调试集成而不离开 OpsIQ.

团队和行政管理

角色式访问控制

三个角色:所有者(全程访问,计费,危险区),全程管理(除计费和危险区外的所有操作),以及代理(只有指定部门,没有设置访问),所有敏感页面都由角色硬化.

团队业绩仪表板

拥有者和全管理者专用仪表板显示分辨率时间、工作量分布、处理深度、频道故障、趋势分析、SLA合规、CSAT按代理、重开费率、团队滚动和最繁忙的时数。实时更新。

行政存在和在线跟踪

管理导航中的实时Who-is-online部件。 以心跳为基础的存在检测( NAME OF) Name 60-第二声叫声 300- 第二次延伸,自动排出 120 查看当前在哪些管理员和在哪些页面上活动。

每工作区设置

每个连接的网站(工作空间)可以有自己的AI配置,连接器设置,售票部门,品牌设置,以及操作规则. 全球默认级联为不会凌驾于它们之上的工作空间.

多地点管理

从一个管理多个网站 OpsIQ 每个站点都有自己的跟踪片段、访客数据和配置。从站点导航中切换。

电子邮件模板系统

所有自动化通信的登记驱动电子邮件模板:罚单通知、聊天记录、欢迎邮件、密码重置和系统提醒。HTML 带有活预览的模板,可变芯片( S){{customer_name}}, {{ticket_id}}),和全局布局控制.

进出口

从下列来源进口联系人、机票和知识物品:CSV/JSON出口访问者数据、分析报告和CRM系统之间迁移的数据可移动性。

安全、遵守和业务

企业 SSO

OIDC( 美国)OpenID Connect),全程运行的单笔签名:发现,授权,召回,JWKS签名验证,用户信息,域名允许列表,JIT提供,以及状态守护. SAML 配置支持.

GDPR 和数据遵守情况

内建DSAR(数据主题访问请求)处理:在所有系统导出并删除客户数据. 联系层数据擦除覆盖会话,门票,聊天,CRM同意管理和保留政策。

IP 封锁和野蛮武力保护

特定区块 IPs 或范围从访问您的站点或管理员。在可配置失败的登录尝试后自动关闭。失败的登入日志 IP,时间戳和用户代理。

安全安全安全处和安全科

HTTP 严格运输安全,权限政策头,以及安全的饼干配置. 自托管的部署可以通过服务器配置添加 CSP 头.

外出网点硬化

SSRF 守护屏蔽到私有/元数据 IP 区域。Async 发送可防止慢端点阻碍您的应用程序。自动失效后 15 连续的失败可以防止死点的资源浪费。

工作空间隔离

工作空间之间的严格数据隔离,访客,票房,聊天,CRM记录,以及AI对话被范围化到工作空间,跨工作空间数据泄露在查询层被防止.

计费周期管理

支持月、季度、半年、年度、两年期和终身计费周期,货币正常化用于多种货币网关,在收款后进行FX转换以准确报告收入。

自动和预定自动化

构建用于计划任务的Crun系统:报告生成,数据清理,订阅续订,AI培训更新,连接器同步,以及webhook重试. 健康诊断有警告指标.

数据保留政策

配置访问者会话、聊天记录、AI对话历史和事件日志保留时间。自动清理旧数据以管理存储并遵守保留政策。

诊断和健康

系统健康仪表板显示克龙状态,数据库连接,AI提供者状态,连接器健康,webhook送出率,以及存储使用. 配置问题和性能瓶颈警告.

谁 OpsIQ 用于

电子商务商店

存储

追踪每个游客从降落到购买,让AI回答"我的订单在哪里?"使用直播. Shopify/WooCommerce/ BigCommerce 数据. 使用 AI 自动重写管理支持票。 运行批发和 B2B 线索的交易管道 。 将收入分配给交通来源和运动 。 用回收工作流程监控推车的废弃 。

SaaS和软件公司

SaaS

监视测试的签名和特性的通过并重放会话 。 跟踪文档页面转换的路径。 自动支持 AI , 植入于您的 API docs. 管理订阅收入和客户关系管理系统的扩展交易。 连接您的计费平台( Stripe, ) WHMCS)用于实时核磁共振跟踪。使用CRM生命周期剂检测和防止churn。

机构和自由职业者

机构

向客户端提供白标签分析及支持门户。 从一个管理员处获取多个客户端的跟踪线索。 使用 CRM 管道管理前景和项目线索。 为客户端平台建立自定义连接器, 使用连接器构建。 创建标有品牌的 SEO 报告, 并创建网站智能。 重新出售市场连接器作为增值服务 。

东道主和基础设施

托管

深处 WHMCS 与 80+ AI 搜索订单、服务管理、DNS 自动重温常见的托管问题,使用知识库文章。跟踪服务器状态页面的操作。用AI分类管理技术支持票。使用计费周期梯级,每月到终生托管计划。

支助性重的企业

支助

抛出 40-70% 以您的知识库为基础,使用 AI 聊天重复提问。 途径 IP 分解 。 跟踪团队在解析时间、 SLA 合规度和 CSAT 的运行情况 。 请使用 AL 来起草专业答复 。 用 AI 对AI 的见解来监测支持趋势 。

销售和SEO团队

营销

全站智能套件:爬行,技术SEO审计,内容分析,SERP排名跟踪,关键词研究,回接监控,以及本地SEU网格. Google Business Profile 管理. 客户的定期白标签报告. A/B测试在跟踪部件中被构建. 运动归属遍及所有频道.

独奏创始人和小团队

启动

开始只是跟踪和聊天, 可以免费添加。 然后在获得支持量时添加入场券。 在开始销售时打开 CRM。 在您采用时连接平台 。OpsIQ 从一个人做所有事情到一个 50- 人员行动组与RBAC,各部门, 和每名特工的性能跟踪。

企业和多品牌

企业版

企业 SSO 与 OIDC 进行集中认证。多工作空间隔离,用于单独的品牌或分区。每个工作空间的AI配置,有不同的提供者和模型。自定义连接器开发与市场分布。审计线索, GDPR 遵约工具和数据保留政策。

或 OpsIQ 替换

Google Analytics + Hotjar + 活性

网站全面分析 访问者追踪,会话回放,页面排名,地理智能,意向漏斗,转换归属,事件,A/B实验,JS错误跟踪,都方便隐私,都在一个平台上.

Intercom + Drift + Tidio 双层

AI有权力的客户聊天,以知识定位,多提供者AI支持,自动向人掌权,主动聊天规则,对话历史,CSAT调查,以及从聊天中创造出票.

Zendesk+ 新鲜办公桌+ 帮助童子军

原产地售票系统与部门,优先,SLA,AI分版,自动重回可配置延迟,电子邮件摄取,入票嵌入,入出票合并,收件箱副驾驶,并返回AI能力.

接地平道+管道+销售力

AI-First CRM,拥有四个专门的AI代理(Steward,SDR,保留,分析员),Trust Dalic自主控制,管道板,交易导师,预测,序列,生命周期管理,以及自然语言的CRM配置.

雅里夫斯+ SEMRush + Moz 键

站点情报系统有自动爬行,技术SEO审计,内容分析,AI搜索,SERP排名跟踪,关键词研究,回路分析,本地SEU网格,以及计划白-标签报告.

Zapier + 制作 + 自定义中间软件

连接器 SDK 与 25+ 预建的连接器、连接器构建器(无编码/AI辅助/全码), OAuth 流程,webhook自动注册,一个大型的连接器动作定义目录,只有在相关连接器安装,启用,配置和验证,SmartLookup, market, 以及签名的软件包时才能执行.

谷歌商务简介管理器

完整的 GBP 连接器:审查管理,邮报出版,QQA管理,相片上传,业务信息同步,洞察力跟踪,以及AI 驱动的审查响应,全部来自内部 OpsIQ.

单独的电子邮件模板工具

由注册驱动的电子邮件模板,包含可视化编辑器,活预览,可变芯片,全局布局控制,以及所有自动化通信的每个事件定制.

团队管理仪表板

内设团队绩效:解析时间,工作量,SLA合规,CSAT按代理、重开费率、最繁忙的时数、实时存在跟踪和每个部门分解。

GDPR 遵约工具

原生的 。DSAR 处理、所有系统的数据消除、同意管理、保留政策和审计线索,都建在平台上,而不是紧贴上。

两版

东道方部署

OpsIQ 运行在管理下的基础设施上。产品操作相同;基础设施、更新和备份由主机操作员处理。本手册记录 OpsIQ 运行时间,而不是营销或商业账户流动。

自行托管模块

安装 OpsIQ 在您自己的服务器上对数据、品牌、更新和集成进行全面控制。需要PHP 8.4+, MySQL 5.7+ 或 组合键 MariaDB 10.3+, HTTPS, 以及 OpsIQ 统一括号。支持 WHMCS 集成为外加模块。完全数据主权。

建议的阅读顺序

1
快开始

跟着 30- 一分钟设置指南,以获取跟踪,聊天, 和基本AI工作在您的网站。

2
盘子和分析

学习如何读取访客数据,设置会话回放,识别线索,了解交通规律.

3
站点情报

运行你的第一次SEO爬行,检查你的技术健康, 并设置SERP级别跟踪 你的目标关键词。

4
车票和支助

设置部门, 配置自动重读 AI, 连接电子邮件摄入, 并训练您的 AI 处理常见的问题 。

5
CRM

组织联络人,建造管道,配置AI代理,设定信任拨号级别,让AI指导您的交易.

6
连接器和开发工具

连接您的电子商务/ 帐单平台, 构建自定义连接器, 设置网点, 并通过 REST 集成 API.

💡
新建为 OpsIQ* 从下面的快速启动指南开始。您可以在下面运行跟踪和基本的 AI 聊天 30 几分钟。
从这里开始

快速开始 30 分钟

遵循这些步骤,以获得 OpsIQ 运行中。每个步骤都以上一个步骤为基础。到最后,您将会有访客跟踪、人工智能聊天和基本的票务支持。

设置
快速启动检查表指导设置清单,显示部件安装、平台连接、AI培训、团队邀请和上线 60 进取栏%.开始吧setup安装 OpsIQ 部件完成连接一个平台( E)WHMCS, Shopify...)完成让你的AI了解你的内容完成请你的团队检查和去现场设置进度3联 合 国5 · 60%1STEP 1安装部件2STEP 2连接列车AI( T)3STEP 3邀请到现场( G)
密码 30-分钟路径:安装部件,连接一个平台,训练你的AI,邀请团队,然后开始直播.

密码 30- 准备一分钟

1
激活您的驾照

输入您的驾照密钥 OpsIQ 管理器。 转到设置, 输入为此安装提供的许可密钥, 点击激活。 您应该看到绿色的“ 主动” 徽章 。

2
设定您的商业身份

设置并填写您的商业名称、 行业、 时区、 默认货币、 支持时段。 这些信息被AI 用于回答客户问题, 以及分析时区报告 。

3
选择一个 AI 提供者

转到 AI 配置并选择您的提供者。 选项: Claude ()Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google) 或 Grok(xAI) 。 请输入您的 API 键,如果您使用自己的密钥,或者在您的计划中可用时使用管理AI。单击“测试连接”进行校验。

4
安装跟踪部件

Go to Connected Sites, copy the tracking snippet, and paste it before the closing </body> tag on your website. Visit your site in a private browser, then check the Live Feed in OpsIQ. You should see yourself as a visitor within 15 seconds.

5
连接您的平台

如果您使用 Shopify, WooCommerce, WHMCS,或者另一个支持的平台,去连接器,找到您的平台,输入证书,并点击测试连接。这使AI访问命令数据、客户配置和支持上下文。

6
请你的团队

前往团队,点击邀请,输入他们的电子邮件和角色(Owner、Full Admin或Agent). 代理只能访问您指派给的部门。所有者和Fuill Admits看到所有的东西 。

尽可能快的路径( E)5分钟)

步骤1: 安装部件

复制连接网站的片断并粘贴在您的网站上。 这样您就可以立即跟踪 。

步骤2: 启用 AI

转到 AI 配置, 选择一个提供者, 输入您的密钥并保存。 AI 现在正在您的网站上活动 。

完成( E)

你现在有访客跟踪和人工智能聊天 你可以加票CRM,然后连接器。

日数2: 让它有用

添加知识

转到知识库添加5-10 有关您常见问题的文章。AI用来准确回答客户。

创建部门

转到入场券并至少创建2部门(如"销售"和"支持"),各指派出团队成员.

写您的AI 提示

前往AI训练并写一个客户AI提示,描述你的业务,语气,升级规则.

测试对话

打开您的网站, 并作为一个客户与 AI 聊天。 请检查答案是否准确, 音调是否正确 。

周数1: 构建您的操作

连接电子邮件

建立一个邮箱(Gmail, IMAP,或者提供商连接器),所以客户电子邮件会自动创建出票.

自动重写设置

启用安全部门的自动复制票。设置一个2- 耽误一分钟,人类可以先介入。

审查分析

每日检查 Dashboard。 请查看访客数、 弹跳率、 顶端页面, 如果跟踪连接的话, 销售量 。

开始吧CRM

打开AI CRM 并让OpsIQ从您连接的平台导入联系人。请检查管道板。

月数1: 优化

审查大赦国际的历史

请检查AI History周刊。 查找错误的答案、 错过的问题和增加知识的机会 。

增加主动规则

创建一条规则: 如果访问者在价格页面上 60+秒,显示聊天信息,询问是否需要帮助.

构建连接符

如果使用一个没有内置连接器的平台,则使用连接器构建器来创建一个.

设置网路

连接 OpsIQ 使用外出网标进行售票、聊天和销售活动。

我能跳过AI,然后用追踪吗?+

是的 人工智能提供者是可选的 OpsIQ 在没有AI的情况下,您可以使用纯解析器和售票平台。您可以稍后在您准备好后启用AI。

我可以跳过连接器 并增加它们以后?+

是的,连接器用特定平台的数据丰富了人工智能,但 OpsIQ 操作时没有它们。从跟踪和聊天开始,然后在需要时连接平台。

如果我还没有网站呢?+

你还可以用OpsIQ罚单,CRM,以及团队协作。跟踪部件是可选的。在您的网站准备好后添加它。

我怎么知道部件安装是否正确?+

访问您网站的私人/ 匿名浏览器。 然后检查 OpsIQ Live Feed. 你应该看看你的拜访出现在里面 15 秒。如果没有,请检查: (1)是片段被正确粘贴,(2)是站点键正确,(3)是广告屏蔽器或CSP头来屏蔽脚本.

从这里开始

完整的产品映射

OpsIQ不是一个特性。它是一个操作员管理器、一个网站部件、一个AI支持层、一个票务/服务台系统、一个完整的CRM包含四个AI代理,一个Site Intelligence套件,一个连接器平台和市场,以及一个开发者表面。这里是它包含的每一个组件。

操作员管理员

盘子 直播 访客日志 会话回放 顶页 地情 意向漏斗 事件日志 A/B实验 联合通讯错误跟踪 销售和转换 线索 AI CRM(指挥中心,联系人,公司,交易,管道板,交易指导,预测,探矿,序列,生命周期,数据管理员,构建我的CRM,CRm配置,CREM健康,CRAM) API、票务、聊天信箱、主动规则、CSAT调查、电子邮件草稿、邮箱、AI配置、AI培训、AI历史、AI洞察、知识库、连接器、Connector Builder、市场、连接站点、团队管理、团队业绩、设置、诊断和许可证。

客户表面

网站跟踪部件(分析信标+聊天+入票+知识库搜索),客户端AI聊天,出票提交门户,访客身份代号处理,文件上传,CSAT调查部件,以及客户-faceface帮助中心.

AI-第一国际CRM

指挥中心、联系人、公司、交易、拖放管道板、AI交易辅导(风险信号、最佳行动、赢概率)、收入预测、探矿代理(SDR)、自动后续序列、生命周期和留存管理、数据管理代理(dedup、丰富、验证)CRM(自然语言设置),CRM配置, 用于CRM健康检查、信托电话(自动驾驶/副驾驶/每名代理人手册)、4个专业代理(斯特沃德、特别提款权、保留、分析员)CRM API与网络呼喊。

站点情报套件

自动化网站爬行,技术的SEO审计(速度、移动性、核心网络维生, SSL,再定向,结构化数据),内容审计(字数,可读性,关键词密度,标题结构),AI动力语义搜索,SRERP排名跨引擎跟踪,关键字研究并附有机会评分,回路分析和监测,本地SEO网格可视化,Google Business Profile同步(回顾,帖子,QQA,相片,见解),计划报告(日/周/月)和白标签 PDF 各机构的产出。

AI和自动化

客户AI聊天(多供应商:克洛德、GPT-4o、Gemini Grok),管理员AI助理,AI知识地盘定位,可配置回放的自动手接,每个工作空间AI配置,管理AI和 BYOK 模式,符号预算和成本控制,AI历史审计线索,AI洞察分析,票款AI分解,自动校正有延迟的票款,写出AI(单独快取),以及管理员收件箱副驾驶.

连接器和集成

25+ 预建连接器(Shopify, WooCommerce马根托大商业公司2, PrestaShop, OpenCart, OsCommerce, (原始内容存档于2018-09-21).WordPress, WHMCS, Zendesk, StripeAmazon SES, Postmark, Resend, SendGrid, 邮件枪,Gmail, IMAP, Slack, Google Business Profile),连接器构建器(无编码/AI-协助/全码),通用OAuth与 PKCE 、 有付费分发的连接器市场、 连接器签名和验证、 SmartLookup fuzzy 匹配、 大量HTTP 动作定义目录,其可用性取决于连接器安装、启用、配置和验证, 知识同步以及工作流程配方。

开发者平台

净 值API(访客、活动、门票、联系人、设置、连接器),OpenAPI spec,API 密钥管理,出站的网络呼号(同步、签名、重审、SSRF保护、自动失效),事件API 用于自定义事件摄取,部件 SDK带有身份解析度、触发子目录、行动合同、连接器 SDK、市场包装、服务器侧 SDK(PHP、Node.js), WordPress 插件,以及 WHMCS 模块。

设置和操作

业务身份,每个工作空间的AI配置,跟踪设置,安全性(HSTS,权限政策, IP (c) 调查设计师、域名知识、票房配置、品牌设计、数据保留政策、计费周期管理(从每月到终生)、货币正常化、进出口、诊断、cron自动化和危险区。

安全和遵守规定

企业 SSO (OIDC 与JWKS验证,JIT提供),. SAML 配置, 用于 GDPR/DSAR 处理(在所有系统中导出并删除)、数据擦除每次接触、同意管理、工作空间隔离(严格查询层范围界定)、审计线索、登录跟踪失败、IP 屏蔽、出网的SSF卫士和数据保存政策。

提供者桥

管理AI代理通过 OpsIQ 提供者 URL 现场情报提供商的电话 执照验证 健康报告 PDF 渲染和数据导出,全部通过配置的提供者端点进行路由,而不是直接供应商 API 服务器上的电话 。

每页管理员

盘子

核心

每日指令中心:流量综述,现场访客计数,销售摘要,支持队列深度,AI活动提示等快速动作快捷键.

现场直播

分析

实时访问者流:页面浏览,聊天开始,形成提交,以及意向信号每几秒更新一次,并带有国家,设备,以及裁判过滤器.

访客日志

分析

完整访问记录:设备,浏览器,OS,国家,城市,裁判员,UTM参数,登陆页,身份,以及完整页面查看历史.

会议

分析

由行走组合的视图:页面流,页面上的时间,滚动深度,转换路径,以及每次访问会话的出站页面.

会话重放

分析

被捕获事件的时间线回放:鼠标移动,点击,滚动,页面过渡,并形成UX诊断的交互.

顶端页面

分析

页面性能排名:访问,约定时间,回弹率,转换,支持互动,并有趋势方向.

地理情报

分析

地理报告:国家/城市分解,包括地图、设备分发、浏览器共享、交通来源和市场渗透。

内向漏斗

分析

行为意图跟踪:定价访问,回取频率, doc浏览,支持交互,以及带有转换概率的自定义信号.

事件日志

分析

可搜索事件历史:页面浏览,自定义事件,聊天,购买,格式提交并附有完整的元数据并过滤.

A/B实验

分析

分拆测试:创建变体,分配流量,定义目标,测量意义,并宣布胜者,全部来自内部 OpsIQ.

联合来文错误

分析

前端错误抓取:消息,堆栈痕迹,受影响的浏览器,频率,受影响的页面,以及趋势跟踪.

销售

销售

收入仪表板:订单、续签、退款、按来源的归属、竞选业绩、期间比较和趋势分析。

销售

领跑管理:分数,源归因,CRM状态,联系方式,行为信号,和管线通路.

大赦国际CRM

CRM

满CRM:指挥中心、联系人、公司、交易、管道板、辅导、预报、探矿、序列、生命周期、数据管理员和健康。

车票

支助

支持收件箱:部门,重点,SLA跟踪,AI分解,自动回存,内部注释,文件附件,合并,以及状态管理.

聊天收件箱

支助

活口对话:AI与人聊天,交接,合作,对话历史,客户身份,和CSAT相收.

电子邮件草稿

支助

电子邮件管理:入站邮件到出票,AI辅助回复构成,模板选择,和邮箱配置.

AI 配置

大赦国际

提供者设置: 选择 Claude/GPT-4o/Gemini/Grok, 输入 API 键或启用管理的AI,设定模型,温度,以及每个工作空间的符号预算.

AI培训

大赦国际

即时作者:客户迎面和接地的提示,升级规则,调子准则,被禁话题,和边界配置.

大赦国际的历史

大赦国际

谈话审计:完整的请求/答复日志,信使使用,每个谈话的费用,提供者,模型版本,以及解析结果.

大赦国际的见解

大赦国际

模式分析:常见问题,解析率,交接频率,按主题分列的满意度,以及培训差距的识别.

知识库

大赦国际

AI培训内容:文章,FAQ条目,产品docs,连接器知识,以及自定义条目. Semantic and keyword search for AI slooting.

连接器

集成

集成枢纽:已安装的连接器,健康状况,动作盘点,证书管理,市场浏览器,和连接器构建器.

连接的网站

设置

站点管理:跟踪片段,站点密钥,部件配置,域名设置,以及每个站点的工作空间隔离.

团队

设置

用户管理:邀请成员,分配角色(Owner/Full Admin/Agent),设置部门访问,管理权限.

团队业绩

设置

行动衡量标准:分辨率、工作量、SLA合规,CSAT重开费率 最繁忙的时数和趋势分析

设置

设置

配置:企业身份、AI设置、跟踪、安全、品牌、保留、电子邮件模板、账单、进出口、诊断和危险区。

许可证

设置

计划管理:许可证状况、计划特征、使用指标、续约日期以及升级/下级选项。

从这里开始

已引导入职

登机之旅将新的装置变成工作 OpsIQ 工作空间,并且可以离开和恢复,而不会失去进展。

产品屏幕
上岗登入显示每个设置区域,其当前状态和下一个动作需要完成.上岗工作空间PROGRESS60%COMPLETED6下一个部件现场工作现场许可证认证产品许可证完成( E)AI 提供者选择提供者和测试密钥完成( E)品牌企业特性和语气完成( E)网站添加站点并安装部件ưμ㼯A1COMPLETE BASICS许可证、品牌、AI2CONNECT DATA站点和连接器3VERIFY LAUNCH团队、电子邮件、支票
登入显示每个设置区域,其当前状态和下一个动作需要完成.

建议的顺序

  1. 许可证 : 验证许可证,确认工作空间是活动空间。
  2. AI 提供者 : 选择提供者/ 模型, 输入证书并运行连接测试。 如果工作空间最初只使用分析器和票, AI 可以跳过 。
  3. 企业身份: 设置部件和AI所使用的名称、行业、描述、客户化语气和品牌细节。
  4. 连接符 : 启用至少一个外部平台时 OpsIQ 需要订单、客户、机票、电子邮件或其他平台上下文。
  5. 站点和部件 : 创建站点/工作空间,复制站点密钥并验证在Live Feed中访问的私人浏览器.
  6. 团队和路线: 请管理员/代理,创建部门,设置电子邮件路由,确认通知偏好.
  7. 启动访问 : 测试聊天,一张票,连接器同步,cron,出局电子邮件,webhooks和安全头.

行程存储每个工作空间的完成量。返回登入时应当显示已完成的步骤,而不是强制重启。

从这里开始

管理导航和权限

密码 OpsIQ 侧边栏是允许的。此地图解释每个操作区域住在哪里,为什么一个页面可能无法为每个管理员所看到 。

产品屏幕
OpsIQ 导航侧边栏组 OpsIQ; 单个链接仅在当前角色可以使用时才会出现。OpsIQ 导航工作空间GROUPS8权限SEARCH可用现场工作现场支助机票,电子邮件,CSAT,知识打开CRM联系、管道、交易、探矿打开自动化工作流程、规则、目标打开安全和隐私概览、审计、同意、区块管理员1PICK A GROUP匹配侧边栏2CHECK ROLE隐藏表示限制3USE PAGE HELP打开匹配区域
侧边栏组 OpsIQ; 单个链接仅在当前角色可以使用时才会出现。
支助

入场券,团队电子邮件平台,CSAT,帮助中心和聊天机相通.

CRM

每日销售量:CRM家、指挥中心、联系人、管道、预报、生命周期、探矿、分会、领导板、交易批准、数据管理员、成长工具和活动流。

自动化

事件驱动的工作流程,生命周期规则和转换目标.

营销

拓展,主动信息,公告,促销工作室,调查工作室等推介活动及导游.

分析

报告首先会浮出水面——分析枢纽,AI洞察,销售,客户,线索,漏斗,A/B测试,会话重播,自定义的仪表板和预定报告——原始访问者,会场,页面,地理和事件日志在一个Raw Data子节中.

独立页面

现场情报、小组业绩和反馈作为直接条目在小组之外。

集成

连接器、动作和触发器、邮箱、草稿、电子邮件设置、入境端点、出境的网络呼号以及API键。

安全和隐私

安全概览、隐私和合规、饼干同意、审计活动、登录失败、被封锁IPs财务报告和已审计财务报表JavaScript错误。

设置

工作空间基础(通则,团队,站点,语言),再相撞分科:AI Brain (教程,配置,评价,历史),CRM设置(建设者,自定义字段,主打分,健康),数据与健康(诊断,导出)和Get Started (上线,帮助).

无法打开的角色的页面隐藏在侧边栏。当前计划不包括可视性 升级 标记并打开一个应用中的升级屏幕。

直接路径仍然被检查服务器侧面。 隐藏侧边栏链接不是安全边界: 每个受保护的行动都必须通过许可和工作空间检查 。

分析

分析中心

分析中心将支持、聊天、AI、访问者和代理报告带入一个可输出结果的经枣滤的工作空间。

产品屏幕
分析中心分析Hub显示一个日期范围,度量卡和分页,用于支持,聊天,AI,访问者和Agent性能.分析中心工作空间图表184AI RESOLVE63%CSAT4.7现场工作现场支助创建、关闭、待建SLA标签聊天AI/人类成果和处理时间标签大赦国际信心、反馈、符号使用标签探员数量、速度和满意度标签1CHOOSE DATES预设或自定义2CHANGE TAB支持代理商3EXPORT下载 CSV
分析Hub显示一个日期范围,度量卡和分页,用于支持,聊天,AI,访问者和Agent性能.

过滤器和控件

  • 使用预设或自定义 从/从 范围,然后刷新以重建同一期间的每张牌和图表。
  • 导出 CSV 输出活动分析视图,而不是截图。
  • 工作空间范围是自动的;改变地点会改变基础数据集.

每个分页测量

  • 支助: 门票创建/关闭/待售,第一次答复、解析、第一次接触解析SLA,以及优先次序/部门/状况的分解。
  • 聊天: 课程开始,AI决议,升级,放弃,处理时间,每会话信息,以及AI/human/all CSAT.
  • AI: 平均信心、低自信率、分辨准确性、反馈、知识偏移、信使/缓存使用以及需要审查的项目。
  • 访客: 选定期间的交通和接触趋势。
  • 探员: 每一代理人的工作量、速度、关闭和满意程度。

使用分析枢纽进行跨团队审查;在需要记录级调查时,使用专用访问者,票房,CSAT,AI历史和团队性能页面.

分析

达克板

Dashboard 是您的日常指令中心。 它在一个视图中显示流量、 销售量、 支持负荷、 AI 活动和转换指标。 每天早上打开它来了解一夜之间发生的事情, 今天需要注意什么 。

盘子
概览仪表板A. 由A. · · - ·· —— ·- · -- · (a) · " 概览 " 屏幕 OpsIQ 情报AI面板(有每日简报,智能提醒,预测等),KPI部件瓦和一款7天的流量部件,外加重置布局控制.概览工作空间OPSIQ 情报选个分析 OpsIQ 写出来每日简报智能警报预测重置布局今天的记者们2,481+12%回归$8 2k (单位:千美元)+5%公开的桌面143 SLA· 最后一个7天数1AI-FIRSTOpsIQ 情报小组2WIDGETSKPI 牌你安排3你的电话随时重置布局
真实概览屏幕: OpsIQ 在您自己安排的 KPI 部件上方的智能面板( 选择一个分析并写它) 。

解说纸牌

现场访客

您的网站上现在的人数。 此数据将更新到 15 秒( 可配置) 。 如果访问者在活动阈值内加载了页面( 默认 : 90 (第2行,第3行) (中文(简体) ).

独有访客

有多少不同的人在选定的日期范围内访问您的网站 。OpsIQ 以浏览器指纹、饼干和(如果有的话)认证身份组合识别访客。

新建 vs 返回

新访客首次访问您的网站。 返回的访客已经见过。 高返回率意味着您的内容会带回人们。 极低的返回率可能意味着您不会保持利息 。

弹出率

仅查看一页后离开的访客百分比。70% 在登陆页面上通常表示该页面没有满足访客的期望,内容错误,负载缓慢,或者移动体验差.

平均页数

访问者平均花费在每一页上的时间有多长。10 在内容页面上显示的内容没有涉及。在页面中显示的很长一段时间可能表示混乱。

威胁被阻止

IP解决 OpsIQ 根据威胁分数、野蛮武力企图或手动块,识别为潜在恶意。单击可查看被屏蔽 IPs 列表中选择一个选项。

今天/本周/本月的销售量

相关销售来源的收入(美元)Shopify, WooCommerce, Stripe。如果销售显示为零,请检查您的平台连接器是否已经连接并同步。

趋势图

显示访客在选定日期范围内的行图。 查看模式: 交通高峰( 运动、 媒体提及)、 水槽( 周末、 节假日) 和持续趋势 。

最大来源

访问者来自以下地点: 直接、 Google、 社交媒体、 电子邮件活动、 转介站点。 请用这个来了解哪些营销渠道在起作用 。

顶级浏览器

Chrome、Safari、Firefox、Edge等。如果浏览器的回弹率异常高,你可能会有 CSS 或 为 JavaScript 兼容性问题。

小时加热图

显示每周小时访客活动的网格。 请用此网格来决定何时安排支持班次、 何时发送通知、 什么时候进行升级 。

最近访问者

少数访问者有国家、网页、设备和来源。 在竞选期间,他们可以快速抽查。

使用日期范围过滤器

点击 Dashboard 右上角的取日期器。 预设: 今天、 昨天、 最后7天数, 最后一个 30 天数, 本月, 上月, 自定义范围。 当您更改范围时, 所有仪表盘卡和图表都会更新。 日期范围位于您配置的时区( 在设置中设置) 。

已成功的例子

调查弹出率猛增

假设情况:
你的弹出率从 45% 改为: 78% 这周发生了什么?
怎么办:

检查 : (1) 特定登陆页有变化吗? 转到顶端页面并按弹出率排序 。 (2)运动是否将流量发送到错误的一页? 请检查顶端源头是否有新的裁判员。 (3) 移动中站点是否断开? 检查浏览器断开的移动回弹速率 。 (4检查威胁柜台和访客详情,看看可疑的图案

仪表板上没有访客

假设情况:
仪表板显示0现场访问者,尽管您的网站正在获得流量。
怎么办:

检查 : (1) 跟踪部件已安装吗?查看您的网站源代码并搜索 OpsIQ 脚本. (正文).2) 站点密钥是否正确? 将脚本中的数据站点- 密钥与连接站点中的密钥进行比较 。 ()3CDN 或缓存是否服务于没有脚本的已死页? 清除您的 CDN 缓存 。 (4) 广告阻塞器或CSP头封堵了脚本吗? 请检查浏览器控制台是否封锁了请求 。

读取小时热图

假设情况:
你的热图显示,在工作日晚上10点到2点之间活动很激烈,但在周末却什么都没有。
怎么办:

这是B2B交通模式,您的访客在上班时间工作专业人员浏览。1(b) 安排工作人员工作日工作时间。2星期二至星期四上午发送电子邮件活动。 (3)周末维护窗口安全.4考虑只在高峰时段提供现场聊天。

来自不明来源的交通高峰

假设情况:
你看,突然间... 500 一小时后从一个未知的裁判处来
怎么办:

到访客那里去,然后通过时间窗口过滤。 请检查 : (1) 他们是真正的访客还是bots?看看会话持续时间,页面浏览,浏览器的多样性。 (2如果是真的,他们登陆的是什么页?3)检查裁判 URL 可能有人与你联系过 Reddit, Hacker News, 或一个受欢迎的博客。 (4如果是机器人交通,则检查威胁并考虑封锁 IP 范围。

为什么我的访客数与 Google Analytics?+

OpsIQ 它使用浏览器指纹和饼干,而GA则使用不同的饼干模型。瓶子过滤、广告阻塞率和脚本加载顺序也会造成差异。10-20% 差异是正常的。

我能把仪表板嵌入另一个工具吗?+

仪表板是设计为 OpsIQ 管理。外部报告时,请使用REST API 用于拉动分析数据,并在自己的仪表板或BI工具中显示。

"威胁"柜台是什么意思?+

这算数 IP 解决 OpsIQ 已根据威胁分数、重复失败的登录或手动块标记或屏蔽。单击计数器可查看细节并管理块。

分析

访客日志

访问者日志显示您所跟踪的网站的每次访问。 每行都是一个访问者的一页载荷。 用它来调查个人访问者的行为, 发现竞选流量, 并诊断追踪问题 。

访客日志
访客日志带有过滤栏的访客表( 日期、 搜索)IP/电子邮件/城市、来源、设备)和列 IP/电子邮件,位置,来源,装置和时间,并有标记的威胁行.访客日志yoursite.com7天数搜索 IP 电子邮件,城市...来源▾设备▾IP / 邮件地点资源DEVICE 数据交换系统[email protected]美国 · 纽约google桌面2米(含2米)41.62.10.4伦敦direct移动6米(6米) 高温[email protected]DE 柏林类: 类移动14米(含1 400米)203.0.113.9NG · 拉各斯referral桌面threat1–25 联 合 国 3,402会 议→1FILTER日期 · 搜索 · 资料来源 ·设备2REAL COLUMNSIP/电子邮件-位置-设备-威胁3DRILL IN打开会话
真正的访问者日志:按日期、搜索和设备过滤,然后阅读每次访问 IP 电子邮件、位置、来源、装置和时间,用红色标出的威胁。

每行显示什么

IP 地址

访客的 IP 地址。如果 IP 在设置中启用了匿名化。 单击可查看此选项的所有访问 IP.

国家和城市

探测到的IP使用 GeoIP 数据的地址。MaxMind GeoLite2数据库或Cloudflare地理头。 如果没有配置 GeoIP , 则显示“ 未知的 ” 。

页次 URL

访问者加载的页面。 点击可看到完整 URL长 URLs 在表格视图中切换。

参考文件

在登上你的站点之前, 访客来自哪里。“ Direct” 表示没有裁判员( 书签, 键入) URLs,一些应用链接).

设备与浏览器

访客设备类型(桌面,移动,平板电脑)和浏览器(Chrome,Safari,Firefox等). 从用户代理头解析.

日期和时间

当页面被装入时, 在您配置的时区中 。

客户身份

如果访客的身份被识别(通过身份标志或登录),他们的名字或电子邮件就会出现。否则会显示匿名。

过滤器

日期范围

过滤特定时间段的访问。 默认: 最后一次7几天时间。

搜索

搜索者为 IP 地址,页 URL、裁判员、国家或客户电子邮件。

来源

按交通来源进行过滤:直接、有机、社会、转介、付费、电子邮件。

设备

由桌面、移动或平板电脑过滤。

仅新建

仅显示第一次来者 从未见过。

已成功的例子

寻找特定活动的访客

假设情况:
您用 UTM 参数 utm_ source=google&utm _medical=cpc&uttm_campaign=夏至销售启动谷歌广告活动。 您如何找到这些访客 ?
怎么办:

在访客日志中,使用搜索字段并输入"夏-发售"。搜索检查参考器 URLs 和页 URLs,因此 UTM 参数将匹配。您也可以通过 Source = 付费来过滤以进一步缩小。

找到一个客户 谁报了问题

假设情况:
一个顾客发了电子邮件说 "昨天下午3点左右你的离职页面被打破" 你怎么找到他们的会话?
怎么办:

在访问者日志中搜索他们的电子邮件地址。 如果登录的话, 他们的身份将会出现。 将日期范围设定为昨天。 请在下午3时左右查看访问页面。 点击他们的会话以查看完整页面流和任何 JavaScript 错误。

检测回路击打机或刮刮机

假设情况:
你注意到一个 IP 地址为 500+一小时后访问,全部到同页.
怎么办:

这可能是一个机器人、刮子机或被打碎的脚本。请到访客日志中搜索 IP 选中 : (1是否所有访问都在同一页? (2)用户代理是否是已知的bot?3会期是否总是0如果确认为机器人,请前往安全单位封锁 IP.

访问日志 vs 会话 vs Live feed

访客日志

原始页面载荷。 每页一行浏览。 最佳的: 调查特定页面, 查找特定来源的流量, 诊断跟踪问题 。

会议

将页面浏览分到行程。 每访问会话一行。 最有利于: 了解用户流量、 测量会话持续时间、 识别转换路径 。

现场直播

实时活动。 现场显示访客。 最佳的: 监测活动正在进行中, 发现高注访问者, 观看支持机会 。

为什么我在日志里看到自己的访问?+

OpsIQ 默认跟踪所有访问。要排除自己的流量,请添加您 IP对被排除在外者的访问 IPs 在设置 > 跟踪中列出。

为什么一个访客会展示出"未知"的国家?.+

GeoIP 搜索需要任一 Cloudflare 地理头( 如果使用自动)Cloudflare)或 MaxMind GeoLite2 数据库文件。检查设置 > GeopIP路径,以确保数据库文件存在并可以读取。

访客资料保存多久了?+

访问者数据按设置配置的保留期保存( 默认 ): 90 之后,旧记录会自动被保留Cron的工作清理。

分析

会议

会话将同一人的多页视图组合成一个单一的行程。虽然访问日志显示单个页面负载,但会话显示人们如何从登陆到退出通过您的网站。

会议
会议会话日志表 IP、国家、设备、源、长度和页列以及标记的威胁行。会议yoursite.com国家(NG)会话日志IP(西)国家DEVICE 数据交换系统资源期限41.62.10.4联合王国桌面google3米(3米) 12s6102.89.6.2国家移动direct1米长 05s388.21.4.9代 办桌面类: 类7米长 48s11203.0.113.9美国移动referral零点 42s21SESSION LOG分组旅行2COLUMNS国家 设备 来源 持续时间3THREAT标出风险会话
真实会话日志:每名访客一行旅行( E)IP,国家、设备、源、持续时间和页),以红色标出有危险的会话。

会议如何运作

访问者加载第一页时开始会话。 它继续浏览更多页面。 当访问者在会话超时段不活动时结束会话( 默认 : 30 分钟)或关闭他们的浏览器。超时后返回的同一个人创建了新的会话。

每次会话都显示什么

第一页

登陆页,访客进入你的网站。这说明哪些内容吸引了人们。

最后一页

出站页面,是访客离开的地方。如果出站页往往是定价页面,访问者可能会将你和竞争者进行比较。

页数

访问者在本会话中浏览了多少页。 更多的页通常意味着更多接触, 但也可能意味着访问者丢失 。

会期

从第一页加载到最后活动的总时间。0秒是弹出(单页视图,没有进一步的交互)。

来源

本会场的交通源(Direct,Google,Social,转介等).

国家

被检测到的国家 从访客的 IP 地址,请问...

弹跳

访问者在只查看了一页后是否离开。 弹出的会议有红色指示器 。

改划

访客是否在会议期间完成了一个履带转换活动(购买、注册、提交表格)。

过滤器

搜索

搜索者为 IP,电子邮件,页面 URL,或者在会话中担任裁判员.

类型

由新访问者过滤( 有史以来的第一个会话) 或返回访问者 。

来源

由交通源过滤.

国家

按国家过滤以查看特定区域的会话 。

威胁/弹出

过滤器只显示被标为威胁的反弹会话或会话 。

已成功的例子

配置高价值客户

假设情况:
一个顾客刚做了大买卖,你想知道他们在买之前的旅程
怎么办:

在会话中搜索他们的电子邮件。 请查看它们的所有会话 :( s)1在购买前他们去过多少次?2他们看了哪页? ()3他们用聊天还是开罚单?4从第一次访问到购买的总时间是多少?这告诉你了高价值客户的典型购买之旅。

从新位置检测登录

假设情况:
顾客通常从尼日利亚入境 但俄罗斯会给你一个会话
怎么办:

在会话中搜索客户电子邮件。 比较最近会话的国名。 如果会话突然从不寻常的国家出现, 则可能是合法的旅行或损坏的账户 。 请检查 : (1在成功登入之前是否有过失败的登录尝试 ? ()2做了吗? IP 在同一会话内更改? 如果可疑,请标出复议标记。

开会和来访有什么区别?+

访问者是个人(或浏览器)。会话是该人的一次访问。同一访问者可以随时间而有许多会话。会话在超时后过期。

怎么样 OpsIQ 识别回访者?+

OpsIQ 使用 cookie、浏览器指纹和认证身份标志的组合。如果访问者清除了他们的 cookies 且没有登录,他们就会作为新访问者出现。

分析

现场直播

Live Feed 显示您网站上的访客实时。 它会自动每次更新 15 秒( 配置 ) 。 在运动、 产品发布和繁忙的支援期间使用它来观察当前发生的情况 。

现场直播
现场直播实时活动流显示在线直播访问者人数,以及各国最近游客行动的反馈.现场直播yoursite.com37网上访客现场活动现在· 观看 /pricing2s英国 开始聊天5sDE 添加到推车中9sCA 完成注册1RIGHT NOW看见谁在现场2AUTO-REFRESH更新时间 15s3ACT 青蒿素综合疗法跳入直播聊天
看看这第二秒你站台上是谁 他们在做什么 自动刷新每一个 15 秒数。

如何运作

Live Feed 民意测验您的服务器在配置的刷新间隔。 每行显示您站点上的访客: 当前的页面、 国家、 设备、 源、 会话长度和页数。 绿色亮点显示自上次刷新以来的新活动。 单击任何访问者行查看其完整的会话细节 。

设置

刷新间隔

实时种子更新的频率。 默认 : 15 数值( 以秒计)5-10s)提供更快的更新,但使用更多的服务器资源。30-60s)在服务器上比较容易,但实时较少.

活动阈值

访问者在最后一页负载后被视作“活动”的时间长 。 默认 : 90 秒。如果访问者装入页面,然后读取2几分钟不点击,它们就会在阈值后从直播中消失.

暂停按钮

点击暂停以停止自动重新更新。 如果您想要读取细节而不更新列表, 请单击恢复以重新启动 。

已成功的例子

竞选期间,要先发现热门线索

假设情况:
您正在运行一个产品发布。一位访客刚刚浏览了您的主页,然后是特性,然后定价,现在正在退出页面上。
怎么办:

这是高诱行为,在现场直播中: (1点击访客查看其会话。 (2如果他们开始聊天,AI将会有他们完整的旅程背景. ("A.3如果他们不买就离开,就会成为铅页的领先者。 (4)考虑建立主动规则,在访客联系出柜时显示聊天信息.

太多的游客来自同一个人 IP

假设情况:
看见没? 20 来宾来自同一地点 IP 地址,都在不同页面。
怎么办:

这可能是:(a)1与互联网共享的办公室。检查访问是否像真实的人(不同的网页,合理的会话时间)。2) 机器人或刮刮机。检查会话是否非常短(0-1或系统地点击页面。 (3负载测试。如果您正在运行自动化测试,则排除 IP 从跟踪。

为什么现场直播显示0我的站点有交通吗?+

检查 : (1部件脚本是否安装在您的站点上 ? ()2站点密钥是否正确? ()3活动阈值是否通过? ()4) 访客是否使用侵略性的广告屏蔽器来屏蔽追踪脚本?

我可以过滤 直播的种子,按照国家或设备?+

直播显示所有活动的访客。 对于过滤过的视图, 请使用访问者日志或会话页, 并附带过滤选项。 实时监控时, 直播是故意简单的 。

分析

顶端页面

Top Pages 显示您网站上哪些页面的流量最大。 它会按访问、 接触、 转换和支持活动排序网页。 使用它来识别您的最佳内容, 查找表现不佳的网页, 并发现生成支持问题的页面 。

顶端页面
顶端页面排名列表中,有横向访问栏和计数的被访问次数最多的页面.顶端页面yoursite.com访问次数最多的页面/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKED访问次数最多的页面2SIGNALS访问和转换3FIND开票的页
您的页面按流量和约定排序, 这样您就可以看到顶级内容和生成支持的页面 。

每个页面显示的内容

页次 URL

全数 URL 路径。如果分组被启用,则对相似的页面(例如产品变体)进行分组。

视图

此页面被装入选定日期范围的总计次数 。

独有访客

有多少不同的人观看了这个页面(一个看同一页的人两次计算为: 1) (中文(中国大陆). ).

弹出率

仅查看了此页后离开您网站的访客百分比。 高回放在登陆页面=问题;高回弹在"谢谢"页面=正常.

平均时间

访问者平均花多长时间在这个页面上。 非常短 = 不读取。 非常长的表格页面 = 混淆 。

聊天开始

从此页面开始了多少聊天对话。高聊天从一个产品页面开始意味着产品描述可能不明确。

支助票

本页的访客创造了多少张支持票. 高票计数=潜在的UX或内容问题.

已成功的例子

查找驱动支持问题的页面

假设情况:
你的支援小组不断问起运输问题,哪页失败了?
怎么办:

以“ 支持票” 或“ 启动聊天” 排序顶页。 查找数量多的产品或发送页面。 最多支持问题的页面可能信息不明确。 修正页面内容并监测支持问题是否减少 。

查找高退出率的页面

假设情况:
你想知道人们经常从哪里离开你的网站
怎么办:

排序为回弹率下降。 忽略自然是退出点的页面( 谢谢页、 确认页 ) 。 关注应该让访问者参与的页面: 产品页、 定价、 特性 。 这些需要更好的呼叫到行动或更清晰的内容 。

为什么一个页面显示0虽然我知道这里有交通堵塞,但还是能看见吗?+

检查 : (1)追踪部件是否安装在该特定页面上?单页应用程序可能不会在路由更改时点燃页面视图。 (2在跟踪设置中是否排除了页面? ()3CDN服务于没有跟踪脚本的缓存版本吗?

分析

地理情报

地理情报显示您的访客来自国家、城市、装置和来源。利用它来了解您的地理市场,决定语言支持,规划区域营销,并发现可疑的交通模式。

地理
地理情报一张访问地点地图 除了一个各国的酒吧排名。地理情报yoursite.com按地点分列的来访者美国联合王国代 办加利福尼亚国家1MARKETS国家、城市、设备2PLAN语言和地区3WATCH零星交通情况
游客来自(按国家、城市和装置)市场,

看见什么

顶级国家条形图

按访客数排名最高的国家。 点击一个国家来钻取到城市一级的数据 。

国家甜甜圈

按国家分列的交通量的可视分类,百分比为5%。

完整的国别表

每一个在选定期间有访客的国家,都显示游客人数、会话次数、弹出率和换算率。

城市钻入

点击一个国家,看看该国哪些城市的游客最多。

GeoIP 探测工作

OpsIQ 以两种方式检测访客位置:(1) Cloudflare 地理头。 如果您的站点落后 Cloudflare,国家检测是自动和准确的。 (2) MaxMind GeoLite2 数据库。 下载免费数据库并在设置中配置路径。 城市级检测需要GeoloLite2-City数据库, 而不仅仅是国家数据库 。

VPN和代理流量

使用 VPN 的访客似乎来自 VP N 服务器的位置, 而不是他们的真实位置。 这是设计上的 。OpsIQ 无法也不应该试图绕过 VPN 。如果您看到异常的国别模式,请考虑 10-20% 可能使用VPN的访客。

已成功的例子

意外国家交通量

假设情况:
你只经营一个美国业务,但 30% 交通来自印度。
怎么办:

检查 : (1这些访问者是否真实? 看看会话持续时间和页面浏览量。非常短的会话,高回放 = 可能的bots ().2他们通过Google找到你了吗?3如果流量是真实的,而且涉及的内容,那么考虑增加印度特有的定价或内容。

决定语言支持

假设情况:
你想知道你是否应该把网站翻译成西班牙语.
怎么办:

请看地理情报的页面。如果西班牙语国家(西班牙、墨西哥、哥伦比亚、阿根廷等)加在一起代表了超过 10% 您的交通流量低, 翻译值得考虑 。 另请检查: 来自这些国家的游客是否以与您的主要市场相似的速度转换 ?

区域支助转移规划

假设情况:
你需要决定不同时区的支援团队时间.
怎么办:

使用小时热映射( 在 Dashboard) 与 Geo Intelligence 组合。 如果 40% 你们的交通是从欧洲来的 35% 从美国,您需要覆盖两个时区。热图显示每个区域最活跃的时间。

有访问但没有命令的国家

假设情况:
德国显示 500 本月的访客,但零销量。
怎么办:

调查: (1他们是否在定价页面上出现?也许你的定价对那个市场没有竞争力。2检查你的航运页面是否提到德国。3货币不匹配会导致废弃的退出。 ()4这些访客是否来自单一来源,可能是低诱导流量?

为什么一个访客会展示出"未知"的国家?.+

GeoIP 没有配置。 要么设置 Cloudflare (自动添加了地平线头)或下载了 MaxMind GeoLite2 数据库,并在 Sets > GeuIP 路径中设置了文件路径.

我能阻止来自特定国家的交通吗?+

OpsIQ 不按国家设置阻塞。使用您的网络服务器或 Cloudflare 基于国家的屏蔽防火墙规则 。OpsIQ 注重能见度,而非网络层面的接入控制.

分析

内向漏斗

内特漏斗将访客的会话按他们似乎在做的事情分类:浏览、研究、比较、购买、获得支持或离开。用它来理解您网站的意图平衡,并找出游客从哪里出发。

内向漏斗
内向漏斗由浏览到Research的漏斗来与"购买"相提并论,加上支持和离开芯片.内向漏斗yoursite.com浏览- 8,200研究 · 4,100比较... 1,650购买 : 520支助 6%离开 11%1CLASSIFY访客想要的2STAGES要购买的浏览3十六、结 论找到落地的线索
分出按意向分类的会话(浏览,研究,比较,购买),这样你就可以确切地看到人们从哪里落下.

意向类别

浏览

参观者随意四处找找,短会,几页,没有发现具体的目标.

研究

访问者阅读产品/地物页面,docs,或博客内容. 页面上的时间更长,内容多.

比较

游客查看定价、计划比较或特征表。通常返回的游客。

访问者在报到、推车或报名页上。这些是您的转换机会。

寻求支持

访问者在帮助页面、联系页面或开始聊天时需要帮助。

弹跳

访问者一页后离开,订婚率低

如何读取漏斗

解释您的漏斗

假设情况:
1,000 参观者观看了定价。270 打开聊天。92 开始退房。64 付了钱 18 打开了支持票。
怎么办:

定价页面足够强大, 可以创建意图。 聊天在购买路径中很重要 : 27% 在购买前进行聊天。退票后的支持票可能表明激活或付款混乱。1(a) 确保AI聊天回答定价问题。 (2调查 18 常见问题的离职后支持票。

时间过滤器

使用日期范围过滤器来比较不同时期的意向模式。 例如, 将黑色星期五周五与正常周周相比较。 您应该看到“ 购买” 意图的激增, 并且如果升级造成混乱, 可能还会出现“ 寻求支持 ” 。

怎么样 OpsIQ 分类意图?+

OpsIQ 查看页面 URLs,会话行为,以及时间模式。定价页面信号比较意图。退出页面信号购买意图。帮助/接触页面信号支持意图。分类基于Heuristic,而不是AI驱动。

我能定制意图类别吗?+

目前没有。 分类是基于常见的网络行为模式内置的。 自定义意图分类在行进图上 。

分析

漏斗、保留和路径

构建从页面或事件步骤的自定义行程,测量组群保留,并发现访问者最常走的路由.

产品屏幕
漏斗自定义漏斗显示每个页面/活动步骤,其余访问者和转换百分比.漏斗工作空间STEPS4CONVERSION28.4%WINDOW72h现场工作现场查看定价1,420 来访者100%已选择的计划780 来访者54.9%已启动退出530 来访者37.3%订单完成403 来访者28.4%1DEFINE选择2–8步骤2MEASURE 音乐设置转换窗口3改进找到最大的滴水点
自定义漏斗显示每个页面/活动步骤,其余访问者和转换百分比.

漏斗

创建一个命名的漏斗 2改为: 8 。在数小时内设置转换窗口;仅在命令的步骤发生在窗口内时,访问者才会计数。使用步骤之间的放出来选择检查重播、出错、页面速度或消息的地点。

保留

保留团体访问者进入每周组,并显示返回人数。6, 8或 为 12 在比较释放或运动时,保持组群定义的稳定。

路径

路径列表最常见的页面序列。选择路径长度从2改为: 5页面来保留结果可读性。使用它来查找反复在转换前出现的出乎意料的绕道、共同出口和内容。

自定义漏斗是分析定义,而不是自动化。要对完成的步子作出反应,就会产生转换目标、分段、触发或工作流程。

分析

会话重放

会话重放让您观看访问者在您的网站上所做过的事:他们点击的元素、滚动方式、徘徊地点、以及输入的(带有隐蔽的敏感字段)。 使用它来诊断UX问题、校验错误报告并理解客户的混淆。

会话重放
会话重放播放器重放时显示一个有光标的页面取景口,会话信息面板,以及一个时间线洗涤器.会话重放yoursite.com买吧届会会期为3米 12s14 点击US 桌面颜色 1241WATCH点击、滚动、类型2MASKED隐藏敏感字段3DIAGNOSE校验错误报告
重放访客的所作所为:点击、滚动、打字(隐藏敏感字段),

找到正确的会话

从会话页面中查找有所报告问题的会话、高页计数而不转换,或者来自提交支持票的客户的会话。单击重播图标打开时间段视图。

重播显示

时间线

显示事件随时间推移的横向栏。 请点击任何时间点跳到那个时刻 。

页面导航

每个页面载荷都作为片段出现在时间线上。 您可以看到访问者所走的确切路径 。

点击

点击事件在时间线上显示为点,在页面重建中显示为亮点.

滚动

记录了卷轴的深度,这样你就能看到访客读得有多深。

形式互动

字段焦点和打字事件被记录. 密码和敏感字段的文本输入默认被遮掩.

隐私和蒙面

默认情况下会话重放会话口罩敏感窗体字段。 密码字段、 信用卡输入和带有数据标记的字段 -opsiq-mask从未被记录。 您可以在设置 > Tracking中配置额外的遮盖规则。 如果您的遵守政策需要它, 您可以完全禁用重放 。

诊断断档的出票

假设情况:
顾客说"我曾试图买到,但按钮却什么都没做".
怎么办:

在会话页面中查找它们的会话( 通过电子邮件搜索) 。 打开重播。 注意检查页面段。 请查看 : (S)1他们点击了正确的按钮吗? ()2做了一个 JavaScript 出错? (检查JS错误的页。 ) (3)页面是重新装入还是显示错误消息? ()4) 需要的字段是否为空?重播会显示到底发生了什么 。

重复播放会话需要多少存储 ?+

重放数据会随着流量的增加而增长。使用保留设置来自动清理旧的再播放数据。对于高流量网站,考虑缩短重放保留期(例如, 30 管理存储。

访客可以选择退出重播吗?+

如果设置中启用“ 尊重不跟踪” , 则没有记录带有 DNT 头的访客。 您也可以在跟踪设置中排除特定页面的重放 。

分析

事件日志

事件日志显示每个事件 OpsIQ 已录入: 页面浏览、 点击、 聊天开始、 票款创建、 销售和自定义事件。 使用它来调试集成、 校验 Webhook 发送, 并了解动作顺序 。

事件日志
事件日志带有颜色编码类型徽章的按时间顺序排列的事件日志:页面视图,聊天,销售,网钩和自定义.事件日志yoursite.compageview美国 /pricing12:04:01chat.start英国 ・ 部件打开12:04:09销售$49.00 · 秩序#104212:05:22网络浏览payment.succeeded12:05:23customdemo_booked12:06:101EVERYTHING每一次有记录的事件2DEBUG校验网络浏览交付3ORDER查看确切的顺序
所有事情的时间轴 OpsIQ 用于调试和审计的记录(页面视图、聊天、销售、网络呼声、自定义事件)。

内建活动(自动)

⚠️
这些是 events-log 姓名 - 何为OpsIQ用于分析、调试和审计的访客时间表记录。它们与 出站的网络浏览器 事件,您将订阅一个结束点。如果您正在构建一个 Webhook 接收器,请使用 Webhooks 区域中的列表,或调用 webhooks.events.list; 订阅本表的名称不会带来任何结果。

每行显示您的名字 发送 和犬科名称OpsIQ 存储 两者都记录下来:原始名称,以及它所绘制的犬科名称, 因此一份针对犬科分类学的报告 继续工作,无论用什么别名来追踪。

pageview page.viewed

履带式页面载荷。包括URL、标题、裁判和时间戳。 page_view 财务报告和已审计财务报表 view 被接受为同样的事情。

chat_open support.chat_opened

访问者打开聊天部件 。

chat_send support.chat_message_sent

访客发送聊天信息。 回复部分被存储为 support.chat_message_received.

ticket_open support.ticket_created

创建支持票. ticket_create 答复和关闭内容作为“文件”保存。 support.ticket_replied 财务报告和已审计财务报表 support.ticket_closed.

form_submit form.submitted

提交了跟踪表格。 submit 被接受为同一事物。

purchase commerce.purchase_completed

买完就走 purchase_success,以及销售的别名 order.completed, sale.completed, payment.completed 财务报告和已审计财务报表 invoice.paid,所有这些都从连接的平台接受。

离职 commerce.checkout_started

退出开始。 相关 : cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.

login_success identity.signed_in

访客会签到,失败就是... login_failed,存储为 identity.login_failed; 关机是 login_lockout_created.

注册 conversion.signup

访客完成报名,线索是 lead,存储为 conversion.lead.

js_error error.js

A 类JavaScript在跟踪页面中记录出错。

💡
您发送的不是这些别名之一的事件名称仍然被逐字记录着—— 没有任何东西被丢弃。它只是没有划线图,所以不会卷入基于分类学的报告。

自定义事件

您可以从您的网站或服务器发送自定义事件到 OpsIQ。自定义事件对于跟踪特定业务的动作是有用的:按下按钮、功能使用、视频播放、下载等。

JavaScript 浏览器的自定义事件 。
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
  plan: "pro",
  billing: "annual",
  value: 99
}]);
PHP − 从服务器记录联系活动
// Record a server-side activity for a contact (PHP)
$ch = curl_init("https://your-opsiq-domain.com/api/v1.php");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer opq_your_key",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "action" => "crm.activities.record",
        "site_key" => "site_abc123",
        "email" => "[email protected]",
        "event" => "subscription.upgraded",
        "value" => 50,
        "currency" => "USD",
    ]),
]);
$response = curl_exec($ch);
curl_close($ch);

过滤事件

事件类型

按特定事件名称过滤:页面视图,聊天.启动,票房. created等.

日期范围

显示特定时间段的事件 。

搜索

按关键词排列的搜索事件数据( E)URL,电子邮件,事件属性值).

活动持续了多久?+

事件遵循设置中设置的保存策略。 默认 : 90 高价值事件(购买、安全事件)可以配置,保留时间更长。

我能用A/B实验中的事件吗?+

是的。 在创建实验时, 您选择一个转换事件。 任何内置或自定义的事件都可以作为转换目标 。

分析

A/B实验

实验可以测试两个版本的页面或特征,并衡量其中哪个表现更好。OpsIQ 跟踪印象、转换和统计意义。

A/B实验
A/B实验两种变相卡比较换算率,在主变相上有取胜的徽章和意义.A/B实验yoursite.com备选案文A4.2%转换 · 1,020 视图备选案文B妇女6.8%转换 · 1,005 视图+62% 升起 · 96% 显著1科技两个变体头到头2MEASURE 音乐转换意义( R)3决定宣布胜负
跑出两个变体,表转换和统计意义,并宣布胜出.

实验如何运作

1
创建实验

给它取个名字,定义您的主要度量衡(转换事件),并设置变体(控制和测试).

2
运行它

OpsIQ 随机指定访问者到变体并跟踪其行为。在实验运行时不要改变实验。

3
读取结果

在收集到足够的数据后,检查置信度.95% 自信意味着你可以 95% 确定区别是真实的,不是偶然的机会。

实验状态

草案

已创建但尚未启动。 您仍然可以编辑变体和度量衡 。

运行

积极为变体分配访问者。 运行时不要编辑 。

已完成

达到统计意义或被手动停止。结果为最终结果 。

已存档

已经审查了结果,在现行清单中不再需要试验。

最佳做法

发射前定义你的度量

开始前先决定您在测量什么。 在看到结果后选择一个参数会带偏见 。

不包括国内交通

加入你的团队 IP 因此,工作人员访问不会导致任何结果。

跑得够长的了

试验结束后不要停止 100 每一个变体都需要几百或数千名访客才能取得可靠的结果。

一次测试一次变化

如果改变标题和按钮颜色,你将不知道是什么变化导致改进。

记录你的决定

实验结束后,请注意哪个变体获胜,以及你选择执行的原因.

需要多少访客才能做一个有效的实验?+

它取决于基线转换率和您想要检测的效果大小。 作为拇指规则: 至少 500 a/ 变体的访客数 20% 效果大小,要小一点,你需要几千个。

我能同时进行多项实验吗?+

是的,但请小心。如果两个实验影响同一个页,它们的结果可能会相互作用。同时在不同的页或特征上运行实验是比较安全的。

分析

JavaScript 错误

JavaScript 错误从您的网站访问者中收集客户端错误。 按钮中断, 失败 API 调用, 或缺少资源在此出现。 用它来查找和修复影响真实客户的bug 。

联合来文错误
JavaScript 错误列出被捕获的前端错误,并附有重度点,源文件,浏览器和出错计数.JavaScript 错误yoursite.com最近的错误类型错误: 无法读取未定义的 x退职。 Js :42 克罗姆语×214404 装入 /assets/app.css· 萨法里语×88未被抓住( 承诺中) 网络错误api.js: (中文(简体) ).17 · Firefox(火花)×51折旧警告:卸下事件· 边际×331CAPTURE客户端错误2IMPACT数取浏览器( B)3十六、结 论挤出真正的错误
真正的访客在这里撞击破解的代码表面(消息,源头,浏览器和多久一次),这样你就可以修复什么才是重要的.

每个错误都显示什么

错误消息

密码 JavaScript 错误文本( 如 “ TypeError: 无法读取未定义的属性 ” ) 。

页次 URL

错误发生于哪个页面 。

浏览器和设备

哪个浏览器和设备类型看到了错误。 有些错误是针对浏览器的 。

堆叠跟踪

错误发生的代码位置。 单击以扩展完整堆栈跟踪 。

第一次看见

当这个错误首次出现时 。

最后一次见到

最近发生此错误时 。

计数

记录了多少次这个错误.

受影响的会议

多少次不同的访客会遇到这种错误。

优先处理错误

还没全部 JavaScript 错误需要立即注意。 优先排序为 : (1关键页面出错(退出、注册、登录),(2(b) 会话计数过高的错误,(3)最近出现的出错(代码更改后可能出现回归),(4) 自己代码上的错误(不是第三方脚本).

正在修复一个破旧的取出按钮

假设情况:
JS Errors 页面显示“ TypeError: 无法读取未定义的属性( 正在读取提交) ” /checkout, 影响 45 本周的会议。
怎么办:

意思是说 45 真实客户无法完成结账。步骤 : ()1)打开同一浏览器/设备组合中的页面。 (2) 打开浏览器控制台并复制出错. (PDF).3)检查堆栈跟踪以找到确切的代码行. ()4修正错误, 部署, 并监视错误计数为 0 。

对 OpsIQ 捕获第三方脚本出错?+

对 OpsIQ 全部抓取( G) JavaScript 页面出错,包括分析脚本、聊天部件和广告脚本出错。URL 在堆栈中追踪,以聚焦于你自己的代码。

我如何排除已知的无害错误?+

您无法抑制特定的错误 。OpsIQ,但您可以逐行过滤列表 URL 或错误消息。纠正或忽略浏览器扩展中的错误(它们经常显示为来自未知来源的错误)。

销售

销售和改划

销售追踪将您的商店或收费平台连接到 OpsIQ,这样您就可以看到收入与访客行为。每次购买都是由游客旅行决定的,所以您知道哪些网页、活动和渠道驱动收入。

销售
销售销售屏幕:收入总额,包括全时控制、搜索和最近采购表(日期、客户、平台、金额、来源)。销售yoursite.com回归$42,180+18%永远▾搜索电子邮件, IP,请出示身份证...最近采购日期海关普拉特福尔姆一点资源军3[email protected]Shopify$49google军3[email protected]WooCommerce$129direct军2[email protected]Stripe$480广告1回归命令续订( R)2RECENT PURCHASES日期 客户 金额3ATTRIBUTED交通源头
真正的销售屏幕,收入最高,然后是最近的购买(日期、客户、平台、金额),每个都归因于其流量来源。

销售仪表板

今天的销售额

今天完成订单收入。 刷新您连接的平台上的每一个新订单事件 。

本周/本月/共计

本期收入合计,从这些总额中减去退款。

趋势图

显示选定日期范围内的每日收入的行图。请查看悬赏(促销、运动)和竖花(问题、季节性)。

顶端转换源

哪些交通来源导致购买量最多。“Direct”买家经常在你的网站上挂上记名。“Google”买主通过搜索发现了你。

最近采购

最新订货的客户电子邮件、金额、货币和购买的物品。

未确认的购买(客户旅行)

当追踪者看到访客在浏览器中到达购买确认,但还没有连接的平台报告销售,客户行程显示有一行购买(未确认)有琥珀徽章,从未算作收入. 平台确认销售时,确认的购买取代了该行.

和解

销售连接器不依赖于单一的网络浏览器。平台发送的每个支付信号都可以打开销售,而连接器合同 2.3 重新阅读平台自己在时间表上完成的销售清单(每个工作空间默认小时),所以一个网络浏览平台从未交付的销售不能失去销售. 运营商可以根据命令行的要求使用工具/sales_reconcile.php运行.

平台设置指南

Shopify

转到连接器 >Shopify。在您创建自定义应用程序 Shopify admin (Settings > Apps and series channel > development apps). 授予范围:读取命令,读取客户,读出产品。复制了 admine API 访问符号。 in OpsIQ,输入您的存储域名(例如, your-store.myshopify.com)和访问符。单击测试连接。如果成功,则启用Webhook同步实时命令通知。

WooCommerce

转到连接器 >WooCommerce。在您的 WordPress 管理员,去 WooCommerce> 设置 > 高级 > REST API。使用 Read/Write 权限创建密钥。复制消费密钥和消费密语。在 OpsIQ,输入您的站点 URL,消费密钥和消费秘密。单击测试连接。

BigCommerce

转到连接器 > BigCommerce。 在您的 Bigcommerce 管理员中, 转到高级设置 >API 账户。 创建 V2/ V3 API 账户,可读取命令、客户和产品的范围。复制访问令牌、客户身份证和 API 路径。输入它们 OpsIQ 并测试。

马根托2

转到连接器 > Magento。 在您的 Magen托 管理器中, 转到系统 > 集成器。 创建一个新集成符 API 资源访问 销售、客户和目录。激活集成并复制访问令牌。输入 OpsIQ 与您的 Magento 基数 URL.

PrestaShop

转到 Connectors > PrestaShop。 在您的 PrestaShOP 管理器中, 转到高级参数 > Webservice。 启用网络服务并创建新密钥。 允许访问订单、 客户和产品。 复制密钥并将其输入 OpsIQ 和你的店铺 URL.

OpenCart

转到连接器 > OpenCart。 生成 API 从您的 OpenCart 管理面板中获取证书。输入 API URL,用户名和密钥 OpsIQ。连接器使用 OpenCart 的 REST API 以获取订单和客户数据。

osCommerce

转到连接器 > osCommerce。 配置数据库访问或 API 连接器设置中记录的证书。 OSCommerce集成通常需要直接数据库访问或自定义 API 模块。

Stripe

转到连接器 >Stripe复制您的图像Stripe限制API密钥从Stripe发光板( 开发者)API键。关键字需要读取客户、充值、发票和订阅。输入其中OpsIQ。为实时事件配置 Webhook 终端。

自定义/ 其他平台

使用 REST 软件 API 或 Webhokes 从任何平台发送销售事件。发送订单。用客户邮件、金额、货币和项目发送完成的事件。请参见The Eventions API 用于有效载荷格式的一节。

了解你的销售漏斗

顶端转换源

显示哪些频道带来付费客户。 如果 Google 带来了 1000 访客和 50 销售,这是一个5% 转换率。如果电子邮件带来 200 访客和 30 销售,即 15% 电子邮件对每个访客更有效。

退款

重新筹资的订单会分开跟踪,它们会减少净收入总额。如果从特定来源得到的退款率很高,那么流量可能质量较低。

货币处理

OpsIQ。多种货币企业以每种货币表示收入。规范化报告使用所配置的汇率。

已成功的例子

100 访客,零销售

假设情况:
您的定价页面得到 100 每日访客,但零转换。
怎么办:

调查: (1)在定价页面访问者上使用会话重放。注意它们如何与定价表互动。 (2)检查顶页的定价页面回弹率和时间。 (3)从定价页面访问者那里检查聊天谈话。他们问什么问题?4)将定价页面与竞争对手进行比较。 (5)尝试使用不同的定价布局的A/B实验.

销售活动的责任

假设情况:
您用 UTM 标签发送了电子邮件。 您如何衡量其收入影响 ?
怎么办:

以源码进行销售和过滤。 搜索活动的 UTM 参数。 您可以看到 : (1有多少访客来自电子邮件。 (2有多少人转换成销售品。 (3与该运动有关的收入总额。 (4)相较于竞选前同期.

为什么销售显示0,即使我的店有订单?+

检查 : (1)平台连接器连接是否健康?前往连接器并检查状态.2是否启用了 Webhook 同步 ? 如果使用投票, cron 工作会运行吗 ? ()3)连接器是否有权 API 瞄准镜? Shopify,您需要读取命令。

怎么样 OpsIQ 将销售归咎给访客?+

当一个订单通过连接器进来, OpsIQ 匹配客户电子邮件给已知的访客。如果在购买前跟踪到该访客,则销售归因于他们的访客行程,包括交通来源、着陆页和会议历史。

我能手动加销吗?+

你可以通过REST发送销售活动 API。事件格式在“事件”中记录 API 节。

商业

建立、启动和运行本地 Storefront

存储前端是OpsIQ本地商店在Client Chat中提供产品、页面、外观、促销板、退货、客户账户和人工智能辅助销售,

在营销中开始→存储前端

1
选择工作空间

确认您正在配置的网站。 产品、 设置、 页面、 命令和分析器被隔离到工作区 。

2
启用电子商务和存储前端

常规设置→电子商务是母权威。 Storefront 出版、订单创建和支付仍然分开,以便安全地预览目录。

3
出版完整的产品

设定产品类型、价格、货币、库存、变体/选项、介质和满足。在发布前先预览产品和退出选择。

4
配置付款和完成

连接网关或添加银行转账、现金或柜台支付。物理货物需要交货区或收货;数字货物需要受保护的文件或代码。

5
运行启动准备状态

修复每个阻塞器并审查每一个警告,然后完成公共商店的沙盒订单.

启动者 与政策内容

新建和升级的商店可接收可编辑的启动文本 关于我们, 条款和条件, 隐私,以及 退款和退款 当这些字段为空时, 现有的商家副本永远不会被覆盖。

  • 替换每个 [Add …] 快速和 启动时间 发射前通知。
  • 使用真实的法律名称、联系途径、履行承诺、返回规则、数据惯例、保留期和所服务的市场。
  • 获取适合您所服务的产品和国家的建议。启动者是业务指导,而不是法律咨询。

设计、页数和晋升

主题和页面设计

选择一个被整理的色彩主题和组成,然后是调制打字,填充/分级,形状,宽度,运动,悬浮和光/暗行为. 预览桌面和手机后再保存.

有关、 联系人、 显示大小写/ 查看簿和账户

创建每个页面, 以重排区块。 每个区块都有溢价设计变体。 保留诸如统计、 团队、 奖项或引用等索赔区块, 直至内容属实 。

自定义页面

设定标题,弹道,英雄,SEO并命令块; 预览起草时, 然后公布。 保留了的存储路径, 如推车、 退货、 账户和政策等, 无法重新使用 。

促销弹出和侧面板

创建至少一个块的模式页。 选择溢价设计、 中/ 左/ 右/ 下方位置、 负载/ 延迟/ 退出/ 点击触发、 背景、 运动、 宽度、 优惠券和一次性访问行为。 测试关闭、 键盘和电话布局 。

菜单和页脚

链接到页面、产品、收藏、政策、账户/帮助/卡特尔行动、直播模式或安全的外部URLs。标题项目支持一个下放/mega-菜单级别。

客户聊天和社会秩序

启用客户聊天销售, 然后选择客户可以购买的地方。 助理搜索目录并询问服务器是否获得权威引用; 服务器而不是模型创建了签名的订单卡。 确认只通过网络上的卡或社交频道上经过核实的交互进行 。

WhatsApp使者们,Instagram, Telegram, LINE, 短消息和X 使用供应商验证的频道账户作为频道身份。电子邮件仍然被收集以获取收据。连接器命令保持其已签名的通用合同和商家授权总额; Storefront配置不会改变该合同。

存储智能分析

检查独特的访客、产品视图、车外加价、离职开始/班顿/完成、转换、确认订单、按货币、购置、设备、国家/城市、顶级产品、恢复和数据质量警告分列的收入。转换使用明确标记的公有系统事件;货币总额从未默默地合并。一个破折号意味着选定的范围无法回答转换问题 — — 而不是零。

常规OpsIQ API

使用无记名密钥 commerce.read; analytics.read 也可以提供分析快照。密钥绑定的工作空间是权威的。

已打入存储前端
{ "action": "commerce.storefront.get" }
{ "action": "commerce.storefront.catalog.get" }
{ "action": "commerce.pages.list", "kind": "modal", "status": "live" }
{ "action": "commerce.analytics.snapshot", "range_days": 30 }
{ "action": "commerce.readiness.get" }
{ "action": "commerce.products.list", "filters": { "active": true } }

存储前置获得返回的公共安全配置,URL,菜单和启动程序审查状态。 Storefront目录返回每个主题、页面设计、块类型、块组成和溢价促进 shell ,所以远程构建者从来不会硬编码选择。页面列表返回自定义页面和溢出模式。分析器返回没有客户身份的集合。准备返回可操作启动检查。OpenAPI和邮递员使用这些合同。

发射前最后一次通过

  1. 桌面和电话:家用,搜索,产品/变相,推车,出站验证,账号,跟踪,下载,关于,联系,政策,取景簿,页面,菜单和每一次活口宣传.
  2. 完成一沙盒付款并核实订单状况、收据、库存和完成情况。
  3. 在每一个启用的社会频道上设置一个客户端聊天命令和一个供应商-搜索箱命令。
  4. 证实这些事件出现在Story Intelligence的正确表面和货币下。
⚠️
启动策略文本使商店不空, 但不会让法律副本被审查。 启动准备状态会保持警告, 直到每个提示被替换 。
销售

领跑者是显示购买或支持意向的访客或顾客.OpsIQ基于行为自动检测线索:定价页面访问、回访、聊天互动、退出开始和高参与度。使用铅页面优先跟踪并反馈您CRM输油管。

线索屏幕:可搜索的表格 IP/电子邮件,位置,设备,源和时间站点列,以及上源和国家.yoursite.com搜索 IP 城市,国家...最高来源:google ^ 最高国家:美国IP / 邮件地点DEVICE 数据交换系统资源时间41.62.10.4伦敦移动google4米(4米) 宽度 12s[email protected]美国 · 纽约桌面direct7米长 02s[email protected]DE 柏林移动类: 类5米长 40s203.0.113.9CA- 多伦多桌面google3米(3米) 28s1DETECTED高意向访客2TOP牵头来源和国家3ENRICHEDIP、位置、设备、时间
真正的"铅"屏幕,高意向的访客作为可搜索的桌子(C.IP/电子邮件,位置,设备,来源,时间在现场),有上层来源和国家.

是什么使领先

定价页面访问量

浏览您的定价或计划页面的访客会积极考虑购买。

返回访问

多次回来的访客被订婚,但尚未皈依。

聊天互动

开始聊天的访客正在积极寻求帮助,无论是预先购买还是事后购买.

开始退房

访问者,可到达出票页面,但无法完成购买.

提交的表格

提交联系表,演示申请表,或报名表的访客.

高页参与

访问者如果浏览许多网页,会期很长,正在深入地研究。

牵头细节面板

单击任何线索查看其完整配置文件:

身份

姓名、电子邮件、公司,如果知道。匿名线索显示 IP 和地点。

会议

所有来自此线索的会话都有页面流,持续时间,以及源.

浏览的页面

他们访问的每一页, 命令的谨慎。

来源

他们怎么找到你的: 有机的,付薪的,社交的,转诊的,直接的。

领先分数

A 类0-100 根据行为强度,复健度,和页面意向等分.

CRM状态

是否将此线索添加到CRM作为联系人或交易。

销售提示

大赦国际就下一步应做什么提出建议(例如,“视价3乘以_考虑主动的外联”)。

高价值铅徽章

领先得分高于 80 获得一个“高价值”的徽章。 这些是您最热门的前景。 优先进行外联、主动聊天或CRM管道输入 。

已成功的例子

做热门的领头人

假设情况:
一个主机查看了您的定价页面3乘以内2几天后,开始聊天,询问企业计划,但还没有购买。
怎么办:

这是一个高诱导。1(c) 检查公司和角色信息的牵头细节。2(c) 审查聊天记录,说明具体需要和反对意见。3创建交易在CRM收集的资料。 (4为销售团队的一名成员分配后续任务。 (5)如果他们回到定价页面,主动聊天规则可以触发个性化消息.

将匿名线索转换为CRM联系人

假设情况:
你有过 50 匿名的线索,成绩很高,但没有电子邮件地址。
怎么办:

选项:(a)1创建一个主动的规则,提供折扣或资源下载,以换取高意向页面的电子邮件。 (2) 使用聊天部件在匿名访问者开始交谈时询问电子邮件. (3)在您的登录/签名页面中添加一个身份符号,这样返回的访客会自动识别.

铅分如何计算?+

分数考虑:访问的复议(最近=高),访问次数(更多=高"),浏览页数(定价/检查出值=高 "),会话时间(更长=高?"),聊天互动(约定=高);回访(多场次=高)。

我能定制铅分规则吗?+

是的,在CRM配置中,您可以添加根据特定关键词、事件、源或页面模式来提升分数的铅分规则。

CRM

CRM从这里开始

OpsIQA. 船舶的完整识别和识别系统CRM获取客户真实性,清理数据,分数线索,导师交易,预测收入,以及行为,将网站智能,支持,票房,产品和支付作为活图. Every AI acts are sourced, explainable, returnable and retrol-control).

大赦国际CRM
AI CRM 概述给副驾驶的一套信任电话,配有4张AI代理卡:管理者、探矿者、保留和分析员。大赦国际CRM工作空间信任拨号手动副驾驶自动驾驶人工智能自己能做多少DS 医务科主管迪多普,富足,验证数据特别提款权探矿者查找分数( R)新的业务RT 调制组保留点点的"发"驱动器更新AN 号分析员预测( R)解释数字1AI-FIRST4名专家2YOU DECIDE信任拨号自主3TRUSTED源代码可逆( R)
AI - 第一个CRM由四个专家代理 和一个信托电话 决定他们自己做多少。

CRM概览

AI CRM(指挥中心)

从这里开始

你的日常家庭屏幕:收入脉冲,AI发现的,它做了什么,批准排队,下一步动作,代理健康,以及ROI.

联系人

核心

人和公司在你们CRM。搜索、过滤、计分和管理配置文件。

管道

核心

视觉交易板 拖放阶段, 赢概率,和AI导师。

预测和报告

核心

董事会职等预测:承诺的,很可能是最好的案例,并有信心间隔和准确性跟踪。

生命周期

核心

每个客户都处于以下状况:活跃、有风险、扩张准备、续约到期或休整。

盖起我的CRM

配置

用简单的英语描述你的CRM设置. OpsIQ 生成可逆计划,并在批准时适用。

CRM 卫生

行动

自查页面: schema, 代理, 路由, AI动作, 以及活数据计数.

怎样? OpsIQ 保护你的安全

行动前问

AI 提案会进入批准队列。 您批准、 编辑或拒绝每个提案。 没有您的话, 任何事件都不会发生 。

永不覆盖

AI建议改变时,它显示了当前价值和拟议价值,以人为主的数据具有出处保护.

万事可逆,万事不可逆

每一个 AI 动作都会记录在日记上。 您可以点击一次来撤销任何更改 。

可解释

AI的每一个建议都显示了它的推理和它使用的数据来源。没有黑匣子。

新的吗 从这里开始

1
打开 AI CRM

在左侧导航中单击 AI CRM。 命令中心显示您的当前状态 。

2
检查CRM 健康

开放CRM健康系统,以验证计划、代理和路线。

3
导入联系人

如果连接符是活动( I)Shopify, WHMCS 等),自动导入联系人。否则,通过 CSV 或手动创建。

4
创建管道

去管道,创建你的第一个管道,有阶段(如:铅,合格,提议,谈判,元,失).

5
加上你的第一个交易

从联系人开始创造交易,设定金额和舞台,让交易教练指导您.

我用CRM吗?+

不 客户关系管理系统是可选的 OpsIQ 完美地作为没有CRM的跟踪+支持+AI平台运行。当您准备好管理销售和客户关系时启用它。

我们能...CRM没有连接器的工作?+

是的。 您可以手动创建联系人和交易。 连接器可以丰富CRM有平台数据(订单,订阅,入场券)但不需要.

信任层是什么?+

信任层是控制AI所能做的安全系统. compilway模式(默认):AI提议,人类批准. Autopilot mode (opt-in):AI在低风险,可逆操作上自动行动.

CRM

AI CRM 主屏幕

指挥中心是你们的日常简报,每天早上打开看看发生了什么,需要注意什么,下一步怎么办.

指挥中心
CRM 指挥中心带有预测/Win-rate/Pipeline切换功能的CRM主机,加权预告的KPI,以及每行有批准和免责的AI建议队列.CRM 指挥中心工作空间预测赢率管道? 这个Q74k (7 400美元) (单位:千美元)87%AI建议 批准队列创建交易 · ACM 24k与买方交谈核准开除移动阴云→提议检测到正答复核准开除日志任务 ^ 峰值跟踪无活动7天数核准开除1TOGGLE预测 胜率 输油管2AI PROPOSES交易、阶段、任务3YOU DECIDE核准或解雇
真正的指挥中心:在预测,温率和管道之间切换,并进行AI建议排队,批准或驳回交易,阶段动作和它所建议的任务.

指挥中心显示的

今天的数字

管道价值,交易赢/输,新线索,活交易,以及收入趋势,你目前状况的一览.

或 OpsIQ 已找到

AI发现的洞察力:交易停滞,风险账户,新机会,数据质量问题和市场信号.

或 OpsIQ 已经

AI(在自动驾驶中)或提议(在副驾驶中):阶段推进,分数更新,联系充实,任务创建.

需要核准

AI 提案的排行, 等待您的决定。 每个提案都显示拟议行动、 推理和证据。 批准、 编辑或拒绝 。

下一个动作

排行榜 10 今天最重要的事情: 追踪热交易,检查风险账户, 研究新的线索等等。

帮助者状态

AI代理商的健康:抓取,数据管理,交易情报,交易教练,SDR,保留. Green=运行,琥珀=需要关注,红色=出错.

结果

ROI跟踪:受AI影响的交易,节省时间,预测的准确性,以及和人工CRM工作的比较.

早间简报工作流程

1
读取今天的号码

检查管道的健康和收入趋势,你这个月是否在轨?

2
清除批准队列

批准安全行动,必要时编辑,拒绝坏建议。

3
检查什么 OpsIQ 已找到

阅读AI的见解,有没有交易有风险?是否有新的机会?

4
工作下一个移动列表

从头开始,AI按紧迫性和潜在影响来排序这些内容.

休息后追上来了

假设情况:
你离开一周了,你走了又怎么了?
怎么办:

打开指挥中心并检查 : (1) "什么情况 OpsIQ 显示您不在期间的所有 AI 动作 。 (2) "需要批准"显示的提案等待你的审查. (注:3) "什么情况 OpsIQ 查找的"突出显示紧急项目。 (4将仪表板日期范围设定为您缺席的期间,以查看趋势。

CRM

联系人、公司和交易

密码CRM将您的业务关系组织成四个目标:联系人(个人)、公司(组织)、交易(收益机会)和任务(后续行动)。

CRM对象
CRM对象连接到连线、 交易和任务对象的联系人记录。CRM对象工作空间联系人个人 电子邮件 电话公司accounts发牌收入机会任务后续行动1OBJECTS联系人、公司、交易2LINKED一个相连的图表3TASKS后续行动附后
四个核心对象(联系人,公司,交易和任务)连接到一个连接的客户图.

联系人

什么是联系人

一个人在你的CRM。他们可能是客户、前景、伙伴或领头人。联系人有电子邮件、姓名、公司、标签、生命周期舞台和热度分数。

查找联系人

使用搜索栏来查找名称、电子邮件、公司或标签。使用过滤器:生命周期阶段、领先分数、来源、国家、最后活动日期、指定所有者。

联系人简介

点击联系人查看他们的全部简介:个人信息、公司、交易、活动、门票、聊天、网站访问、领先分数和AI的见解。

热分

A 类0-100 从行为信号中计算得分:网站访问,电子邮件参与,聊天互动,购买历史,以及回放. high = hot.

公司

更多的票... ... .
联系公司链接

联系人通过电子邮件域名或人工指派与公司联系,一个公司可以有许多联系人.

发牌

交易是什么? 交易是...

收入机会。交易有产权、金额、管道、舞台、赢概率、结束日期、指定所有人以及关联的接触人/公司。

赢概率

百分比的胜出概率。 根据您的历史赢取数据, 手工设定或由 AI 计算。 驱动加权预测 。

处理卫生问题

绿色(健康)、琥珀(有风险)或红色(已安装),根据活动恢复、阶段持续和接触信号。

任务

任务是什么

指定给个人的后继行动。任务有标题、到期日期、优先级、类型(电话、电子邮件、会议、其他)和链接联系/交易。

AI 生成的任务

AI在发现需要注意的事情时自动创建任务:跟进被搁置的交易,回应有风险的账户,研究新的线索.

找到线索

假设情况:
你们想看看英国所有 最近没有联系的高层人士
怎么办:

转到联系人。 过滤方式为: 领先分数 > 80,国家=联合王国,最后一项活动 > 7以领先分数递降排序,这是你最热的被忽略的线索,优先拓展。

从联系人中创建交易

假设情况:
刚刚有个联系人 表示有兴趣在聊天时 考虑你的企业计划
怎么办:

打开联系人配置文件。 点击“ 创造交易 ” 。 请输入交易标题( 如“ Acme Corp - Enterprise Plan ”) 、 金额、 管道和舞台( 如 “ 合格” )。 设定关闭日期并指定给自己 。 协议教练将开始跟踪这个机会 。

CRM

管道(你的交易板)

管道是一个视觉板,交易从左到右通过各个阶段。拖放卡片进行预发交易。每张卡片显示交易金额、赢概率和健康状况。

管道
CRM输油管管道屏幕,包含Open-deals,Oper-value,Wight-rected-referred and Atprized-deerations stats,一个新交易按钮,AI批准队列,以及铅/合格/Won板.管道工作空间打开交易23打开值128克 双向加权预测74k (7 400美元) (单位:千美元)属性交易12+ 新交易批准队列2将审查领导伏特公司4克(每克)鲁姆6克(6克)定性尼姆布斯语Name30克(每分3万)峰顶9千美元轨道48k (48k) (4 000美元)1LIVE STATS开放值加权预测( M)2AI QUEUE核准拟议的交易3BOARD按阶段拖动交易
真正的管道屏幕:实时数据(开放值、加权预测),一个AI批准拟议交易的队列,以及拖放板。

使用管道板

1
查看您的交易

管道显示所有活动交易为以列(相)排列的卡片。每个列头显示该相阶段交易的总价值 。

2
拖曳到前进

将牌拖到下一个阶段。 赢概率和数值会立即更新。 如果移动失败( 验证错误) , 牌会回到原来的位置 。

3
检查牌牌

绿色徽章=健康(最近的活动,正轨上). 琥珀=有风险(下降,需要注意). Red=停滞(没有活动太久).

4
点击详情

点击一张牌打开交易细节面板, 包括联系人、活动、 交易教练简报和快速行动。

批准队列

AI提案出现在管道页上方的审批排队中。每个提案都显示AI想要做什么、为什么和证据。您可以:

核准

接受当前提议。此动作贯穿信任层,并记录在日记中。

编辑

在批准前修改建议,例如,修改建议的阶段或调整金额。

拒绝

拒绝提案,AI从拒绝中吸取教训,将来提出更好的建议.

胜出概率解释

胜利概率可以通过人工设定或由AI计算. 当AI计算时,它会使用一个在你自己的已关闭交易(完成并丢失)上训练过的模型. 如果你没有足够的历史数据,AI会使用相位默认概率. 概率驱动加权预测: a $10,000 交易时间: 30% 概率贡献 $3,000 以"可能"的预测。

向元哥提个价

假设情况:
一个客户签了合同并付款。
怎么办:

将交易卡拖入"Won"舞台. OpsIQ 将:1将交易标为闭关元. ()2更新预报。 (3)在时间线上添加"Won"活动. ("WON"活动).4)如果配置,则触发一个webhook事件(crm.deal.won)。 (5)更新接触生命周期阶段为"Customer".

偷看被卡住的交易

假设情况:
你想找到一个 已经处于同一阶段太久的交易。
怎么办:

寻找管道板上的红色(已安装)徽章。 这些交易没有超过配置的腐烂阈值( 在 CRM 配置 > 管道中设置) 的活动。 点击每个被停滞的交易, 查看 Done Coach 重新启动的建议 。

我能有多条管线吗?+

对,去CRM配置 > 管道来创建额外的管道。 常见的使用案例:用于新业务与更新或不同产品/服务的单独管道。

当我把交易拖到"迷失"时会怎样?+

交易被标记为关闭- 丢失。 您将被要求说明损失原因。 协议从活动板中删除, 但可以在关闭的交易过滤器中找到。 联系人仍然在 CRM 中 。

CRM

做教练

交易教练分析每一项交易,并给你一个简短的健康状况、风险信号、关键人物、资格清单、会议准备以及下一步行动的建议。所有事情都是源头的。教练会显示每个索赔来自哪张票、聊天或活动。

发牌教练
发牌教练一张交易卡,上面列出了AI-被察觉的风险信号和证据来源,此外还有AI推荐和邮件草稿按钮.发牌教练工作空间Acme公司 · $24,000阶段:提案 60% 赢危险信号无答复 10 天数冠军安静下来了聊天时提到的竞争者资料来源:票 #482 · 聊天6/12 电子邮件线索大赦国际建议:重新参与经济附有ROI复写书的买方备注a 7- 日近计划。起草电子邮件1SIGNALS为什么交易会失败2SOURCED每件索赔都援引证据3行动下一击
教练会标出交易为何会失败(每个信号都引用其来源),

教练跟你说的

健康解释

为何交易是健康的,处于危险之中,或者停滞。 具体信号:舞台上的天数、最后接触日期、活动频率、竞争对手提及、反对模式。

信号

分类为: 提出的反对, 竞争者提及, 定价讨论, 支持风险指标, 更新/ 扩展信号。 每个信号链接到其源头( 聊天记录、 票单、 电子邮件、 活动) 。

冠军和阻塞器地图

帮助交易(champion)和抵制(blocker)的是谁。基于互动分析和联系角色。

资格清单

MEDDIC或BANT清单(可配置),显示符合哪些资格标准,以及缺少哪些资格。

会议筹备

在预定的会议之前,教练会制作一个简短的:议程,要涵盖的关键点,要问的问题,要处理的风险,以及要准备的材料.

答复和呼叫计划

根据当前交易状态和最近的互动,建议下一封信件或调用脚本 。

证据时限

每一份声明,教练都会提供与来源的链接:票号、聊天记录、活动日期或网站访问。

如何使用教练

1
读一下简报

打开任何交易并滚动到 Deal Coach 区域。 读取健康状态和关键信号 。

2
接近资格差距

请检查access-date=中的日期值 (帮助) 资格清单. "经济买家"缺失的,计划确定预算持有人并与其接触.

3
提出建议

教练建议具体的下一步行动。 点击可以创建任务、 起草电子邮件或安排会议, 全部通过批准队列进行 。

准备开个大会

假设情况:
你明天有个有前途的会议 $50,000 说定了
怎么办:

打开交易并阅读会议筹备部分。1(b) 以最近互动为基础的关键谈话要点。2他们上周在聊天时提出的反对意见。3(a) 支持票中提到的竞争者。4问其时间问题。 (5积极处理风险因素:利用这份简报编写一份重点突出、循证的议程。

理解交易为何有风险

假设情况:
管道显示一个红色的徽章 在你认为进展顺利的交易。
怎么办:

点击协议并读取协议教练的健康解释。它可能会说:“该协议已经进入了提议阶段, 22 天数(阈值 : 14。上次联系是 11 几天前,主要联系人开通了一张关于数据迁移问题的支持票5几天前 (表 #T -)892)建议:解决移民问题并安排后续电话。“现在你知道要解决什么问题。

CRM

预测和报告

局级预测,带有可辨别范围,交易级别变化解释,准确跟踪,以便能证明和解释你的数字.

预测
预测季度预测数字,包括Committee、Best-case和管道波段以及准确性说明。预测工作空间最终 , 这个QUATER312克 6个87% 目标提交最佳案例管道AI 按交易的健康和历史加权 ——跟踪准确性随时间推移1类别承诺进行管道2AI-WEIGHTED以健康为主3PROVABLE跟踪准确性
以健康为重,准确追踪,这样你就能捍卫它

预测类别

承诺

处理 80% 或更高的赢取概率。这些是您最可能的赢取。这应该是您的最小预期收入。

AI加权

所有公开交易都以AI计算出胜负概率加权。 这是对您要关闭的最为现实的预测 。

最佳案例

所有公开交易都以全额价值进行。 如果一切都顺利( 很少如此) , 这是最大的收入。

信任间隔

一个 80% 显示现实范围的概率带。例如:“您很可能在 $45,000 财务报告和已审计财务报表 $72,000 这个季度。"

改变的是什么?

预测包括周后更改属性。当您的预测通过时 $15,000,报告解释了究竟哪些交易导致了这一变化:"最终A滑入了下个季度(即20世纪后期).$8,000),交易 B 丢失($5,000),交易C减值($2,000)."

准确性跟踪

预测

平均绝对百分比错误: 您的预测距历史有多远。 下比 更好 。 MAPE 15% 表示您的预测通常在 15% 实际结果。

胜利概率校正

Brier 得分衡量赢取概率如何与实际结果相匹配。如果交易于 70% 实际胜出概率 70% 当时,校正是好的。

每周快照

OpsIQ 每周抓取一个预测的快照(通过 cron)。随着时间的推移,你可以看到预测的准确性是如何提高的。

卷起和警告

每阶段转换

有多少交易从每个阶段转到下一个阶段。如果 80% 由合格者转呈提案,但仅限 20% 从提案到谈判 你的提案可能需要工作

人均源赢率

哪个主要来源能产生最大的赢家 投资更多高赢家

共有人业绩

每个销售团队成员的表现:交易胜出,管道价值,平均交易规模,赢率.

警告

沙布(不现实的低概率),过度紧张(不真实的高),以及承诺有风险(高概率交易显示被停滞信号).

了解预测的下降

假设情况:
你的季度预测从 $180,000 改为: $155,000 从上周开始
怎么办:

打开预测页并检查"有什么变化",报告显示:"Acme Corp deal (Acome Corp agree ()).$15,000 被选定为竞争对手的Lost,Beta Inc 交易($8,000 结束日期推至下季度。$3,000)加上了本周",净变动是.$20,000 + $3,000 = -$17,000,解释从180K跌至163K(其余8K则由其他交易的概率调整来解释).

CRM

寻找新业务

探矿代理帮助您找到并研究潜在的客户。描述您的理想客户,添加目标公司,让AI研究,得分,并起草第一触摸拓展。

探矿
探矿AI发现的展望公司列表,各有相通的注释,分数和草稿外传按钮.探矿工作空间特别提款权代理人发现的前景北风有限公司萨斯 50 · 雇用支助88外联草案钴 Mfg制造业 . 200 工作人员74外联草案零售业电子商务 30 工作人员69外联草案维加保健保健 80 工作人员63外联草案1FINDAI 来源目标账户2索雷号符合目的排序( M)3DRAFT给您写了首个触摸
特别提款权代理机构找到目标公司,按适当标准评分,并起草第一触摸外联文件供您审查。

一次性设置

1
描述你的理想顾客

访问 CRM 配置 > 探矿。 描述您的理想客户简介( ICP): 目标行业、 公司规模、 职称、 地域重点、 产品匹配条件和最小适配分 。 例如 : “ B2B SaaS 公司 50-500 以销售品的VP或增长之长为主要联系人。

2
增加目标公司

输入您想要研究的公司域或名称。您也可以让AI根据您的国际比较方案推荐公司。

3
二. 审查研究成果

AI以现有数据丰富了每个公司:规模,工业,技术堆栈,最新消息,以及配有解释的分数.

4
核准外联

对于好身材的公司,AI起草个性化的一触即发信息,在排队中审查批准.

适切分数

每个前景都得到一个0-100 基于五个因素的适配分:

比较方案适合

公司如何与你的理想客户状况(行业,规模,地点)相匹配.

紧急信号

是否有证据表明他们现在需要你的产品?

预算代理

公司规模、供资阶段和收入指标表明预算的可用性。

产品匹配

你的产品与他们的企业有多相关?

支持合适

您是否能够有效服务于此客户端( 时区, 语言, 复杂度) 。

研究目标公司

假设情况:
您想要评估是否 acme.com 值得一试
怎么办:

添加 acme.com AI 返回:适中分数 78/100 原因:B2B SaaS, 120 员工,美国雇员,最近雇用了一个VP of Sales(紧急信号),使用竞争者X(产品匹配)。购买信号:上个月两次访问定价页面(来自网站跟踪)。最佳联系方式是: [email protected] 起草的开页人参考了他们最近的招聘和定价页面访问。

CRM

自动后续序列

序列自动化多步后续: 组合电子邮件,等取,任务取用,调用,以及网络hook步骤,在您批准初始发送后自动运行.

顺序
后续序列水平序列流:电子邮件,等三天后,电子邮件,再做一个任务,并进行回覆检测.后续序列工作空间你批准第一个寄出去之后→电子邮件介绍单单3天数电子邮件后续行动任务打电话步骤可以是电子邮件、等取、任务或网络hook。自动回复会自动停止序列。1AUTOMATE多步骤后续行动2STEPS电子邮件 等 任务 等 Webhook3YOU APPROVE第一次发送是门
您首先批准的自动多步骤后续( 电子邮件、 等 等, 电子邮件, 任务) , 并自动停止回复 。

序列如何运作

1
创建序列

定义步骤:电子邮件, 等等3几天,电子邮件,等等5天数、任务(如果无回复,则呼叫)、电子邮件。每个电子邮件步骤都有您可以自定义的模板。

2
输入联系人

将联系人添加到序列中,AI也可以建议从探矿结果中录取。

3
自动执行

步骤在计划时间内自动运行。如果联系人回复,序列会自动暂停。

4
轨迹结果

查看打开的费率、 回复率、 换算率和每步不订阅的费率。 使用此选项优化您的序列 。

答复谅解

联系人答复时,大赦国际将答复归为一类:

正数

有兴趣,想谈谈,顺序暂停,任务为后续设定.

反对

存在关切, 但不拒绝。 顺序暂停, 任务会包含反对的细节 。

取消订阅

想要停止接收消息,联系方式会永久被压制.

现在不行

有兴趣但时间不对。 序列暂停, 创建 snooze 任务 。

错人

联系方式不对 序列停止 联络标志显示需要审查

支助

支持问题,不是销售回应。序列暂停,票制创建 。

反垃圾邮件保护

退出处理

取消订阅请求立即被满足,联系人从所有未来的序列中被压制.

每日发送封顶

工作空间级的每日限制( 默认 ): 1,000 电子邮件)。防止质量发送触发垃圾邮件过滤器。

人均接触限值

最大数1每天每个联系人都会收到信息, 防止个人压力大。

超额处理

超过日限的步数被推迟到第二天,它们从不被放弃或跳过。

如果联系人打开支持票 出现序列会怎样?+

序列会自动暂停。 支持比外联优先。 序列可以在支持问题解决后手动恢复 。

我可以A/B测试序列步骤吗?+

不直接在序列内,但可以创建两个序列,并有不同的消息,比较其结果.

CRM

增长工具

下方一页CRM拥有增长引擎的:经常性收入(MRR/ARR),产品目录,铅捕获表,订出链接和铅路由。这里的所有文件都直接写入CRM,因此,提交表格或预定的呼叫是和历史的联系,而不是电子表格中的一行。

页面上的生活

经常性收入

收入

从您真正的账单分类账中预测的MRR和ARR。订阅按每个平台的付款进行分组,从付款缺口中推断出计费周期,当逾期付款时订阅失效1.5。客户链接到CRM当分类账携带他们的电子邮件时,自动联系人。

产品目录

目录

真实的源头,你所销售的东西。引用从目录中提取名称和列表价格,并接受引用后逐个产品滚动成收入。产品存档,它们永远不会删除。

铅捕获表

抓取( E)

每个表单都会为您自己的网站获得一个主机页面并加上一个被嵌入的iframe代码。提交文件会成为联系人,所有者会收到通知,您的路由规则会指定线索。

预订链接

时间安排

共享链接, 让前景选择一个空闲的档位。 时间档会尊重组织者的工作时间、 时区和现有会议。 预订会场、 电子邮件给前景确认并通知组织者 。

铅通路

路线

领土规则先是运行,然后是实地规则(匹配一个领域,如国家或源代码),然后通过代表池进行圆旋。它同样会引导CONTACTS和DELS,不管交易状况如何:赢的交易仍然需要拥有者来进行委托归属、账户责任和后续,在拥有者或团队的能见度模式下,没有拥有的记录除了管理者之外,任何人都看不见。通过自动化(连接器销售、聊天、导入)创建的记录没有交互创建者,因此它们按照相同的创建规则而不是无所有者规则进行。任何已经拥有所有者的记录都永远不会被重新分配。

创建您的第一个窗体

1
打开增长工具

转到CRM,然后是Growth Tools, 然后是铅捕捉表单部分。

2
取名取出田园

输入一个名称和一个逗号分隔的字段列表,例如名称、电子邮件、电话、消息。总是需要电子邮件。

3
共享或嵌入

复制主机链接, 以在任何地方共享, 或者复制嵌入码并粘贴到您网站的任何一页 。

4
注意线索到达

每一份呈文均为CRM与表格联系。提交活动、所有者通知和自动路由。

💡
公共抓取页面使用您的工作空间自己的地址. Cloud 工作空间使用其指定的子域(company).opsiq),所以链接总是解决正确的数据.

内设保护

宝斯看成功,你什么也看不见

隐藏的蜜壶场静悄悄地丢弃了机器人提交.

费率限制

每小时提交10份划界案 IP 在表格和预订的地址之间。

同意不说错话

提交表格并不表示市场营销同意。只有明确的同意框才允许。

不许双人预订

预订时,一个档次将对照新的可用性检查重新验证。

经常性收入数据来自何处?+

使用您销售页面所用的同一商业分类账, 并使用开出帐单的连接器。 在连接新平台后使用开出的开出账单的再同步。

我能不用网站就用表格吗?+

是的,每张表格在自己的地址上都有主机页面独立工作,不管有没有 JavaScript.

CRM

通讯枢纽( SMS and WhatsApp)

一个连接器, 最多20个网关。 连接您实际使用的短消息和WhatsApp提供者, 标记一个默认, 并在给联系人发短信时选择其中之一 。 请检查是否同意 。CRM在联系任何网关之前。

准备好了

1
启用连接器

在连接器页面上,打开Message中枢(SMS和WhatsApp)并启用.

2
添加提供者

在同一抽屉中,或在CRM Growth Tools中,从滴出(Twilio、Vonage、Termii、Meta WhatsApp Cloud、Infobip等)中选择一个网关,粘贴其上。API 证书和连接。您可以添加多个,包括两次使用不同账户的同一网关。

3
网络钩线

每个提供者条目都显示自己的网页hook URL 使用复制按钮。将其粘贴到网关的发送报告和输入信息设置中,以获取发送状态和回复返回到 OpsIQ.

4
从联系人发送

打开联系人并使用短消息或WhatsApp按钮。如果一个以上提供者支持频道,则选择者允许您选择;否则将使用默认值。

同意是第一个

仅给予同意

未知的同意不是同意。 除非明确给予短信同意, 发送者拒绝。 whatsApp 包含同样的同意 。

不要接触总是赢

无论设置什么,一个不接触的旗帜会阻碍每个频道.

被罚

压制名单上的联系人从未被传出过信息。

拒绝说明理由

一个被封杀的发送会告诉你原因,这样你就可以修正数据而不是猜测.

对于开发者: Webhook 合同

URL 形状

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. 每入信使在提供商连接时会被刻出,在编辑时不会旋转.

已理解的格式

Twilio form posts (MessageStatus/MessageSid for delivery, Body/From for inbound), Meta WhatsApp Cloud JSON (statuses and messages, including the hub.challenge subscription handshake), and a generic JSON shape: {"type":"delivery","message_id":"...","status":"delivered"} or {"type":"inbound","from":"+234...","body":"..."}.

效果

发送报告会将传送或弹出的信息标注在发送者身份的外联分类账行上。输入信息与工作空间内的联络人通过电话号码匹配,并显示为收到的信息活动,并在对话中注明答复。

失败模式

错误或缺少的符号答案 403。未知的有效载荷被计算和忽略,永远不会致命,因此一个被错配置的网关无法突破端点。

支持哪些网关?+

特维利欧,冯纳吉,普利沃,Message Bird, Sinch, Infobip, Telnyx, ClickSend, Termii, 非洲说话, BulkSMS, Textlocal, Meta WhatsApp Cloud, 360dialog, SMSAPI, Gupshup, Kaleyra, D7 Networks, Hubtel, 以及一个定制的 HTTPS webhook 用于其他任何内容.

证件安全吗?+

身份证书在连接器设置中被加密,并且从未回放到浏览器。编辑一个带有空白密钥的条目时保留了存储的密码。

AI能发送消息吗?+

是的, 通过需要确认和运行同一同意门的注册动作。 AI也可以列出连接的提供者, 以解释可用的内容 。

CRM

保持和增加客户

生命周期管理有助于保护现有的收入。每个账户都获得一个风险分数、健康分数,扩展分数和推荐的成功游戏本。

生命周期
生命周期板客户-生命周期板(登机、活动、风险、更新),每张账户卡上都有健康栏。生命周期工作空间关于讨论爱克米卫生 40实际环球x卫生 88信息技术卫生 76AT-RIK 风险苏连特卫生 28法语乌姆布拉12d续约扩建+8克1STAGES上岗续约2SCORED卫生和扩大3PLAYBOOK建议的下一步行动
顾客通过上岗、活动、危险和再生,每人在健康方面得分,并用一本游戏本进行扩展。

生命周期板

阶段映射

显示每个账户所在位置的视觉板:铅、前景、机会、客户、扩展、更新、风险、Churned。

风险账户

标出高风险的账户。 每个账户都显示顶级驱动程序( 支持悬浮、 不活动、 支付失败) 和推荐的保存播放 。

扩大机会

显示准备购买更多商品的账户:高使用率、功能要求、计划查询。

应续期

账号有即将续期的日期。按风险水平和收入价值排序。

怎样? OpsIQ 检测起灰烬风险

丘恩风险通过多个信号并联计算:

CRM信号

处理健康、无活动、最近的损失、接触减少等问题。

支持信号

公开票数,票量猛增,情绪负面,升级.

产品参与

登录频率、特性使用、页面访问、API 打电话

计费信号

付款失败,发票逾期,要求降级,取消页面访问.

游戏本

保存播放

对于风险账户:主动接触、解决关切、提供支持、必要时升级。

更新游戏

对于即将续约:确认满意程度,审查使用情况,现值,酌情提供奖励。

扩展播放

对于即时到发的账户:当前升级选项,分享成功故事,演示ROI.

收养游戏

对于未充分利用的账户:提供培训、分享最佳做法、使用户能够使用它们没有使用的特性。

发生前就先看清楚

假设情况:
通常每天登录的客户没有登录2几周后,他们打开了3这个月的票
怎么办:

生命周期板将这个账户标为"冒险",有驱动程序:无活性(14 自上次登录以来的天数)和支持高峰(3x 推荐游戏:主动的外联呼吁以了解正在发生的事情。是否有产品问题? 他们评价竞争者吗?早期干预可以拯救账户。

CRM

保持数据清洁

数据管理代理自动查找并修正了数据质量问题:重复,缺失字段,不一致,和陈旧的记录.

数据管理员
数据管理员数据质量问题(重复、缺失、 Stale、格式)清单,每问题都有一个一击固定动作。数据管理员工作空间数据问题, 管理代理找到复制[email protected] 财务报告和已审计财务报表 [email protected]合并失踪12 联系人没有公司富人( Erich) 语句斯图尔38 交易未受影响 90+ 天数审查格式化电话号码输入4格式全部修补1CATCHES疏通、漏洞和僵化2EXPLAINS为什么它标出每个3FIXES等你同意了,我马上去
店长给你留了下来CRM清理、查找重复、空白、陈旧记录和不良格式,确定批准。

捕到的鱼

复制联系人

同一人的多份记录(例如, [email protected] 财务报告和已审计财务报表 [email protected] 管理者建议合并它们。

缺少数据

联系人没有电子邮件,交易没有金额,公司没有域。建议从可用来源填充 。

已取消链接的记录

交易没有关联的联络人, 没有公司的联系人。 根据电子邮件域名和上下文提出连接 。

不一致

"Won"舞台上与 20% 概率,一个标记为"海关"的无交易的接触,一个不匹配行业的公司.

错误的阶段

交易处于同一阶段太久,或接触其生命周期阶段与活动不相匹配。

如何使用

1
打开服务员列表

前往CRM并找到数据管理器部分(或从CRm Health打开).

2
核准安全补偿

绿色物品是安全的:明显的重复,明显缺失的数据。批量批准这些物品。

3
其余的再审

琥珀项目需要你的判断:可能重复,但有细微差异,拟议阶段变化,公司连接。请检查每个版本。

清理重复联系人

假设情况:
管理者发现"约翰·史密斯(英语:John Smith (film))"[email protected])"和"J. Smith(英语:[email protected])":同名电子邮件,不同显示名.
怎么办:

管理者提议合并: 保留记录与更多活动, 合并其他记录的交易和活动。 审查建议, 必要时调整幸存的显示名称, 并批准。 两个记录的历史都保存在合并的联络人中 。

CRM

盖起我的CRM

构建我的CRM允许您用简单的英语描述您的CRME设置 。OpsIQ 生成一个经验证、可逆的计划,并在批准时应用。没有编码,也没有手动配置点击。

盖起我的CRM
盖起我的CRM左侧的自然语言描述,生成一个生成的由相,相和相段组成的右侧分相,字段和相相段的CRM计划.盖起我的CRM工作空间说说你的生意我们是网络设计局每月销售预留金和一次性项目改为小型项目企业。盖起我的CRM生成的计划阶段:铅→留存器发件类型: 保留者, 项目字段:月值分部: SMB, 机构序列:入职批准应用( A)1DESCRIBE普通英语2AI PLANS阶段、领域、段3APPROVE应用 ^ 无编码
用简单的英语描述你的生意;OpsIQ起草全文CRM(阶段、领域、部分)并在批准时适用。

如何运作

1
描述你想怎样

请输入您CRM设置的平版英语描述 。 例如 : “ 创建具有阶段的更新管道 : 即将到来、 接触、 谈判、 重用、 丢失。 当他们两次查看定价时, 得分会更高 ” 。

2
审查计划

OpsIQ 显示其创建内容的预览:管道、阶段、阶段概率、评分规则、生命周期规则。审查每个项目。

3
应用

单击 应用执行此计划。 每一次更改都会记录为捆绑, 您可以在一次点击中撤销 。

4
需要的话就退后

如果有问题, 请单击 Undo 将整个捆绑还原。 您的 CRM 返回到以前的状态 。

我们能造的

管道和相位

创建带有自定义相,默认概率,并有腐烂阈值的命名管线.

评分规则

基于行为而提高的领先分:"在查看定价时得分较高","在访问职业页面时得取分较低".

生命周期规则

自动推进生命周期阶段:“移动到 SQL 当他们要求演示,"当交易获胜时,移动到客户。"

自定义字段

添加字段到联系人、交易或公司:文本、数字、日期、选择、复选框、URL 电子邮件

资格清单

定义MEDDIC或BANT对照教练成绩的成绩表。

建立更新管道

假设情况:
你管理SaaS的订阅 需要一条管道来续约
怎么办:

类型:"创建更新管. 90 日出数( E)10%), 60 日出数( E)25%),联系(40%),谈判 60%),续订(100%),Chorned (英语:0%。设定腐烂阈值为 14 日子,"。" (笑声) OpsIQ 生成计划,您审查,然后单击应用。管道立即出现在您的管道页面上。

如果我描述一些不可能的事呢?+

构建者只生成它知道如何验证的动作。 如果您要求在其能力之外的东西( 例如“ 融入我的习惯 ” ) API 它将拒绝这一请求,并解释它能够做些什么。

我能取消改变吗?+

是的,每个建筑我CRM动作被捕获为可逆的捆绑。CRM健康 > 改变历史以看到所有捆绑并取消其中的任何捆绑。

CRM

设置你的CRM你的方式,你是谁?

适合选择点击而不是打字的团队的手动CRM配置。所有构建 My CRM 的设置也可以作为传统形式字段提供 。

管道和相位

创建、重命名、重排和删除管道和相位。 设定默认的每个相位胜出概率 。 设置腐烂阈值( 在交易被标记为“ 已安装” 之前没有活动的日子 ) 。

自定义字段

添加交易字段、 联系人或公司。 字段类型: 文本、 数字、 日期、 选择( 带有预定义选项的下拉) 、 复选框、URL,电子邮件。自定义字段出现在对象配置和过滤器上。

资格清单

定义交易导师用来评价交易的检查表。 选择 MEDDIC、 BANT 或一套自定义的标准。 每个项目都可以被标记为需要或可选 。

生命周期阶段规则

定义自动相位过渡:当联系人满足条件(视图定价,提交表格,进行购买)时,他们的生命周期相位自动推进.

领跑分数规则

基于行为促进或降低领先分数的例子 : "Viewed price page = +15 分数“已下载白纸=+10 积分","视觉生涯页面=-5分数。可以设定最小计数( 例如, “ 必须至少查看定价 ” 2),"("时代").

已保存视图

创建联系人、交易或公司名的过滤器+类型组合。与您的团队共享视图。 设置每个对象类型的默认视图 。

添加领先评分规则

假设情况:
您想要查看您定价页面两次或更多次的接触者获得更高的分数 。
怎么办:

转到 CRM 配置 > 铅分解规则。 点击 添加规则。 set: event = "pageview", URL 包含 = "/pricing",最低计数=2,分数助推=+20。保存。下一次计分员运行时,匹配此规则的联系人将获得+20 以他们的领先分数。

CRM

CRM 健康检查

CRM Health是一个自我诊断的页面,可以验证你的CRM设置正确并顺利运行.

健康检查
CRM 健康检查一个健康得分圈 92 除了通过检查和警告检查的核对表之外CRM 健康检查工作空间92卫生管道级已配置连接器链接导入( I)启用了 AI 代理!没有活动后续序列!12 缺少联系人1审计校正你的设置2FLAGS少了什么东西3索雷号1个总数
一页CRM审计:总体健康得分加上一份清单,说明什么是正确设立的,什么仍然是需要注意的。

检查什么?

司马

数据库表格存在,并有正确的列。如果移出失败, CRM Health 将标出它 。

AI 代理商

所有CRM代理(Capture, Data Steward, Disease Intelligence等)都注册注册并健康. Green = 运行,琥珀 =需要注意,红色 = 有错误.

路线

CRM API路由和AJAX端点是注册和可调用的。

大赦国际的行动

密码CRM动作目录在动作登记簿中注册。如果缺少动作,CRM以再入会而自取自愈.

实时数据计数

联系人、公司、交易、任务、活动和事件总数,可用于核查进口和不断获取数据。

设置检查后

第一次过后CRM设置, 打开CRM健康并核实所有检查都是绿色的。如果有琥珀或红色,请点击项目进行诊断解释,并提出修正建议。

我该检查多久一次CRM健康吗?+

初始设置后,重大更新后,以及每当CRM行为似乎是错误的时,检查. CRM Health 仅通过打开页面就能自愈许多问题(如缺少行动注册).

CRM

CRM开发者的连接

CRM揭露了一个完全公开的REST API 并出站的网路呼号,所以它适合任何堆栈,而无需手动输出。

API 结束点

认证

API 密钥( 授权: Bearer opq_...) 有范围 crm. read 或 crmm. write。 POST 以 /api/v1.php 与动作和站点键。

联系人

crm. contacts. list (search + filter),crm: conters. detail (by ID), crmm. concessers. upsert (创建或更新),克姆: concers. save.

发牌

crm. disales. list. crmm. diales. detail. create. crime. credate. compate. date. advance (所有通过信任层).

活 动

crm. activities. list(联系人/交易的时间线),crm活性. record (log a new activity).

活动

crm. events. list(自_id survey),crm活性. catalog(列表可用事件类型).

创建交易通过 API
POST /api/v1.php
Authorization: Bearer opq_live_xxx
Content-Type: application/json

{
  "action": "crm.deals.create",
  "site_key": "<workspace>",
  "title": "Acme renewal",
  "amount": 12000,
  "pipeline_id": 1,
  "stage_id": 2
}

网络浏览事件

opsiq.contact.upsert

当创建或更新联系人时, 已解除。 这是要订阅的联系人事件; 没有单独创建的事件 。

contact.lifecycle_changed

当接触者移动到不同的生命周期阶段时被解除.

contact.status_changed

当联系人状态改变时, 已开火 。

contact.conversion

转换记录到联系人时被解除。

contact.tag_added

添加标签到联系人时被解除 。

contact.erased

被删除的联络人, 以请求隐私时解除。

crm.deal.created

当交易被创造的时候,他们就被解除了。

crm.deal.stage_changed

当交易进入不同阶段时,就被解除了职务。

crm.deal.won

交易结束时就被炒了

crm.deal.lost

当交易结束时, 被解除了

crm.company.created

当一个团体被创造的时候,

crm.task.created

当新任务创建(人工或AI生成)时被解除.

email.replied

联系人回复外延电子邮件时即被解除。

email.bounced

当一个外联邮件弹出时, 被解除了任务。

💡
打电话 webhooks.events.list 用于您安装上的权威集, 并带有每个事件的有效载荷。 它来自发送代码本身, 因此它绝不会对实际到达的内容有异议。 完整列表也出现在 Webhooks 部分 。

所有 Webhook 事件均由 HMAC 签名,并在失败时重审。 请订阅 a URL 在设置 > Webhooks 中,或自"id"起使用可持久更改种子的民意调查 crm.events.list。

同步中CRM联系人到 Google 工作表

假设情况:
你想要每一个新的CRM联系人将出现在您的营销团队的 Google Sheet 中。
怎么办:

设置一个 Webhook 订阅器opsiq. contact.upsert.将其指向谷歌 Apps 脚本网络应用或 Zapier 网络hookURL。有效载荷包括联系人名称、电子邮件、公司、铅分和源。您的脚本为每个新联系人附加了一行 Google 工作表。

CRM

分会

部分保存可重复使用的联系人过滤器CRM观点、外联、宣传和其他有受众意识的工具。

产品屏幕
分会分节编辑器结合条件,显示活匹配计数,让操作员选择活过滤器或被绑定快照.分会工作空间MODE 游戏机现场直播LOGIC全部MATCHES1,248现场工作现场客户阶段等于活动的客户端第 11 条上次活动在内部 30 天数第 11 条国家等于联合王国第 11 条高意向 :至少得分为 70第 11 条1CHOOSE MODE生活或快照( 即时)2ADD RULES全部或任何内容3REUSE运动和CRM
分节编辑器结合条件,显示活匹配计数,让操作员选择活过滤器或被绑定快照.

A 现场部分 每当使用时,均从当前数据中重新计算。 被绑住的快照 冻结当前成员名单,当外联对象在批准后不得改变时,该名单是有用的。

选择 全部 当每个条件必须匹配时或 任何 当一个条件足够时。在保存前先检查活计。系统段可以可见,但不受普通编辑的保护。

CRM

领跑分数

铅分规则将行为和剖面信号转化为销售和自动化可以使用的一致分数.

产品屏幕
领跑分数铅分显示活性规则,滚动窗口和正负分数变化,每个规则适用.领跑分数工作空间规 则12SCORED8,412HOT LEADS286现场工作现场定价活动3+ 访问次数 14 天数+20正在购买关键字包含迁移或企业+15支助风险投诉事件 30 天数-10信任来源伙伴推荐+121DESCRIBE RULE使用纯英语2REVIEW FIELDS信号、窗口、点3RESCORE应用到工作空间
铅分显示活性规则,滚动窗口和正负分数变化,每个规则适用.

AI规则构建器可以将一款平正英语指令变为结构化规则. 激活前,每个规则仍应审查:确认活性或关键词,最小计数,滚动窗口和分数变化等.

正面规则和负面规则可以共存。使用 非核心工作空间 在修改了物质规则之后,现有联系人将在新模式下进行评估。分数可以输入段、路径、探矿和工作流程条件。

CRM

销售头板

领导板利用配额实现情况对代表进行比较,在选定的月份赢得收入、佣金和开放管道。

产品屏幕
销售头板每月的榜单对销售代表进行排名,同时保持赢取的收入、佣金和开放管道的可见度。销售头板工作空间PERIOD7月(半天会议)TEAM QUOTA82%184克英镑现场工作现场阿米纳104% · 62克韩圆第1次 788% 配额:51克韩圆第二场丽塔76% 43克韩圆第三届开放管道312克英镑跨队审查1CHOOSE MONTH比较一个时期2CHECK QUOTA代表的娱乐3COACH使用管道上下文
每月的榜单对销售代表进行排名,同时保持赢取的收入、佣金和开放管道的可见度。

只有在每个代表拥有现行配额和交易的正确所有人、金额、货币和近距离地位时,配额的实现才有意义。 用领导板来指导与表彰,而不是唯一的质量衡量标准;将它与交易的健康、活动和预测准确性联系起来。

CRM

发牌批准

交易批准要求经理签收后,才能标出高价值交易的中标.

产品屏幕
发牌批准批准政策确定了两个价值阈值,排队显示待决,已核准和已驳回的决定.发牌批准工作空间POLICY已启用WAITING6OLDEST3h现场工作现场职等1交易来自 £10,000经理职等2交易来自 £50,000高级企业更新£72,000 · 本要求待决移徙项目£18,500 · 丽塔要求核定数1SET THRESHOLDS0禁用分级2REQUEST重新提交协议3决定核准或拒绝
批准政策确定了两个价值阈值,排队显示待决,已核准和已驳回的决定.

启用策略并设置关卡1职等2阈值。 0 当一个非管理者试图在门槛上或以上赢得交易时 OpsIQ 创建批准请求,而不是默默地改变阶段。

管理人员和正式管理人员不受该政策的阻碍,每项决定都应保留请求人、核准人、时间和可审计性的理由。

CRM

生命周期规则

生命周期规则当当前数据匹配保存的条件时,会自动移动各阶段之间的接触.

产品屏幕
生命周期规则生命周期规则按优先级进行评价;第一个匹配规则会改变接触阶段.生命周期规则工作空间实际7RUNS夜来PRIORITY最高一级现场工作现场铅→合格分数 + 60 和最近的活动优先权 100合格→客户购买事件存在优先权 90客户→处于危险之中无活动用于 60 天数优先权 70处于危险之中→客户新购买或答复优先权 601PICK STAGES往返2DEFINE FILTER片段样式 JSON3ORDER RULES初赛获胜
生命周期规则按优先级进行评价;第一个匹配规则会改变接触阶段.

每个规则都有源站级,目的地站级等,活动旗子,优先级和分段式过滤. 预定的生命周期任务首先评价更高优先级,并在第一次对接接触后停止.

规则应该是相互理解的。 避免两个在同一个运行中可以将相同的接触向相反方向移动的有效规则。 在激活前, 测试过滤器对某一段进行测试 。

CRM

CRM活动流

工作空间活动流将客户和操作事件结合起来,这样团队就可以在不打开每个模块的情况下调查所发生的事情.

产品屏幕
CRM活动活动流会与过滤器和页码互通聊天,票务,电子邮件,网络hook,转换和异常事件.CRM活动工作空间事件2,804CUSTOMERS1,126ANOMALIES14现场工作现场聊天解决[email protected] • 大赦国际现在车票已回复T 1048 · 计费4米(含4米) 内含入境事件subscription.upgraded12米(含12米)改划秩序 #7788 · £14919米 时1FILTER事件和客户2OPEN CONTEXT跳转到记录3PAGE RESULTS继续调查
活动流会与过滤器和页码互通聊天,票务,电子邮件,网络hook,转换和异常事件.

按事件类型、日期、联系人或客户状态(包括付费客户)过滤。种子是已记录活动的读取模式;它不取代源票、对话、交易或连接器记录。在采取敏感行动之前打开链接记录。

CRM

工作流量

工作流程对一个事件作出反应,并运行一系列命令行动,包括由克龙恢复的被延迟的步骤.

产品屏幕
工作流量工作流程运行显示其触发,完成动作,等待延迟和下一步.工作流量工作空间实际9RUNNING42失败1现场工作现场触发contact.created开始步骤1发送欢迎邮件完成( E)延迟单单2天数等待中( E)步骤2创建销售任务ưμ㼯A1CHOOSE TRIGGER事件开始运行2ORDER STEPS行动和拖延3MONITOR继续通过克龙
工作流程运行显示其触发,完成动作,等待延迟和下一步.

通过选择触发器创建工作流程,添加步骤并启用它。延迟被存储,而不是被浏览器请求所持有;统一克龙恢复了到期的工作流程运行。

内建起的起步模板包括注册后欢迎,购买后感谢和演示确认. Clone a splate,替换其收件人/内容,然后在广泛激活前用可控记录来测试.

设计要具有一能性的行动。 重试时不得发送重复的移动货币请求或创建重复的记录 。

支助

车票

车票是您的正式支持频道。它们有部门、优先级、SLA目标、附件、内部笔记和完整对话线程。车票可以从 OpsIQ 管理员、票单/封存、电子邮件摄取、聊天升级、连接器或 API.

车票
车票详情一张带有元侧边栏(优先级,部门,SLA,状态)的票,对话线,以及AI起草和退款行动.车票工作空间T-12345_ 电话优先权高 高 高 高 高部门计费SLA3h 左边12米状态打开我两次被控告我的6月订阅3.大赦国际确认复制收费,退款处理.大赦国际答复草案退款1THREADED完整对话+注释2SLA & ROUTING优先、分解、计时器3AI DRAFT为你写回覆
每张票都有其优先位置 部门SLA计时器和全线,AI可以为你起草答复.

票怎么流转的

1
车票到了

客户通过电子邮件、聊天升级、入住票位或管理员创建信息发送信息。该票会获得独特的ID(例如T-)12345).

2
纹理

AI读取主题和主体,指定优先级(Low/Normal/High/Engent),建议一个部门,并检测情绪。如果能够进行分解,就自动发生。

3
答复

代理打开出票,阅读上下文(客户简介,连接器的平台数据,前作出票)并写出回函. AI可以起草回函,代理在发送前会编辑.

4
关闭

问题解决后,代理关卡出票,通知客户,如果客户在关闭后回复,则自动重新开票.

每张牌动作

改革部门

将票移到不同的部门(例如从将军到比林),当初始路线错误时有用.

指定代理

将票子分配给特定队员,指定代理人在他们的"我的门票"视图中看到出票.

添加内部注释

仅写一张只向工作人员可见的纸币,用于:调查结果、退款理由、工程背景、先前的承诺。内部纸币从未在客户面前出现。

合并票价

合并同一客户的重复出票,合并出票主体获得[MERGED]标签,两张出票的信息全部保存在幸存出票中.

反应力强

插入一个预写回复模板。 variables like {{customer_name}} 财务报告和已审计财务报表 {{ticket_id}} 自动替换。

AI 重写

让 AI 改进您的回复草案: 调整语气、 缩短/ 长度、 修改语法或翻译。 您在发送前要查看结果 。

更改优先级

设置为 Low, Normal, high, 或 emergency。 优先级会影响 SLA 计时器和排序顺序 。

变化状况

设定为打开、 待决、等待客户、 解析或关闭 。

工作实例:处理不愉快的客户

顾客电子邮件:"我两次被收了订阅费"

假设情况:
Subject: Double charge on my account Body: Hi, I just checked my bank statement and I see two charges of $49.99 from your company dated June 3. I only have one subscription. Can you please refund the duplicate charge? This is really frustrating.
怎么办:

Step 1: AI triage assigns Priority: High, Department: Billing, Sentiment: Frustrated. Step 2: Agent opens the ticket. The connector panel shows the customer's Stripe charges, confirmed two charges on June 3. Step 3: Agent adds an internal note: "Confirmed duplicate charge in Stripe. Transaction IDs: ch_xxx and ch_yyy." Step 4: Agent drafts a reply: "Hi [Name], I can see the duplicate charge and I'm processing a refund for the second transaction right now. You should see $49.99 back in your account within 3-5 business days. I'm sorry for the inconvenience." Step 5: Agent triggers the refund action through the Stripe connector (with confirmation). Step 6: Agent sends the reply and sets status to Resolved.

部门

在设置 > 票务 > 部门创建部门。常见部门:通用、计费、技术、销售、滥用、上岗。每个部门都有不同的自动校正规则、AI知识和团队任务。

答复

在设置 > 出票单 > 罐装回复中创建可重复使用的回复模板。 良好罐装响应包括:

实例罐装响应模板
Hi {{customer_name}},

Thanks for reaching out. I checked the details and here is what I found:

{{response_details}}

If you need anything else, just reply to this ticket and I will be happy to help.

Best regards,
{{agent_name}}
{{department_signature}}

合并票

当一个客户多次(通过电子邮件和聊天,或两个单独的电子邮件)发送同样的问题时,您可以合并重复。请到票上,点击并购,选择另一张合并的票。幸存的票从两张票上获得所有信息。合并票的主题会得到一个[MERGED]标签,以表示它是合并的。

连接的平台跟随合并. 当门票也在连接的站台上时(WHMCS, Zendesk, SaaS客户门户网站),合并也发生在那里:平台合并其副本,所以你所保存的票子显示了合并后票的首条消息和回复. 一个从未在该站台上的合并票子在被保存的站台票上添加了对话内容,作为私人员工笔记,从不作为回复,客户会被电子邮件。一个在平台内完成的合并(例如,在其中) WHMCS)合并 OpsIQ 门票也一样

优先权和SLA

低级

非紧急问题、 特征请求、 一般反馈。 目标首个响应 : 24 小时。

普通类

标准支持问题。8小时。

高 高 高 高 高

影响客户业务 目标第一反应: 4小时。

紧急

服务下降,安全事故,数据丢失,计费错误。目标第一响应: 1一小时。

SLA计时器在票单创建时开始,在状态为"等待客户"时暂停。如果SLA目标被错过,罚单被突出,可以任意升级。

顾客能看见内部的纸条吗?+

绝不,内部笔记严格只限员工使用,不会出现在客户票端、电子邮件通知或任何客户表面。

闭门票被答复后会怎样?.+

票子自动重开并返回活动队列,球队接到新回执通知.

我能锁一张门票 防止进一步回复吗?+

是的, 使用锁线选项来防止客户和AI添加新的回复。 可用于解决争议或结束调查 。

支助

服务工作室:SLA、状态流量和质量

您支持操作的操作行为控制室: SLA 政策带有升级梯子、 公务时数日历、 强制状态流、 CSAT 设置和企业功能交换器。 从入票页( 操作栏中的服务工作室按钮) 打开它 。

SLA政策

每张新票都会从最具体的积极政策中获得首回和解答的截止日期:部门+优先级比部门,优先级好,默认级好。在等待或搁置的票位上,截止日期会自动暂停。

梯级升级

一项政策可以确定最多可达6个步骤,而不是一项违约行动:例如,对受让人发出警告。75% 窗口中,提醒管理者 100%,重新指派到 150% 每张罚单 每一步都点火一次

工作时间和日历

上班时间到了,SLA只在工作时间内会点燃时钟,所以每周五晚开出一通车票不会被周六所违反. 命名的日历(时区,日,时,节)可以附加在不同地区的球队个人政策上.

状态流动

限制管理员可能做出哪些状态变化的矩阵,并设置 Zendesk 样式的预置。自动化、入境电子邮件和客户原产机票回复总是免予执行,因此严格的矩阵永远不能堵塞管道。在关闭前可选择要求经批准的签注。

核准

代理商要求签收机票(超过门槛的退款,政策例外)。指定批准人或任何正式管理者都用说明决定;请求者永远不能批准自己的申请。等待批准时,会作为信箱上的标语出炉。

票证关系

链接票作为关联,重复,父子或封存;将回复分出新的链接票(合并倒数,不给客户发电子邮件);跟踪申请通知的出票,以及可选的CC后续邮件地址在出票回复.

活的收件箱和相撞

启用实时收件箱后, 代理商在数秒内通过现有的通知流出现新票和回复。 在一张票上, 代理人看到还有谁在观看并获得警告旗, 当队友已经写回信时。 一击的“ 索赔” 按钮会将票分配给自己 。

AI-意识路线

运行规则可以匹配AI 分类信号:优先级,类别,情绪和升级风险,加上您门户网站请求表中的自定义域值。使用这些条件的规则在启用特性之前一直处于休眠状态.

💡
每个企业都开通了,在服务工作室开一个→质量和自动化是选入; 让他们保持行为与升级前完全相同.
为什么一个客户仍然可以重新开张 关闭的门票,当我的矩阵禁止关闭→打开?+

表格只规范行政管理信息系统的行动。 客户提供的回复、电子邮件回复和自动化被故意免除,因此严格的政策永远不能将客户锁出或中断管道。

执行( D)SLA梯子替换了旧的突破动作吗?+

否。用单一违约行动保存的政策不会改变。阶梯只取代您定义步骤的政策上的单一行动。

支助

自动补票和升级

自动重回让AI自动回应新出道的门票. 升级后,AI发现特殊需求时会将门票移动到不同的部门,两者都跨出本土出道门票和电子邮件出道口出道道门.

自动重读
工单自动回复A流:新票,两分钟后发售,AI从知识和上下文回复,再以草稿发出或保存.自动重读工作空间等新票到来新票价任何来源延迟2 min大赦国际的答复KB + 上下文发送草案如果在延迟期间有人回复,自动重写会被取消. Intent可以先升级到另一个部门.1DELAY人类有第一机会2AI REPLIES从 KB + 上下文3OR ESCALATE路线按意图分列
新票获得短暂的延迟(因此人类可以跳入),然后从你的知识中得到AI的回执,作为草稿被发送或排队.

自动复制如何工作

1
车票出现

从任何来源(电子邮件、聊天、门户网站、API).

2
时间表答复

OpsIQ 等待所配置的延迟( 默认 ): 2这让人类特工们有机会先做出回应

3
第一次回复获胜

如果在延迟期间有人类代理回复, 自动重写将被取消。 如果不是, AI 将生成回复 。

4
生成和发送

AI读取票子,检查知识库,连接器上下文,以及客户历史,然后写出回覆. 答复被发送(或排队作为草稿进行审核,视设置而定).

升级如何运作

1
配置部门

设定哪些部门可以接受升级(例如比林可以从通用升级,技术可以从通用提升).

2
给票子打个分类

在自动复制前,AI将票意分类:计费,技术,退款,滥用等.

3
需要移动

如果票意向与升级部门相匹配,则票被移动,内部注释解释了原因.

4
用新声音生成

答复是利用目的地部门的知识和人工智能培训生成的。

设置参考

自动重存启用

开关,打开引擎,可以自动复制票

允许的部门

哪些部门可以接收自动复制。在开账单前,先从低风险部门(通用,销售)开始。

延迟

等待AI回复的时间( 秒) 。 默认 : 120 秒数( E)2准备到0即时回复。

延迟时间表

可选择为工作时间与下班后时间设定不同的延误。

停止管理员回复

如果人类代理先回复, 请取消自动重写。 默认: 打开 。

已启用升级

启用基于票意的自动部门路由.

升级部门

哪个部门可以升级为。

升级状态

升级时要设置什么状态( 如 Open, 待定) 。

递升注释

是否增加内部注释解释升级原因.

电子邮件创建的入场券

从电子邮件(通过邮箱投票或MX接通的发送)中创建的出票方式遵循了相同的自动重写和升级规则。AI回复作为电子邮件回复发送给客户。如果配置,电子邮件草稿会到草稿队列审查。

AI会自动重写收费问题吗?+

只有在您为比林部门提供自动校正。 我们建议您在对AI进行全面计费知识的培训和彻底测试后,才能从自动校准开具账单开始。

如果AI给出了错误的答案呢?+

如果客户回答说答案是错误的,那么人类代理人应该介入. 审阅AI历史来理解AI为什么给出错误答案,然后更新知识库或AI训练以防止它再次发生.

我能在自动复制机发送之前再审阅一下吗?+

是的,将发送模式设定为“草稿”而不是“自动发送”。自动复制草稿将在发送前出现在草稿排队供人审查。

支助

车票入口已嵌入

入网门嵌入了门票,使您可以在任何网站添加出一款售票管理界面。客户可以查看其出站门票、创建新出站口并回复,但无需输入。OpsIQ 管理员。

如何运作
车票入口已嵌入一个嵌入网站的支持门户,显示客户自己的出场券和一款新式的计票按钮.yoursite.com/support支助中心新票价你的脚印#1042 退款问题打开#1038 · 设置帮助已决#1031 · 发票副本待决1EMBED添加到任何站点2SELF-SERVE顾客看他们的票3NO LOGIN身份安全处理
车票入口已嵌入

三个嵌入口味

内嵌

将售票门户在您页面的窗口内打开。该门户将占用其容器的全部宽度。

浮动部件

显示一个浮动按钮,在面板中打开出票门户。类似于聊天部件。

已认证

需要签名的身份证明。客户只看到自己的机票。

安装

车票和聊天机嵌入
<!-- Signed-in customer: your server adds a fresh identity_token -->
<script async src="https://your-opsiq-domain.com/widget.php?site_key=SITE_KEY&identity_token=SERVER_GENERATED_TOKEN"
        data-opsiq-widget="client-chat"></script>

<!-- Guest: the same tag without identity_token -->
<script async src="https://your-opsiq-domain.com/widget.php?site_key=SITE_KEY" data-opsiq-widget="client-chat"></script>
💡
Remote Sites → your site → Codes → C. Signed-in customers generates the complete code for your platform (PHP, WordPress, Laravel, Node.js, Python, Django, .NET, Rails, Java, Go), including the refresh handler that keeps a long visit signed in. The WHMCS hook and the Botble connector bridge already do this.

身份标识生成

对于认证模式, 您的服务器会用网站密钥签署一个短命的代号。 此代号告诉 OpsIQ 客户只看到自己的门票。这是标准的 HS256 JWT:任何JWT 图书馆的功能。这个秘密永远不会进入一个页面。

PHP − 生成身份符
<?php
// Generate identity token (PHP, no dependencies)
$secret = getenv("OPSIQ_SITE_SECRET");          // the site secret, server-side only
$b64 = fn($v) => rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), "+/", "-_"), "=");
$now = time();
$signing = $b64(["alg" => "HS256", "typ" => "JWT"]) . "." . $b64([
    "site_key"      => "SITE_KEY",
    "iat"           => $now,
    "exp"           => $now + 3600,
    "authenticated" => true,                        // required
    "platform"      => "php",
    "customer"      => [
        "id"          => $user["id"],               // required
        "email"       => $user["email"],            // required
        "name"        => $user["name"],
        "external_id" => (string) $user["id"],
    ],
]);
$token = $signing . "." . rtrim(strtr(base64_encode(hash_hmac("sha256", $signing, $secret, true)), "+/", "-_"), "=");
// Put $token on the widget URL as &identity_token=
节点. js,生成身份符
// Node.js — npm i jsonwebtoken
const jwt = require("jsonwebtoken");

function generateOpsIQToken(customer) {
  return jwt.sign({
    site_key: "SITE_KEY",
    authenticated: true,                            // required
    platform: "node",
    customer: { id: customer.id, email: customer.email, name: customer.name, external_id: String(customer.id) },
  }, process.env.OPSIQ_SITE_SECRET, { algorithm: "HS256", expiresIn: 3600 });
}

部件特性

车票列表

搜索,状态过滤列表,一个"等待您"亮出旗下门票,团队已答覆.

串联的对话

完整的对话视图,内容有丰富的文字,附件和时间戳.

自动保存草稿

客户答复草稿是自动保存的,这样他们不会因为导航而失去工作。

现场投票

每一次新答复的投票 12 秒数。

解析/ 重开

顾客可以一击即决或重新开张自己的票.

内部员工的笔记从未在门票上向顾客展示过,这是安全界限的硬盘.
支助

聊天收件箱

聊天信箱是您团队管理客户直播对话的地方。 它显示活动聊天、 指定的对话、 AI 处理的聊天, 以及存档历史 。

聊天收件箱
聊天收件箱三平面代理聊天收件箱:对话列表,与AI草稿芯片的直播谈话,以及访问者/CRM上下文面板.聊天收件箱工作空间日语我的命令在哪里?MO( 动)门萨收费问题RT 调制组丽塔处理的大赦国际我的命令呢?今天发运 . UPSAI草案已就绪回复...观察员陈某甲美国克罗梅3过去的命令LTV 电视 $480CRM阶段:客户1UNIFIED每次直播聊天2CONTEXT访问者+CRM面板3AI ASSIST草稿重写( R)
每一次直播聊天,谈话列表,有AI草稿的线程被收录在自带上下,以及完整的访客+CRM上下文.

管理对话

活动聊天

正在对话。 绿色点=客户正在输入或最近活动 。

人工智能处理

AI正在响应的对口,您可以随时点击"Join"来接任.

交给我

专为您安排的对话

等待中( E)

商议客所等应答.

存档

已完成的对话。 可按关键词、日期和客户搜索 。

从AI到人类的交接

当你从AI那里接过谈话时,遵循这三条规则:

1
亲自问候

介绍一下自己,我是支援队的莎拉

2
参考背景

让你看看谈话 "我看到你问了命令状态"

3
设定预期

告诉顾客接下来会发生什么 "我现在正在调查这个,几分钟后会给你一个答案"

每次谈话时打开/关闭AI

使用每次对话的顶端的AI切换。 当AI打开时, AI就会产生响应。 当关闭时, 只有人类代理才能回复。 即使关闭和返回时,AI也会记住对话的背景 。

离开模式/ 小时外

在设置中配置营业时间。在营业时间之外,AI可以: (1继续对客户作出回应,(2)显示"外出"信息并创建后续的入场券,或(3) 完全禁用聊天并显示出票表。选择适合您支持模式的行为。

处理艰难的谈话

1
冷静点

与顾客的情绪强度不符,承认他们的挫折而不采取防卫.

2
收集事实

答复前要收集相关信息:订购细节,账号状况,前出票情况.

3
提前升级

如果情况涉及退款、法律威胁、滥用或安全,则升级为高级小组成员,而不是试图单独处理。

我能和大家谈谈吗?+

是的,在谈话中用内部笔记与其他特工沟通 这些笔记对客户来说是永远看不到的

我闭口聊天时会怎样?+

对话移动到存档站。 如果客户稍后发送了新消息, 将创建新对话 。

支助

通讯频道

连接WhatsApp,Facebook Messer,Instagram DM,Telegram和LINE,所以客户已经发送您到的邮件与您的网站聊天在同一个收件箱中,由同一个AI助手回答.

每个频道一旦连接,其行为都相同:一个客户信息成为聊天信箱中的谈话,你的AI助手用与您网站聊天相同的知识和指令来回答,任何代理都可以接手。关于您的AI,每个频道不需要配置.

连结是什么样子的

Facebook 通讯员和Instagram

一击。 打开连接器→Facebook Messent & Instagram DM,单击 Connect, 与管理您页面的Facebook账户签名, 并选择该页面。 当您的页面链接到一个Instag拉姆专业账户时, Instaggram 将随之而来 。

WhatsApp

点击您的提供者提供它的地方: 打开信使中心连接器并使用 Connect WhatsApp, 然后跟踪 Meta 的引导签名来选择或创建您的 WhatSApp 商业号码。 否则将粘贴来自任意一个的证书 。20网关.

电报

2分钟。 消息在 Telegram 中@ botFather, 发送/newbot,选择一个名称和一个以“bot”结尾的用户名,然后将它给你的符号粘入“Telegram”连接器。OpsIQ为您注册网页。

线

创建消息API频道 at developers.line.biz, 粘贴频道密钥和访问令牌, 然后复制 WebhookURL显示于OpsIQ进入LINE,并切换自己的自动复制机关闭.

短消息( T)

在信使中心增加一个供应商(Twilio,Vonage,Termii等),并注明其证书和发送号码.

每个连接器在抽屉内显示自己的分步指令,包括要复制的准确内容和地点。您不需要开发者证书来选择一个单击选项。

打开频道

连接频道不会启动它。跳转到 设置 → 客户聊天 → 高级 → 通讯通道,在主切换后切换单个频道。每个频道都有自己的AI自动重存开关,这样在打开其余频道之前,您就可以先试听一个频道。

1
连接频道

在连接器中,使用连接器抽屉中的指令.

2
测试连接

点击测试。 它会给提供者打电话, 告诉你如果有什么问题的话, 什么是错的 。

3
启用消息通道

设置→客户聊天→高级,打开主开关,然后打开频道

4
给自己发个信息

从另一个账户中发送信息, 包括您的页面、 号码或机器人。 它应该在数秒内出现在聊天信箱中, 并获得 AI 回复 。

回覆窗口

消息平台限制企业在客户写作后回复的时间.OpsIQ显示每次谈话的剩余时间,并为您执行规则。

WhatsApp

24小时后,您只能发送一个已核准的模板,在同一个高级标签中配置。

信使和Instagram 数据

24正常答复小时;代理答复时间最多7几天后,梅塔的人类代理津贴。

电报、线程、短消息

没有设置平台窗口 。

⚠️
如果由于窗口关闭而回复失败, 对话会显示原因。 这是平台规则, 不是OpsIQ限制。

共同问题

顾客看到AI回答了吗?+

答案来自您的 Page、 数字或机器人, 和人类的回答完全一样。 您的 AI 指令控制着语气以及它是否识别自己 。

代理商能接手中场对话吗?+

是的,打开聊天信箱中的谈话并点击 JUN。 AI停止, 你输入, 客户看到他们一边有连续的线程 。

如果我切断一个频道呢?+

在连接器上使用断开连接。 信件历史被保存; 新信件只是停止到达, 而平台被告知停止发送 。

两个工作区可以使用相同的Facebook页面吗?.+

号。 页面属于一个工作空间。 连接它会移动到其它地方, 第一个工作空间会停止接收信件, 所以故意断开, 而不是重接到别的地方 。

支助

真正的聊天对话

这些例子显示训练有素的客户AI应该如何处理常见的情况。 使用它们来测试你的AI培训并找出差距 。

10 对话实例

1。返回的客户询问订单

假设情况:
顾客:你好,我订了单3几天前,还没有收到任何航运通知。5523.
怎么办:

大赦国际应当:(a)1查一下顺序 #ORD -5523 (通过连接器。)2报告目前的状况,如有追踪信息,则予以报告。 (3如果命令被推迟,应承认延误,并提供估计时间表。 (4如果连接器没有运输状态,则不创建运输状态。

2. 询问定价的探矿者

假设情况:
客户:你的Pro计划要多少钱?你提供年度账单吗?
怎么办:

大赦国际应当:(a)1(b) 知识库对现行定价的回答。2)解释月费与年费的差额. ("明细表")3如果答案不在知识库中,那么就说吧,并提议将其与销售联系起来。 (4不发明不在知识库中的定价。

3. 愤怒的客户要求退款

假设情况:
顾客:这太荒谬了,你的产品不起作用,我要现在把钱还给我。
怎么办:

大赦国际应当:(a)1冷静地承认挫折感。 (2询问订单号或账户电子邮件。 ()3解释退款过程。 (4创建支持票或升级为人类代理。 (5不承诺退款,这需要人类的批准。

4. 双开票边缘案件

假设情况:
客户:本月我两次被控告,我的银行显示两起指控 $29.99.
怎么办:

大赦国际应当:(a)1(c) 确认关注。2收集有关细节(电子邮件、指控日期)。 (3(a) 解释账单问题需要人审查。4) 制作带有详细内容的计费部门票.5确定High的优先级。

5. 多语种客户

假设情况:
顾客:你好,法国的活人?
怎么办:

大赦国际应当:(a)1如果客户语言得到支持,则以客户语言响应。 ()2回答关于从知识库向法国交付的问题。 (3),如果不支持该语言,则以默认语言回复并注明哪些语言可供使用.

6小时后的对话

假设情况:
有人吗 我需要帮忙处理我的账户
怎么办:

大赦国际应当:(a)1如果配置为后小时AI,则回复和帮助. (A.2)如果下班后创造出票,请说:"我们的团队目前已经下线了,我为你创造了一张支持票,有人会在营业时间跟进. " (B).3)提供票号.

7. 预购比较

假设情况:
客户:你的产品与[竞争对手X]相比如何?.
怎么办:

大赦国际应当:(a)1实事求是地描述出你产品的长处。 (2不要对竞争者说坏话。 (3如果知识库中有一个比较页,请与它链接。 (4)如果客户询问你没有的特征,请诚实.

8客户需要建议

假设情况:
顾客:我经营着一家小型网上商店,大约 100 每月订货,哪一个计划对我合适?
怎么办:

大赦国际应当:(a)1必要时提出澄清问题(例如,哪些特征最为重要)。2(b) 根据知识基础建议一项计划。3解释为什么该计划符合他们的需要。 (4)提到他们可以从一个更小的计划开始,以后再升级.

9客户试图获得未经授权的折扣

假设情况:
顾客:我在网上看到你给 50% 折扣,能给我一个吗?
怎么办:

大赦国际应当:(a)1(如果有的话,请以礼貌方式解释目前的晋升情况。)2不创造或承诺不在知识库中的折扣。 (3如果客户坚持,则主动提出将其与销售团队联系起来。

10。客户需要有特性的帮助

假设情况:
客户:我怎样输出数据?我找不到出口按钮.
怎么办:

大赦国际应当:(a)1提供知识库的分步指示。 (2)包含准确的页面路径和按钮位置. ()3如果特性需要具体计划,请注明。 (4如果该特征不存在,请诚实地提出替代方案。

支助

聊天路线和升级

当一个直播聊天需要一个真实的人时,AI会回答两个问题:由哪个团队拥有这个对话,以及应该告诉谁. 两者都配置在设置,客户端聊天,支持流,在AI的路由部门下.

选择大赦国际可使用哪些部门

板上的两个盒子是白名单。只有向右移动的部是AI能够前往或打开门票的部。左侧的任何东西都看不见,即使部门存在并且有人员。在您工作的时候,开始缩小和增加部门。

💡
如果没有任何部门被启用, OpsIQ 回到每一个部门遗留的路由。把它当作一个安全网,而不是一个配置选择。

谁接受升级

这是大多数人期望配置的,不需要。当AI升级聊天时, OpsIQ 你管理过这个名单,在团队和部门页面上 票价上涨和聊天量上升都跟着它

维和部小组成员

部门下属的每个在职管理人员都会收到自己的副本,暂扣和停用账户都会跳出。

初级管理员

使用时没有队员附着,所以升级仍然会到达某人.

没有人被附身

发送是不可能的,路线面板上标出这个部门红色,AI没有告诉访客一个人类被通知.

⚠️
部门自己的电子邮件地址从来就不是有意作为接收者使用的,这个地址是部门入境的入站票信箱,一个寄入的邮件是用来对开的入通票的。 发送到的升级会作为新入站机票被吸回,而不是到达一个人手中。

统统部门

完全由一个部门负责。 它接受AI无法自信地定位的聊天,它是最后的手段,而不是正常的路径。

1
清除信号赢得

账单的措辞是指开具账单的部门,托管和错误的措辞是指技术部门,购买措辞指向销售部门。

2
AI 分类器下试

如果关键词没有结果,模型会读取对话,从被启用的部门中挑选.

3
然后是包罗万象

只有在两个都空出时, 全面检查部门才接受聊天。

4
卖家

如果包罗万象是销售部门 而访客没有显示购买信号 OpsIQ 寻找一个支持或技术部门代替,所以普通的支持问题不会在销售中积累.

来宾们所说的话

如果升级邮件被发出,AI会告诉访客已经通知了团队。如果无法出场,AI就会说一些诚实的话,请他们把消息留在聊天中。它不会声称在没有发送电子邮件时有人被提醒。

说"没有人可以通知"一个部门+

没有人被附在其中。 Open Team and Departments, 附加至少一个活跃的管理员, 然后重新装入设置页面。 面板读取了 活 。

聊天升级能去别的地方吗?+

是的,一个部门之前保存的自定义地址仍然会取代团队名单。新的设置应该将人员附加到部门,所以有一个单一的维护地点。

为什么我全被漏掉?+

检查一下是否是销售部门 如果是的话 访客没有显示购买信号 OpsIQ 故意前往支助或技术部门。

支助

电子邮件信箱和草稿

OpsIQ 可以连接到电子邮件邮箱, 从收到的电子邮件中自动创建门票, 并将回复作为电子邮件发送。 它还提供了AI 起草的回复, 供人类审查 。

电子邮件
电子邮件到票一个 IMAP 左侧的邮箱将收到的邮件输入有线的票中,右侧有AI所起草的回信.电子邮件工作空间[email protected] · IMAP退款请求[email protected]无法登录[email protected]发票副本[email protected]# 车票 #1042收银机 $我想退钱重复充电...草案复议发送回覆( S)1INGESTIMAP 转发( S)2TO TICKETS自动线程3AI DRAFTS供审查的答复
把邮件拉过来 IMAP (或转发),将每张变为一串线状票,让AI起草答复以供审查.

正在连接一个邮箱

议定书

IMAP (大多数提供者), Gmail API (Google 工作空间),或 Microsoft Graph (外观) 365).

需要设置

主机、端口、加密( U)SSL/TLS),用户名,密码或应用密码,文件夹(通常是INBOX).

部门制图

将邮箱映射到售票部门 电子邮件地址: [email protected] 在"支持"部门创建入场券.

Gmail 设置( 逐步)

1
启用2- 阶段核查

转到 Google 账户 > 安全 > 2- 步入验证并启用它。

2
创建 App 密码

转到 Google 账户 > 安全 > App 密码。 选择“ 邮件” 和“ 其他( )OpsIQ)),复制该文本. 16- 特征密码

3
输入 OpsIQ

转到电子邮件 > 邮箱 > 添加。 设置主机 : imap.gmail.com,端口 : 993,加密: SSL,用户名 : [email protected],密码:应用程序密码.

4
测试

点击测试连接。 如果成功, OpsIQ 将在所配置的间隔时间开始新邮件投票。

展望 365 设置

1
检查 IMAP 已启用

在 Outlook 设置 > Mail > 同步电子邮件中,确保 IMAP 已启用。

2
使用应用程序密码或现代认证

如果启用了 MFA,请创建应用程序密码。否则,请使用常规密码。

3
输入 OpsIQ

主机 : outlook.office365.com,端口 : 993,加密: SSL,用户名 : [email protected].

cPanel 网络邮件设置

1
查找 IMAP 设置

单位 cPanel > 电子邮件账户,单击您的电子邮件账户 IMAP 设置。

2
输入 OpsIQ

主机: 通常 mail.yourdomain.com 或您的服务器主机名, 端口 : 993 (SSL)或(或) 143 (STARTLS),用户名:完整电子邮件地址.

AI 电子邮件草稿

当自动复制设定为“ 草稿” 模式时, AI 生成在草稿队列中出现的回复草稿。 您可以 :

审查

读取草稿并检查准确性.

编辑

发送前修改文本、语气或内容。

发送

批准草案并作为电子邮件答复发送。

丢弃

不宜删除的,删去草案.

自动发送

如果置信度足够高,自动发送功能也启用了,那么在可配置的延迟后会自动发送草稿.

为什么电子邮件没有转换成门票?+

检查 : (1邮箱是否连接并健康? 在 Email > 邮包中查找绿色状态 。 (2工作在运行吗?3电子邮件是否被过滤或移动到除INBOX以外的文件夹?

我能用多个邮箱吗?+

是的,每个邮箱都可以被映射到不同的部门 [email protected] 前往支持, [email protected] 去比林大学

支助

客户满意度(CSAT)

CSAT测量票和聊天满意度,表面不满意的反应并比较AI和人类的结果.

产品屏幕
客户满意度密码CSAT页面结合分数卡,调取者后续,评论,部门和代理分解,聊天反馈.客户满意度工作空间答复386AVERAGE4.6POSITIVE91%现场工作现场调试器后续12 评分的答复1–2审查票证调查发送 24h 关闭后自动聊天反馈大赦国际 4.5 · 人类 4.7比较代理视图得分和答复数教练1WATCH AVERAGE使用趋势, 不是一分2FOLLOW DETRACTORS读取注释3COMPARE FAIRLY大赦国际和人类
密码CSAT页面结合分数卡,调取者后续,评论,部门和代理分解,聊天反馈.

车票调查在关闭后安排(通常情况下) 24 积极的反应是:4或 为5。使用减号队列表示数1或 为2并在联系客户前阅读出票/交谈.

聊天反馈单独报告AI解析和人手处理的对话,低样本大小不应用于给代理或模型排行.

支助

团队电子邮件广播

电子邮件平台页面允许授权的操作员向所有现役特工,被选中的特工或部门发送一次性信息并审查发送历史.

产品屏幕
电子邮件平台团队电子邮件作曲者展示了观众,主题,信息以及过去的传送历史.电子邮件平台工作空间检索12DELIVERED11失败1现场工作现场观众所有现役人员选中议题7月支持轮盘准备消息附表和升级附注准备历史以往的广播和结果视图1CHOOSE PEOPLE全部, 选中或团队2WRITE CLEARLY主题和消息3REVIEW HISTORY确认结果
团队电子邮件作曲者展示了观众,主题,信息以及过去的传送历史.

此页面用于内部操作消息, 而非客户营销。 请选择最小的正确受众, 预览名称和地址, 然后发送。 交付使用配置的外出电子邮件路径并记录结果 。

支助

邮箱、送货和寄入电子邮件

如何配置 OpsIQ 发送电子邮件, 将输入信件转换为票面, 并证明发送域已准备好 。

产品屏幕
电子邮件设置电子邮件设置将出站路由,从身份,邮箱摄取,可交付性检查和测试电子邮件结合起来.电子邮件设置工作空间外 边SMTPMAILBOXES3日 时传球现场工作现场首选连接符SMTP / 提供者连接器配置从身份Support <[email protected]>准备IMAP 邮箱[email protected] · INBOX公司投票可交付性SPF 韩国货币基金传球1CHOOSE OUTBOUND连接器或 SMTP2CONNECT INBOXIMAP 或烟斗3科技发送和核实
电子邮件设置将出站路由,从身份,邮箱摄取,可交付性检查和测试电子邮件结合起来.

外传电子邮件

完整的管理员可以选择首选的电子邮件连接器; OpsIQ 返回到配置中 SMTP/ 酌情发送邮件。 请从名称/地址中设定一个可识别的地址, 发送测试并检查 24- 小时成功/失败的衡量标准。

邮箱

一个 IMAP 邮箱需要名称、电子邮件地址、目标部门、主机、端口、安全模式、用户名、密码、文件夹、投票状态和证书验证选择。使用 投出来 以在等待克龙之前核实摄入量。

即时管道

在同一服务器上,一个邮件管可以直接传递生的RFC822消息. 一个远程邮件服务器可以使用它的符号将生的邮件传送到受保护的入站端点,两种路径都输入相同的去发,去线和出站口管道.

可交付性

SPF/DKIM/DMARC 检查是配置出域的咨询证据。绿色检查不能保证收件箱的放置,但在发送生产信息前应当固定失败。

支助

支持门户工作室

支持"门户工作室"设计并发布客户端支持体验,而不需要外部图像资产.

产品屏幕
支持门户工作室门户工作室显示一个响应性预览,同时显示主题、导航、知识、票款、助手、窗体、页脚和 CSS 控制系统。支持门户工作室工作空间TEMPLATE现代序言桌面国家草案现场工作现场主题品牌颜色和打字编辑导航知识、票、助理编辑车票表字段、路径和副本编辑出版验证和直播审查1CHOOSE TEMPLATE从结构开始2PREVIEW SIZES桌面到移动3PUBLISH SAFELY复议后发布
门户工作室显示一个响应性预览,同时显示主题、导航、知识、票款、助手、窗体、页脚和 CSS 控制系统。

使用模板作为起点,然后配置主题、布局、导航、知识搜索、票单、助手、脚印、品牌、票证行为、自定义 CSS 和一般设置。在发布前预览桌面、平板电脑和移动。

支助

知识差距

知识-gap队列收集客户问题,AI无法自信地回答,以便团队能够提高覆盖范围.

产品屏幕
知识差距差距排行榜被错过或低信心问题并追踪球队是否解决了.知识差距工作空间OPEN GAPS28REPEATED9RESOLVED116现场工作现场移徙限制被问 14 时间高 高 高 高 高周末支助被问8时间中号退款时间被问6时间中号API 区域被问3时间低级1REVIEW QUESTION参见对话背景2CHOOSE FIX第 条或即时3RESOLVE验证下一个答案
差距排行榜被错过或低信心问题并追踪球队是否解决了.

打开一个空白读取原题和相邻的对话,然后选择正确的固定:更新一条已有的文章,创建一条新的知识文章,添加一个商业事实,正确的连接器数据或更改升级指令. 标记它只有在评价或真实测试返回一个可接受的答案后才能解决.

支助

状态页面管理

状态管理网页使用组件、当前状况和更新来沟通服务健康和事件。

产品屏幕
状态管理状态管理列出组件和事件,以便操作员可以发布清晰的,有时间戳的服务信息.状态管理工作空间OVERALL运营构成部分7INCIDENTS1现场工作现场网站运营绿色API退化的履约情况看着电子邮件摄入运营绿色当前事件API 延迟调查打开1UPDATE COMPONENT选择清晰状态2POST INCIDENT时间戳更新3RESOLVE以摘要相接
状态管理列出组件和事件,以便操作员可以发布清晰的,有时间戳的服务信息.

持续使用组件 。 当事件影响客户时, 发布初始通知, 随事实变化而添加加时标的更新, 并用简洁的解析摘要结束 。 请不要将状态页作为内部调试日志; 敏感诊断属于 OpsIQ 和服务器日志。

大赦国际

设置你的人工智能

AI配置是您选择您的 AI 提供者,模型和成本控制的地方 。OpsIQ 支持多个提供者: Claude (Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google),和克罗克(xAI). 你可以使用你自己的 API 密钥( E)BYOK 或管理AI,如果有你的计划。

设置AI
AI 配置AI 设置面板:管理-AI / BYOK 提供者切换,一个模型选择器,以及一个每月的符号预算计数器。AI 配置工作空间AI 配置提供方托管 AI您的密钥( Y)BYOK)型号claude · 平衡每月人工智能预算62%1TWO MODES管理AI或 BYOK2PICK A MODEL速度对深度3BUDGETS调试盖( C)
选择管理AI或你自己的密钥,选择速度与深度的模型,并用象征性预算来封顶每月开支.

选择提供者

克劳德(签名)Anthropic)

强推理,注意事实,善于遵循复杂指令. 模型:克勞德-相生网-4-20250514 克劳德...3.5-sonnet. 最佳服务:支持对话,技术问题,详细分析.

GPT-4o (英语:OpenAI)

快速,有创意,有良好的通识. 模型:gpt-4o,gp特-4o-mini. 最佳:快速响应,有创造性地写作,有广泛的知识问题.

Gemini (谷歌声)

善于实际问题,多语种支持. 模式:gemini-2.0- 闪亮,gemini-1.5- 最佳的:多语言支持、事实观察。

格鲁克(xAI)

快速而简洁的反应。3最好快一点,快回答,随便点

BYOK vs 管理人工智能

BYOK (带上你的钥匙)

你自供养 API 键。您直接向提供方支付费用。完全控制模型的选择和使用。

托管 AI

A. 与《公约》有关的其他事项 OpsIQ 计划。API 使用量与你计划的AI信用余额相抵

逐步设置

1
转到 AI 配置

在那个 OpsIQ 管理员,导航到设置 > AI配置。

2
选择提供者

从下拉中选择您的 AI 提供者 。

3
输入 API 键

如果使用,则 BYOK 输入 API。对于管理AI来说,这是自动处理的。

4
选择模式

选择要使用的具体模型。 较小的模型更快, 更便宜。 较大的模型给出了更好的质量答案 。

5
测试连接

点击“ 测试连接” 以验证 API 键和模型正在起作用。绿色标记意味着成功。

6
保存

单击“保存”以激活您的AI配置。

费用控制

每月预算

设定AI 符号的每月最大开支。 当预算达到时,AI 特征是优雅地降解(缩短回复,不自动复制)而不是完全停止。

逐一对接的符号限制

单个对话的最大值。 防止运行中的谈话消耗过多的信用 。

低余额警报

当您的AI信用余额下降到阈值以下时( 默认 ): 50,000),在管理器中出现警告。在 AI 配置中设置此选项。

工作空间配置

AI 配置是每个工作空间。 如果您管理多个站点, 每个工作空间可以使用不同的提供者、 模型和预算。 除非被覆盖, 工作空间会继承全局默认值。 要配置每个工作区域: 切换到工作空间, 则转到 AI 为配置并保存设置 。

获取 API 密钥

Anthropic (克劳德.

转到 console.anthropic.com > API Keys > Create Key. 复制从"sk-ant-"开始的密钥.

OpenAI (GPT) (英语).

转到 platform.openai.com > API 密钥 > 创建新的密钥。 复制密钥开头的“ sk- ” 。

谷歌 (英语).Gemini)

转到 aistudio.google.com > 获取 API 密钥。 为您的工程创建密钥, 复制密钥 。

xAI (希腊语)

转到 console.x.ai > API 钥匙 创建和复制您的钥匙

测试您的 AI 设置

假设情况:
进入你的身体后 API 键,单击“测试连接”。您应该看到一个绿色的检查标记和AI的样本回复。
怎么办:

如果测试失败:(1检查一下 API 键正确(没有额外空格)。 (2)检查您的账户是否与供应商建立了帐单。 (3)检查模型名称是否有效.4如果使用"管理AI",验证您的执照是活性的.

哪个供应商是最好的?+

没有任何一个最好的提供者,克洛德在支持对话方面是出色的。GPT-4o是快速和多功能的。Gemini 处理好多种语言。请尝试每种语言,并查看哪些语言能为特定使用情况产生最佳效果。

我等会再换供应商好吗?+

是的 改变供应商 API。当前对话历史被保存。AI将使用新的提供者来进行所有未来的对话。

学分用光了怎么办?+

AI的分解优雅:回复变得更短,自动重写暂停,管理员显示的警告差. Core track,入场券,以及CRM在没有AI的情况下继续工作.

大赦国际

更聪明的客户聊天( C)

一组选择进入控制,它使客户聊天更聪明(其原因贯穿客户的账户,就像人类代理)或更便宜(它发送AI较少,或者回答的步数更少)。每个控制都是默认和独立的,一个开关永远不会改变任何其他行为。大多数控制生活在设置 > 客户聊天 > 行为之下;少数控制在设置您的AI并训练您的AI上。

更智能的回答(代理模式)

一个普通的聊天员从一个角度回答一个问题。 代理模式 ,助理可以一次进行几次只读账户检查并交叉引用,例如“我是否有张门票,我的余额是否足以让我下次续签?” 用一个解答的数学来回答。它只为已核实的客户进行账户或退款问题;其他一切都是正常的单接答案路径。

代理模式

每个回合最多只读浏览几个,在回答前交叉引用。当您有一个连接的平台时打开(WHMCS, Shopify, Stripe, Zendesk等). Off=今天的单向行为,不变.

思考代理答案的深度

复杂转弯(低/中/高)的模型原因有多难。从低起步;大多数支持问题在那里处理得很好。

代理模式

平分一个更强大的模型,只用于复杂的代理转盘,所以日常聊天都停留在一种轻而便宜的模型上,只有硬转盘才能支付深度. Blank=你的普通客户聊天模型.

· 单行本答案(β)

一个很小的规划步骤决定了要拉哪一个检查和是否需要知识库,然后用一个主调而不是几个步骤来回答。在代理模式下的一个子切换。除非代理模式被打开,否则无法启用。同样的回答质量,对多部分问题的调用更少。

对话与理解

长相会记忆 (β)

保留一个较旧消息的短长运行摘要(名称,票/发票号码,金额,决定),因此助理在非常长的聊天中保持一致,而不将整个记录稿再发。最好支持重,长的线程;对等的代理模式.

泰波耐受性

将小打字( “我的开口票” 、 “ 无报酬的空话 ” ) 作为要用的词来读取, 因此找到正确的信息而不是漏掉。 每个连接的平台都可用。 默认关闭; 用于移动重的聊天 。

账户上下文

只有在问题涉及客户账户时(余额、发票、票、服务),才附上客户账户的快照,在一般问题上跳过。在不损失质量的情况下,成本将减少。当需要时,助手仍可现场获取账户。

节省费用

跳过知识搜索问候( β)

”嗨,“谢谢”和“OK”不会触发一个知识库搜索,这些回复从不使用它。任何有真实内容的信息仍然正常搜索。

允许的最长答复( 托盘)

标出单个回复可以持续多久。回复长度是呼叫中最昂贵的部分,所以一个合理的封顶(大约) 500)是单个最有效的聊天成本控制。只降低您的全球限制,永远不要提高。

设置你的AI

思考深度( 客户和管理员聊天)

模型在回答( 最小到高) 之前会怎么想 。 保持客户聊天速度最小/ 低; 保留更高的设置进行分析和代理驾驶 。

人均AI模式(每名工作)

每个AI表面(活聊天,票子草稿,摘要,分析,管理员副驾驶,升级,站点情报等)都可以运行在自己的模式上. 速度重要的光线,质量重要的强力. lank on a survement = 提供者默认该任务.

管理聊天费用控制

管理员副驾驶可以保留有界限的工作内存,只装入问题需要的工具(lean survey)而不必每个转弯都装入.

训练你的人工智能

压缩指令

您的指示每转一次都会被发送, 因此长度是经常性成本。 压缩按钮会重写一个槽, 用更少的单词来表达相同的话。 如果它会丢掉任何内容, 它会拒绝重写 。{variable} 或规则, 并报告它所保护的, 所以它永远不会默默地改变意义。

"什么已经进入大脑"(一).

显示什么 OpsIQ 已经知道您每个插槽的业务,所以您可以删除您在自己的指令中重复的内容 。

💡
钱流向何处? 对于简短的支援聊天(指令+账户数据+历史,每次转弯发送),通常比简短的回答要花费更多,缓冲和收缩上下文对那里帮助最大。对于长期生成的内容,输出占了主导地位。回复长度上限和较低的思维深度可以在那里得到回报。请查看设置您的AI来保持快速缓冲,这样每个转弯中重复的部分就变得便宜了。
这些改变聊天已经如何回答吗 ?+

否。 每个控制默认和独立关闭。 打开一个只增加其行为; 关闭它返回到它以前的确切工作方式 。

我该怎么开?+

每日在光线模型上聊天并给一个更强大的代理模型打针。 如果您有连接的平台, 请启用代理模式, 然后先规划, 再进行长对话内存。 然后是上下文, 跳过 KB 并加一个回覆盖。 最后压缩您的指令。 每次修改后请注意一些真正的聊天 。

行政代理工具包:网页搜索、运行簿、任务、文件传输

管理员AI聊天是一个工作工程师, 而不仅仅是一个问箱。 它可以在网络上研究修正程序, 保存您的操作程序库, 巡视您的服务器, 并移动文件。 大部分都是通过聊天来驱动的; 您配置的前置内容是您使用的哪个网页搜索提供者, 在设置您的AI页面上 。

网络搜索

内建

代理在工作时搜索网络中的文件、 错误消息和当前信息。 此选项使用 DuckDuckGo, 它不需要密钥和设置 。

运行本

聊天时

保存了您的程序库(“我们如何在这里做X ” )。 代理在完成一个棘手的工作之后写下一个, 下次再跟踪它, 因此, 诀窍在聊天结束后就一直存在。

任务

计划

排好只读巡逻,"每天早上检查磁盘空间和错误记录,然后告诉我" 发现的就在你管理员的铃声上

文件传输

聊天时

询问日志文件并获取私人下载链接, 或将一个文件从一个连接的服务器复制到另一个服务器。 both caped at 5 MB.

管理代理网络搜索(关于设置您的AI)

搜索提供者

代理网络搜索使用什么。默认是 DuckDuckGo: 无密钥,免费,每个安装都有工作。 Brave Search, Tavily and Serper.dev (Google results) 通常返回更好的结果,但每个需要一个 API 如果按键提供者因任何原因(坏键、配额被用掉、网络出问题)而失败,则该搜索会自动回到 DuckDuckGo ,所以搜索永远不会变暗。

搜索 API 键

您所选择的提供者的密钥, 仅是勇者、 Tavily 或 Serper 所需要的。 一旦保存它, 它就会被蒙上面罩, 并且再也不会在页面上显示; 粘贴一个新的来替换它。 一个键盘提供者只有在提供者及其密钥都保存时才会活动 。

运行本

当代理刚刚完成一个任务时, 您会想再次做同样的事情, 请说“ 保存它为名为 “ 夜行清理” 的运行本。 从此以后, 它会在每次工作时看到该运行本的名称, 当你要求使用名称( 或者描述它) 时, 它会拉起步骤并跟踪它们。 您可以随时要求它列出、 更新或者删除运行本 。

💡
运行簿是指导,而不是自由的通行证。 当代理遵循一个指令时, 改变服务器的每一个步骤仍然会通过您的当前许可模式, 并显示通常的审批卡。 运行册永远不能绕过批准 。

任务

任务是代理自己经常进行的工作:每小时一次,每天固定小时,或每周一次。任务只按设计读取,但不能修改服务器、数据和网络,而是永远不能改变任何内容;调查并报告。任务结束后,发现结果会作为通知寄到您的管理员铃上。说“现在进行晨间巡逻”,以触发一个需要时的检查,或要求代理人员列出、暂停或删除任务。

⚠️
任务已离开 OpsIQ cron, 因此需要设置( 参见 Cron and automatic) 。 聊天作品中的一次性“ 运行到现在 ” , 甚至可以在大多数服务器上的 cron 运行 。

移动文件

询问一个文件( “ 从网络服务器上获取今天的错误日志 ” ) , 以及代理器用私有下载链接进行分级和回复。 链接只对签名管理员有效, 并且一天后过期 。 文件封顶 。5 MB;对于任何更大的,请代理先在服务器上进行压缩或修剪.

代理服务器也可以在两个连接的服务器之间复制一个文件, 最多可达 5 MB。目的地的写法被像其他任何更改一样对待:在询问模式中,您先获得批准卡,现有文件会被备份,副本可以被反转。为了安全起见,文件内容在应用副本时会从源重读,而不是从聊天中取出.

大赦国际

训练你的人工智能

AI Training 是您教授 OpsIQ 如何行为的地方。 您会写出定义个性、界限、知识焦点和升级规则的提示。 把它看作为新的辅助代理撰写培训手册。

AI号列车
训练你的人工智能一个AI指令编辑器,带有客户/阿德明标签和平庸英语语气,永远也从来不会规则.训练你的人工智能工作空间客户AI行政助理调音友好,简洁,永远不要太冲动。永远提供人交费 用于解决纠纷。永远保证不检查账户就退款1TWO MANUALS客户和管理AI2PLAIN ENGLISH音调,总是,从来没有3GROUNDED加上你的知识基础
以英文(tone, always, never)写成的客户手册,

两个培训领域

客户 AI 提示

控制 AI 在聊天部件中如何与您的客户交谈。 这是正确处理的最重要提示 。

行政AI 提示

控制 AI 如何协助您的管理团队使用操作仪表板。 它处理内部查询和动作执行 。

写一个伟大的客户AI提示

客户AI的提示应该覆盖这些区域:

1
身份

AI是谁?给它一个名字,角色和个性。例如:"你是Luna,一个友好而有知识的客户支持助手Acme Store".

2
音调和风格

它应该如何沟通? 例如:“专业但温和。使用简单的语言。避免用词。使回复简洁(2-3”).

3
知识界限

其知道和不知道的是什么?例如:“你知道我们的产品、定价、航运和回报政策。你不知道竞争者的产品或公司内部的决定。 ”

4
升级规则

何时应该交给人类?例:"在顾客要求退款,提及法律诉讼,报告一个安全问题,或者三次问出同样的问题时,向人类代理人升级".

5
永远不能做的事

硬边界。 比如:“永远不要承诺退款,永远不要分享内部定价公式。永远不要构成不存在的产品特征。永远不能提供医疗、法律或财务建议 ” 。

示例提示

示例客户 AI 提示 \ 在线商店
You are Aria, a friendly customer support assistant for TechGear.

PERSONALITY:
- Warm and professional
- Concise (2-3 paragraphs max per response)
- Use simple language, no jargon
- If unsure, say so honestly

KNOWLEDGE:
- Our products: laptops, accessories, software subscriptions
- Pricing: as listed in the knowledge base
- Shipping: free over $50, 3-5 business days standard, 1-2 days express ($12)
- Returns: 30-day money-back guarantee, must be in original condition

ESCALATION (hand off to human):
- Refund requests over $100
- Account security concerns
- Legal threats or complaints
- Customer explicitly asks for a human

NEVER DO:
- Promise specific delivery dates (say "estimated")
- Share discount codes not in the knowledge base
- Make up product specifications
- Give financial or legal advice
客户AI 提示 \ 主机公司
You are Atlas, an AI assistant for CloudHost web hosting.

TONE: Technical but accessible. Assume the customer has basic web knowledge.

KNOWLEDGE:
- Shared hosting, VPS, dedicated servers
- cPanel, DNS, SSL, email configuration
- WordPress, Joomla, Drupal installation
- Common error codes and troubleshooting

ESCALATION:
- Server outages affecting multiple customers
- Data loss or security breach reports
- Billing disputes over $50
- Complex migration requests

BOUNDARIES:
- Do NOT access customer servers or databases
- Do NOT change DNS records or passwords
- Always recommend the customer makes changes themselves
- For code issues, suggest steps but clarify you cannot debug their application

时间推移后, 将您的提示进行精细化

1
发射基本内容

从身份、语气和关键界限开始。不要试图在第一天覆盖所有内容。

2
历史周刊

读取AI给出错误或次优答案的对口.

3
更新提示

添加关于反复出现问题的具体规则。 例如:如果AI继续承诺退款, 加入“ 永远不要承诺退税, 说你会升级到计费团队中去 ” 。

4
添加知识

如果大赦国际不能回答一个问题,就把答案添加到知识库中,而不是试图将所有问题放在即时。

⚠️
保持您的快速下 2,000 时间过长的提示会混淆人工智能,增加象征性成本,而是将详细信息放入知识库。
即时与知识基础有何区别?+

即时定义了个性、界限和规则。知识库提供了事实信息(产品细节、定价、政策 ) 。 AI既读了两者,但即时塑造了行为,而KB则提供了答案。

不同部门可以有不同的提示吗?+

提示是每个工作空间。 如果您需要不同的部门不同的AI行为, 请使用知识库提供特定部门的信息, 并在提示中提及部门的背景 。

大赦国际

大赦国际的历史

AI History显示AI与客户和管理员的每次对话,用它来审计AI的表现,找到错误的答案并找出培训差距.

大赦国际的历史
大赦国际的历史AI的日志会转动,有类型徽章,问答,响应时间和结果.大赦国际的历史工作空间每一次AI转弯,记录聊天问:我的命令在哪里?A:今天运出,UPS追踪...0.9s已回答( E)票价T-_12345 的答复草案已起草退款确认书1.4sdrafted管理员总结一下这周的票12- 返回行摘要2.1s已经完成聊天问:取消我的计划交给人类0.7sescalated1EVERY TURN迅速、答复、行动2SEARCHABLE过滤出( E)3OWNER-ONLY全面审计线索
每一轮AI(聊天、票单、行政行动)记录准确的及时性、答复、持续时间和结果。

每次谈话都显示什么

日期和时间

当谈话发生时.

客户身份

如果知道姓名和电子邮件,否则 IP 以及国家。

频道

聊天部件,自动复制票、电子邮件草稿或管理员AI。

信件

谈话全文:客户留言和AI回应.

调试用法

对话消耗了多少个符号。 高符号的使用率可能表明AI给出了过多的动词答案,或者对话绕了圈子。

采取的行动

任何在谈话中执行的AI行为(查清订单,创建出票等).

评级

如果CSAT被启用,客户对这次对话的满意度评分.

寻找问题

以关键词搜索

搜索特定话题以查看AI如何处理它们. 例: 搜索"退款"以检查AI是否遵循您的退款政策.

通过评分过滤

只显示低评分的对话,以关注不满的客户.

按频道过滤

只显示自动复制的票, 用于审计自动回复, 与聊天分开 。

按符号用法排序

高调对话可能表明问题:AI乱来,绕圈子走来走去,或者没有回答问题.

每周审计例行程序

1
检查低分级的对话

读完完整记录,有什么不对?是知识差距,语气问题,还是答错?

2
检查高调对话

这可能说明混乱,AI重复了吗?它是否不明白问题?

3
更新培训

对于知识差距,请在"知识库"中添加文章. 对于行为问题,请更新AI的快取. 对于反复出现的错误答案,请加入明确的更正规则.

找出知识差距

假设情况:
你搜索AI历史的"安装",然后找到 15 AI表示"我并没有关于这个产品的具体安装指令"的谈话.
怎么办:

这意味着您的知识库缺少安装指南。 为每个产品的安装步骤创建知识库文章。 在添加后, 测试时询问 AI 安装问题 。

大赦国际

大赦国际的见解

AI Insights自动分析对话模式并显示可操作的结论:常见问题,满意度趋势,知识差距和升级模式.

大赦国际的见解
AI 见解(情报中心)情报中心:AI今日简报,智能警报,一分分数-a-lead/a-AA-Page工具,以及一个 14- 日交通模式图。大赦国际的见解工作空间今天的生日 时间轴:上车 12%; 3热导;2交易需要跟进。智能提醒已标记出错跳起来 /pricing新的热导引自美国收入提前于上星期评分一首主打/分析一页IP 或 为 URL…运行14- 日间交通模式1今天的生日 时间轴:AI写了早上的总结2SMART ALERTS浮出异常点3ON DEMAND分数为主 \ 分析一页
真正的情报中心:AI写的"今日简报",对异常点的智能警报,点播前导分和页面分析,以及 14- 日行车模式。

洞察力的显示

顶级问题

最常被问到的问题。如果“我如何重置密码?”是#1,您的知识库需要显著的密码重置指南。

满意趋势

CSAT 分数随时间推移而增加。AI满意度是否提高或下降? 突然下降可能表明知识基础的变化会打破某些东西。

分辨率

AI在没有人类干预的情况下解决对话的百分比是多少? 70% 不错,下面 50% 意味着AI需要更多的培训.

升级原因

为何对话被传递给人类. 常见的原因:客户要求人类,AI无法回答,敏感话题,账单问题.

知识差距

AI经常说"我不知道"或给出低信心答案的主题.

平均对话时间

每次谈话有多少个消息。非常长的谈话(10+ 消息)可能表明大赦国际不理解这个问题。

利用见解改进

假设情况:
AI Insights显示, 23% 升级是"海关问保修问题",AI无法回答.
怎么办:

这是一个明显的知识差距。1在知识库中撰写一份全面的保修文章,涵盖所有保修条款、索赔程序和排除条款。 (2更新大赦国际的提示,以获取保修信息。 (E.3下星期监控AI Insights,看保修升级是否减少.

大赦国际

管理 AI 游戏本

A. 行政法大赦国际(问 OpsIQ)帮助你的团队管理 OpsIQ 您可以要求它查阅数据、解释功能、总结票务和执行平台行动。

行政助理
管理 AI 游戏本问...OpsIQ 命令框,并带有AI提议的平台行动卡,显示参数和确认/取消。询问 OpsIQ工作空间询问 OpsIQ暂停服务以获取过期账户 #4821大赦国际建议采取的行动:暂停服务账户 : #4821 (逾期未交) $120)平台 : WHMCS · 可逆转性确认取消( E)1ASK ANYTHING普通英语命令2PROPOSE FIRST运行前显示的动作3YOU CONFIRM范围已审计( C)
告诉管理员AI你用简单的英语想要什么;它提出了精确的动作(可扫描,可逆转,可审计)并等待你的确认.

行政AI能做什么? ! !

查找数据

问:"给我看所有的票,从 [email protected]"或"什么是状态 命令#ORD -5523?"

总结

问:"放大后一回 10 票房"或"本周最顶级的支持议题是什么".

解释特性

问:"我如何设置自动重读"或"弹出率卡是什么意思?"

执行动作

问:"为...... [email protected] 关于开账单,或者"关闭票T...12345"

平台查询

问:"昨日来客多?"或"本月收多少?

实例对话

找一个顾客

假设情况:
管理员问道:"找到客户 [email protected] 并展示他们最近的活动".
怎么办:

AI通过所有相关数据来源查询客户:访问者会议、机票、聊天对话、订单和CRM。返回最近活动的概要,并链接到每个项目。

每日摘要

假设情况:
行政上问:"今日何事?
怎么办:

AI总结道:"今天,你曾经... 245 访客(上) 12%), 8新车票(3 (由大赦国际解决)2新订单共计 $198,以及1聊到一个航运延误".

执行动作

假设情况:
管理员问道:"换票T-5523 优先级改为紧急
怎么办:

AI确认:"我会换票T...5523 优先级从正常到紧急。 这将影响 SLA 计时器 。 确认 ? 您确认, 操作已执行 。

💡
行政AI只执行在行动登记簿中注册的行动,不能在外创建行动或访问系统 OpsIQ.
大赦国际

客户AI假想

本节涵盖常见的客户端AI假想,并附有预期的行为和培训提示.

客户AI
客户AI假想一个客户提问库与预期的AI行为对齐,每个都有一个结果标记.客户AI假想工作空间假设库 —— 预期AI 行为"我的命令在哪里?"通过连接器查找顺序, 给出跟踪决断"我要退款"承认,永远不要答应 人手递"服务停止了吗?"检查状态, 报告当前状态状态"取消我的账户"确定意图,然后去人类的去向确认1SCENARIOS共同问题2EXPECTED大赦国际应如何回答3科技找出培训差距
一个真正的客户问题库 以及AI应该如何处理每个问题, 测试你的训练,找出漏洞。

情景图书馆

秩序状况调查

假设情况:
顾客: "我的订单在哪里"12345?"
怎么办:

预期AI行为:(a)1)通过站台连接器查找顺序. (PDF).2报告目前状况(处理、发运和交付)。 (3(如果有的话,包括追踪号。 )4如果命令被延迟,则确认并提供估计时间表。 (5永远不要发明跟踪信息。

密码重置请求

假设情况:
顾客:"我忘了密码,不能登录"
怎么办:

预期AI行为:(a)1提供从知识库中重新设置密码的步骤。 (2)包含重设链接或页面路径。 (3提及重置的电子邮件可能需要几分钟。 (4建议检查垃圾邮件文件夹。 (5如果客户仍然无法重置,则升级为人.

特性请求

假设情况:
客户:"你能在移动应用程序中添加暗模式吗?"
怎么办:

预期AI行为:(a)1感谢他们的建议。2解释如何处理特征请求(登录、审查、确定优先次序)。3不承诺该特性将建成。 ()4如果存在相类似的特征,请注明.

计费纠纷

假设情况:
顾客:"我被控告了,但我的服务没有工作"
怎么办:

预期AI行为:(a)1(c) 承认挫折感。2如果可能的话,请检查服务状况。 ()3)以一切细节被加速到计费部门去. ("明实录"作分. )4不承诺退款。 (5将票价优先设定到高地.

非专题问题

假设情况:
顾客:"今天伦敦的天气怎么样?"
怎么办:

预期AI行为:(a)1),有礼貌地重新定向. "我是你的[公司]支助助理,可以帮助解决有关我们的产品和服务的问题. 对于天气信息,试试气象服务"("I'm your [company] support Assistance Affairs and Conference of our produces and Service.").2)问他们是否有产品问题.

我该怎么测试客户AI的行为?+

打开您的网站, 使用私人/ 匿名浏览器, 并作为客户与 AI 聊天。 请尝试常见的问题、 边缘案件和对抗性方案 。 请检查 AI是否遵循您的快速规则并正确使用知识库内容 。

大赦国际

AI知识库

知识库是AI用来回答问题的文章库,当客户问到什么时,AI会搜索相关文章的知识库,并用以生成准确,有根据的回复.

知识库
知识库来源输入知识库,然后是AI生成一个有根据的被引用的答案.知识库工作空间来源网站爬行帮助文章问题导入的文件知识语义+关键词大赦国际基础答案与引用来源。"退款需要..."3–5商业日。"1INGEST爬行、 财务问题、 导入2RETRIEVE语义+关键词3GROUNDED从内容中解答
爬入您的网站, 并导入文件到知识库; AI 检索正确的文章和答案, 被禁入并引用 。

如何运作

1
顾客问问题

"你有什么退税政策?"

2
AI搜索知识库

OpsIQ 通过匹配关键词和语义含义来找到"回归政策"一文.

3
AI 生成一个响应

大赦国际阅读了文章,并根据文章内容写出自然语言的答案。

4
顾客得到准确的答案

答复的依据是你的实际政策,而不是AI的一般培训数据.

创造好文章

每条一个题目

为每个话题分别写一篇文章:回程策略,发运费率,账户设置,密码重置等。不要合并无关话题.

写得像一个FAQ

从客户提问开始,然后提供答案。这帮助AI将问题与文章匹配。

具体

"回归必须从内部开始 30 送货的日子比"我们有退货政策"好

包含边缘大小写

数字产品呢?出售的物品呢?包括例外。

保持时尚

每季度审查文章,删除已过时的信息,在价格、政策和程序发生变化时更新。

启动文章时您应该写

运输和交货

运输费用、交货时间、跟踪、国际航运和装卸延误。

回返和退款

返回窗口、条件、流程、退款时间表和例外。

账户管理

密码重置,电子邮件更改,账户删除,以及数据导出.

定价和计费

计划说明、计费周期、付款方法、发票和货币。

产品指南

如何使用每个产品或特性. 分步指示并有截图.

解决问题

常见的问题和解决方案,错误消息及其修正.

联系方式

营业时间,支持渠道,响应时间,升级路径.

法律和遵守情况

隐私政策摘要、服务条款摘要、GDPR 数据请求。

连接器知识

每个连接器都可以为AI提供知识. 当连接器被启用时,其内置的知识文章(产品目录,常见问题,平台特有故障排除)会自动提供给AI. 您可以在连接器的设置中切换每个连接器上的连接器知识或关闭连接器.

预算

知识库有一个可配置的符号上限(默认: 32,000 如果您的知识基础非常大, AI会在本预算范围内选择最相关的文章。 如果AI没有找到相关的文章, 则提高上限; 如果您想要降低象征性成本, 降低上限 。

我应该写多少篇文章?+

开始于5-10 包含您最常见的问题的文章。在您通过 AI History 和 AI Insights 找出差距时,多加一些内容。大多数企业需要 20-50 全面覆盖的条款。

我能从另一个系统进口文章吗?+

目前,文章是手工创建的 OpsIQ。您可以从现有的 FAQ 、 帮助中心或文档中复制复制内容。

文章应采用什么格式?+

纯文本效果最好。 AI 理解自然语言比结构化更好 。HTML 写给顾客解释

大赦国际

AI 评价和监视台

评估将关键客户问题转化为回答质量、引用、升级和行动安全的可重复测试。

产品屏幕
AI 评价AI评价列出了黄金测试案例、所需行为、最新结果和预定的监视台运行情况。AI 评价工作空间SETS6CASES84PASS RATE96%现场工作现场航运政策需要引用传球退款请求需要人力确认传球1. 无凭证的索赔禁止行动传球移徙问题预期来源缺失失败1CREATE CASES黄金投入和规则2RUN SAFELY干跑或活活的 val3WATCH每日或每周时间表
AI评价列出了黄金测试案例、所需行为、最新结果和预定的监视台运行情况。

完整的管理员可以创建带有快速、预期源标签、所需引用、人与人确认规则、升级预期和被禁动作的评价集。直接运行一组,进行干燥运行,或者重放选定的历史 。

监视塔 每日或每周检查时间通过头寸进行,并运行数量限定的案件(每张排定的通行证最多8起)。

大赦国际

语文和笔译

语言管理翻译的客户界面文本和在 OpsIQ 使用客户语言。

产品屏幕
语文语言网页显示原始语言、翻译语言、草稿/实况和客户语言行为。语文工作空间资源联合国LANGUAGES4活着3现场工作现场法语接口和内容现场直播德语接口和内容现场直播西班牙语翻译草稿草案跟随客户以检测到的语言答复打开1SET SOURCE原始运算符语言2ADD LANGUAGE在背景中翻译3PUBLISH起草或直播
语言网页显示原始语言、翻译语言、草稿/实况和客户语言行为。

OpsIQ 翻译运算符进入客户端的文本。 在创建翻译前正确设定源语言, 添加目标语言, 然后在发布前审查草稿 。 “ 遵循客户端语言” 控制响应语言; 翻译部件界面控制其按钮、 标签和系统文本 。

翻译范围可以是只作草稿或现场翻译,在未经人文审查的情况下,不要依赖机器翻译来撰写法律、退款、安全或安全文本。

每个持有自己措辞的地方都列出其信息计数:客户聊天信息,促销,主动信息,聊天流,导游,公告,取笑者泡沫和 调查和表格。调查表面完全覆盖了每个已公布的调查:标题、每个问题、每个回答选项、按钮、欢迎和感谢副本、页染色体和结果页。关键值与问题ID和选项值挂钩,因此重新排列问题或选项永远不会丢失翻译,只重新翻译一个信息。所公布的现场调查默认提供;当您扩大范围时,草稿会加入。

聊天后电子邮件调查遵循了访客实际交谈的语言,条件是您在此提供的语言是;否则它会使用您的系统语言。它的六个可编辑字段也在本页面上翻译,行为在客户端聊天设置中有自己的切换器。

车票和门户信息 包括固定文本操作员一次,每名客户然后用一种语言收到:票证、开出、关闭和反馈确认、每个部门签收和门户欢迎行。 (AI自动检索不需要这些,它已经用客户的语言回答。 ) 电子邮件客户使用自己的语言 启用于 OpsIQ 写作,票子电子邮件按此顺序解决收件人的语言:他们在门户或帮助中心所选择的语言(被带入票上),他们联系记录上的地语,然后是他们写入的语言,通过脚本范围和标记词在本地检测到,没有外部调用。只有语言页面中选择的语言才被使用,所以这个功能是惰性的,直到语言被添加。HTML 电子邮件包装是刻意不翻译的:它是标语,而不是口语。 工作人员发邮件(通知、部门提醒、分析简报、预定报告、每周摘要)总是使用系统语言。

PeopleOS HR

PeopleOS:受管的劳动力操作系统

以移动自助服务、证据支持的工作流程、打字整合和对敏感决定的人力控制,运行员工生命周期,从请购到下船。

交互式系统映射
PeopleOS生命周期指挥中心一个三维PeopleOS仪表板连接招聘,员工,工资,学习和治理AI.人民OS指挥中心证据生活人民群众248开放作用12控制装置15 / 15生活状况征聘人员聘请增长奖励过渡一份记录身份+就业证据人力资源管理上诉、纠正、接管证明结果和释放证据
PeopleOS将生命周期、控制和证明保存在一个受管制的档案上。

管理员

运行

管理人员、组织、征聘、入职、文件、休假、工资调节、福利、业绩、学习、雇员关系、分析与治理。

雇员和管理人员

自助服务

使用移动一号门户进行私人记录,请求,文档,入职,时间,薪酬解释,学习,公司信息和权利.

开发者

扩展

使用被整理的 hr.* 行动及审查 platform.hr.* 通过一个合同进行操作,加上键入连接器类。PeopleOS中生成的索引API一节列出每一个项目及其范围。

⚠️
人民监督办不是工资分类账、法律顾问、背景调查局或身份提供者,而是由外部认证系统负责的,绿色技术检查从未产生法律批准或提供者的证据。

获取人民OS HR

PeopleOS HR被列入企业计划。在所有其他付费计划中,它都包含一个附加:账户所有人打开 账户→自动加载( T),选择PeopleOS HR级别,或者开始免费试验,或者直接添加。在招聘、面试和AI活动方面,等级不同。价格和限额由账户确定,而不是写入产品,所以请参见当前级别的标准。 定价页面。舱面表面的模样是 PeopleOS HR产品页面.

谁能加呢

一项有效的付费计划。 免费计划不能添加,而仍在其自己的计划中的有偿计划必须等到审判结束。

自由审判

审判是在您选择的级别上进行。 当没有购买而结束时, 权利将被取消, 并且不收费。 没有删除任何内容: 记录再次出现, 附加的时刻将添加到 。

当它不是所有时

PeopleOS HR 不出现在侧边栏,命令调色板,设置或应用中的帮助中. 直接链接到一个HR页面会提供加载而不是页面.

达到一个等级上限

当达到分级限制时,页面会给出下一级。编辑或删除已经存在的东西永远不会被屏蔽。

自备装置

在驾照上加注:OpsIQ账户和安装在它的下一次许可证检查时取回它。

首周设置

下面的一切都是真实的屏幕;这里不需要开发者.

1
打开模块

打开 人民OS组织→HR 主页旗板从主开关开始, PeopleOS HR: 没有 HR 页面或员工表面无法到达。 打开开关是两击确认; 关闭一个是一击。 它下面的 AI 开关( 起草帮助、 应用程序筛选、 自动助理、 AI接见、 自动化发件、 身份验证) 将关闭, 直到您决定为止 。

2
让设置副驾驶来完成配置

打开 人民OS组织→设置副驾驶 并说出你想要的 平淡的语言: 休假政策及其天数和通知, 国家的公共假日, 案件类别及其SLA、 费用上限、 登机模板、 月脉冲。 您按其理解和假设得到计划。 在确认前, 任何工作都不会进行; 中度风险步骤需要第二个人; 每次运行都会留下收据。

3
命名员工门户

打开 人民OS组织→前线→登录设计自动安装的门户位于 /hr/<address>; 门户地址 立即重命名它,旧的登录链接继续工作,因为旧地址会向前。在云中,门户是 /hr ,您的工作空间主机,不需要地址。

4
发布您的职业网站

打开 人民OS组织→征聘。您从批准的申购单上发布的每一份公告都出现在公共职业网页上;链接 打开公共职业页面 招聘的顶端 显示了候选人所看到的

5
注册共享设备的站台

打开 人民OS组织→前线→基奥克 选择 注册一个站台。设备令牌显示一次;打开平板电脑或个人电脑上的站台页(它是 /kiosk )并粘贴。人们会用工作电子邮件和PIN,或者用门户上的短寿徽章代码来计时。取消一个亭会立刻停止设备。

6
决定员工自己能做什么

打开 设置→人力资源。每个自我服务能力(记录、请求、文件、休假、工资解释等)都设定给每个员工、管理人员或一个团队和下属团队。每一个修改记录是谁以及为什么,而你关闭的电源则向员工解释,而不是默默地缺失。

7
增加人,让他们进入

打开 人民OS组织→人员 创建个人、他们的就业和他们的经理。只有在该人拥有有效的电子邮件和预定的雇用关系时,才能提供门户访问;邀请从同一屏幕上发出,登机从你安排的旅程开始。

生命周期

规划和征聘

创建经批准的申购,发布工作,通过再清网安全网接,结构审查,安排面试,记录决定,发布报价和聘用等方式接收申请.

合并和规定

建设有证据支持的入行,收集正确的文件版本,请求设备,批准核准的访问模板,并提供无座位门户访问.

工作与成长

实行休假、时间表、薪金解释、福利、支出、目标、反馈、审查、学习、技能、内部机会、继任和员工分析。

支持和保护

提供私人人力资源支助、管理的雇员关系案件、法律搁置、数据请求、纠正、解释、上诉和独立的人文审查。

变动和离开

采用有效日期的就业变更,取消准入,回收设备,对外部提供者进行核对,适用保留并保存必要的证据.

出入和身份

语言人拥有就业记录和经核实的外部身份方面。电子邮件是可变的联系数据,绝不是永久身份密钥。Portal读取自定义;管理员和管理员的意见需要明确的许可。API在路由权限上方设置瞄准层,绝不绕过它们。

增加新工人

假设情况:
创建个人,分配就业和管理者,提供门户访问,然后打开登机行程.
怎么办:

使用干燥和自备性API。在发送访问权限前确认该人有有效的电子邮件和意向性雇用关系。

解决重复身份

假设情况:
两个外部系统对同一个工人的识别不同.
怎么办:

将两个已核实的方块连接到cononial 人并明确解决冲突。 不仅仅因为两个可变的电子邮件值匹配而合并记录 。

PeopleOS HR

人力资源工作流程和雇员门户

每个主要的PeopleOS地区如何运作,以及雇员在注册后看到什么.

人民和组织

保持警棍、就业、工人类型、经理、团队、地点、技能、文件和有效组织结构。

征聘和提议

将经批准的请购单改为张贴、申请、结构化证据、面谈、决定、提供和雇用住宿和上诉路线。

登入和文档

指定订购的主人特定步骤;收集,审查,签署,过期,持有并删除带有版本和访问证据的文件.

时间、休假和时间安排

界定政策支持的休假类型、余额、申请、核准、假日、可用性、日历活动和对账。

薪酬、福利和费用

解释工资、将核准的工人活动交给发薪部门、调节例外情况、管理福利资格和规范偿还。

业绩和增长

操作目标,登机,反馈,审查,校准,学习,技能,辅导,内部机会和接班.

人力资源服务和关系

向雇员提供私人支持,同时将冤情、纪律、举报人和密封的案件证据保留在专用许可界限内。

分析和规划

使用劳动力计量、人口统计计划、基准和经验衡量标准,绝不推断缺失的结果是成功。

雇员门户地图

概览

需要你注意,自上次访问以来的变化, 开放请求,即将到来的事件, 登入进展和公告。

简介和记录

就业、核实记录、文件、许可、隐私请求和纠正请求。

人力资源支助和任务

私人谈话、要求、需要雇员和公司自己负责的任务的行动分别列出。

你第一天就来

证据支持的入职时间与所有者, 状态,完成和被封杀的工作。

时间和离开

余额、请假申请、可用性、时间表和日历后果。

技能和成长

学习、技能证据、目标、反馈、辅导和内部机会。

我的工资,解释一下

雇员可以查阅普通语言的补偿和工资调节信息。

公司

仅限于信息同事选择的目录和组织结构图或政策允许他们分享。

权利和决定

解释、上诉、同意、纠正、查阅和删除请求。

💡
门户是移动先行的,账户卡仍然可以到达,导航和内容滚动在宽屏幕上独立地进行,移动导航覆盖而不是推取或覆盖页面. 长解说副本属于可访问的工具提示或披露组件.

安全操作程序

1
配置政策和权限

在装入活性记录之前设定管辖权,角色,批准路径,保留,同意和特征控制.

2
连接外部提供者

安装适当的签名包,输入最优资格证书并进行连接和符合性测试。

3
在沙盒或阴影中运行

使用确定性数据进行全方位工作流程,并比较预期证据后,才能使实际提供者得以执行。

4
双重控制下的释放

不同的授权审查人审查提供者、安全、隐私、法律、公平和可获取的证据。

PeopleOS HR

大赦国际、公平、录像和法律管制

PeopleOS将自动化视为一个被管理的工具路径:政策许可,企图执行,提供者结果和证明是分别的事实.

AI和代理控制

每个代理都使用注册的打字工具,其目的、权限、风险等级和最大自主性。人类接管、断路器、事件和管辖权变更会停止执行。更正可能会形成一个拟议的数据集,但在另一授权人完成隐私审查之前,不会进行任何训练。

公平性

定义组群、最低样本规则、衡量标准、评估者身份和合法发布的评价。缺失的数据仍然缺失;它永远不会转换成通行证。

解释和上诉

利用密封决定和政策证据提供解释,向独立的人类发出呼吁并保存结果证据。

管辖权

释放国政策只与一个被命名的负责任的合法所有人、引用的法律来源和通过测试进行组合。

欧盟《欧盟大赦国际法》

维护系统清点,风险等级,基本权利影响评估,通知,监事,计量和证据.

视频放映边界

规定不参与

hr.interview.room.provision 创建一个会议地点。仅此而已。 hr.interview.room.connect 媒体可以证明是员工

特定目的同意

记录、转录和生物鉴别活性是不同的选择,退出适用于选定的目的。

没有外观分析

视频合同没有关于情感,注意力,吸引力,种族,残疾或外貌推断的领域或方法.

人文和文字路线

评审员可以永久接管会场,仍可提供文本住宿途径.

保留和删除

连接器报告加密了传输,主动保留政策和提供者的媒体参考,必须支持可核查的删除.

房间已创建, AI 缺席

假设情况:
缩放室URL但媒体大桥没有向采访人员提供音频/视频。
怎么办:

显示会议内容为提供, AI 的参与为虚假。 请保留访问和文本通融路径 。

回电说支票已经通过

假设情况:
一份签名的背景检查 Webhook 报告完成.
怎么办:

将回调记录为提示, 然后查询提供者。 只有认证状态响应可以更新检查 。

🚫
技术无障碍评价可以由其评估人员记录,但世界儿童会计协会的证明要求单独一人,提供证据、法律释放和公平证据也需要其真正的名人。
PeopleOS HR

人民OS组织API和连接器开发

使用常规API为受管的人力资源业务和权威外部系统打入连接器合同。

常规API真相来源

发送JSON改为: POST /api/v1.php。发现运行中的表面 meta.actions,打开API 。 /api/v1/openapi.php邮递员 /api/v1/postman.php。以下生成的指数包含精确的被编译的数 hr.* 行动及审查 platform.hr.* 操作在此构建中, 因此此页面上的任何内容都不会用手键输入 。

列出人员
curl -sS https://your-opsiq.example/api/v1.php \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"action":"hr.people.list","page":1,"per_page":50}'
干跑写作
curl -sS https://your-opsiq.example/api/v1.php \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"action":"hr.people.create","display_name":"Ada Reaudit","primary_email":"[email protected]","worker_type":"employee","idempotency_key":"hire-2026-0042","dry_run":true}'

使用 hr.read 或 单 hr.write 。目标管理员路径仍然检查自己的权限。写入需要稳定的一等键;高风险写入需要确认。在不确定的超时后,用相同的键重试瞬态失败并查询恢复状态。

每一个被整理的hr*动作

48 curated hr.* actions (22 reads, 26 writes) and 484 reviewed platform.hr.* operations, out of 2420 named actions in this build. Generated from the action registry, the same source as meta.actions, OpenAPI and Postman.

人、组织和身份 (9)

hr.employee.provision

Write. Scope: hr.write. Provision seatless employee access and send the invitation. Required: person_uuid.

hr.employee.restore

Write. Scope: hr.write. Lift an employee access suspension (written reason required) and provision again. Required: person_uuid, reason.

hr.identity.facets

Read. Scope: hr.read. List a person's identity facets and open conflicts. Required: person_uuid.

hr.identity.link

Write. Scope: hr.write. Link an identity facet to a person. Required: person_uuid, facet_type, facet_key.

hr.org.tree

Read. Scope: hr.read. Read the organisation tree.

hr.people.create

Write. Scope: hr.write. Create an HR person. Required: display_name.

hr.people.get

Read. Scope: hr.read. Get one HR person. Required: person_uuid.

hr.people.list

Read. Scope: hr.read. List HR people.

hr.people.update

Write. Scope: hr.write. Update an HR person. Required: person_uuid, display_name, primary_email.

申购和张贴 (3)

hr.postings.list

Read. Scope: hr.read. List job postings.

hr.requisitions.create

Write. Scope: hr.write. Create a requisition. Required: title, openings, justification.

hr.requisitions.list

Read. Scope: hr.read. List requisitions.

离开、学习和连接市场 (3)

hr.learning.overview

Read. Scope: hr.read. Read courses, paths and enrolments.

hr.leave.overview

Read. Scope: hr.read. Read leave types and requests.

hr.marketplace.overview

Read. Scope: hr.read. Read HR connector accounts, conflicts and deliveries.

连接器认证和健康 (2)

hr.connectors.certify

Write. Scope: hr.write. Certify an HR connector (scope sandbox|production; production demands provider-side proof under dual control). Required: connector_class, connector_key, scope, evidence, submitted_by.

hr.connectors.health

Read. Scope: hr.read. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog. Required: account_uuid.

面谈室 (7)

hr.booking.slots_reconcile

Write. Scope: hr.write. Release booking slots whose claim never became a booked meeting.

hr.interview.room.connect

Write. Scope: hr.write. Connect the AI to interview media; refuses unless media really reaches the worker. Required: media_uuid.

hr.interview.room.consent

Write. Scope: hr.write. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription). Required: media_uuid, purpose, state.

hr.interview.room.pause

Write. Scope: hr.write. Pause a live interview. Required: media_uuid.

hr.interview.room.provision

Write. Scope: hr.write. Provision an interview room (a place to meet — NOT AI participation). Required: session_uuid, transport, accommodation_route.

hr.interview.room.state

Read. Scope: hr.read. Read an interview room, including whether the AI is actually participating. Required: media_uuid.

hr.interview.room.takeover

Write. Scope: hr.write. A human takes the interview; the AI cannot speak in it again. Required: media_uuid, reason.

代理人和生命周期通道 (7)

hr.agent.incident.close

Write. Scope: hr.write. Close an agent incident — the same act that lifts the suspension it caused. Required: incident_uuid, resolution.

hr.agent.step

Write. Scope: hr.write. Run one agent step: gate verdict, execution and outcome reported separately. Required: run_uuid, agent_key, tool_key, jurisdiction, purpose.

hr.agent.step.status

Read. Scope: hr.read. What actually happened at a step (permitted, executed, proven, failed, compensated). Required: run_uuid, seq.

hr.agent.takeover

Write. Scope: hr.write. A human takes an agent run; no further agent steps are accepted. Required: run_uuid.

hr.agent.tool.grant

Write. Scope: hr.write. Grant an agent a tool for one jurisdiction and purpose, up to a risk ceiling. Required: agent_key, tool_key, jurisdiction, max_risk, purpose.

hr.agent.tools

Read. Scope: hr.read. List the registered typed tools an agent may use, and open agent incidents.

hr.lifecycle.lanes

Read. Scope: hr.read. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it.

管辖权 (5)

hr.jurisdiction.capabilities

Read. Scope: hr.read. What this product may do in one country, per feature, with the law behind each answer. Required: code.

hr.jurisdiction.change.raise

Write. Scope: hr.write. Report a change in the law; a high or critical one suspends every lane in that jurisdiction at once. Required: pack_key, summary, severity.

hr.jurisdiction.coverage

Read. Scope: hr.read. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests.

hr.jurisdiction.explain

Read. Scope: hr.read. Why an action about one person is allowed, reduced or blocked, with the rule and citation. Required: person_uuid, feature.

hr.jurisdiction.pack.release

Write. Scope: hr.write. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law. Required: release_uuid.

裁定和上诉 (2)

hr.decisions.appeals

Write. Scope: hr.write. File an appeal against an AI decision on a person's behalf; it must be heard by an independent human. Required: decision_uuid, subject_type, subject_id, grounds.

hr.decisions.explanation

Read. Scope: hr.read. Plain-language explanation of one AI decision: what was looked at, which policy, and how to appeal. Required: decision_uuid, audience.

AI 质量 (2)

hr.ai.corrections

Write. Scope: hr.write. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing.

hr.ai.quality.overview

Read. Scope: hr.read. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception.

劳动力对话与保留 (4)

hr.thread.delete

Write. Scope: hr.write. Delete a workforce conversation; refused while it is under legal hold. Required: thread_uuid, reason.

hr.thread.legal_hold

Write. Scope: hr.write. Place or lift a legal hold on a workforce conversation. Required: thread_uuid, on, reason.

hr.thread.retention

Write. Scope: hr.write. Set a conversation's retention class (standard|extended|permanent). Required: thread_uuid, retention_class.

hr.threads.retention_sweep

Write. Scope: hr.write. Run the conversation retention sweep; legal holds are never swept.

准备和释放 (4)

hr.experience.metrics

Read. Scope: hr.read. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys.

hr.global.readiness

Read. Scope: hr.read. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage.

hr.readiness.read

Read. Scope: hr.read. Run the HR release readiness report.

hr.release.verify

Write. Scope: hr.write. Run the four HR release gates (schema, manifest, probe, readiness).

连接类

征聘

hr_job_board, hr_background_check, hr_identity_verification, hr_assessment 财务报告和已审计财务报表 hr_tax_right_to_work.

雇用和上岗

hr_esignature, hr_calendar, hr_video 财务报告和已审计财务报表 hr_equipment_it.

劳动力业务

hr_payroll, hr_benefits, hr_learning, hr_expense_payment, hr_directory 财务报告和已审计财务报表 hr_data_warehouse.

通讯

hr_messaging 合同中没有包含员工信息读取方法。

提供商网关终点

PeopleOS 人力资源提供者网关1.0
GET    /v1/hr/health
POST   /v1/hr/job-postings
PATCH  /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/job-postings/{provider_ref}/close
GET    /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/background-checks
GET    /v1/hr/background-checks/{provider_ref}
POST   /v1/hr/identity-verifications
GET    /v1/hr/identity-verifications/{provider_ref}
DELETE /v1/hr/identity-subjects/{subject_ref}
POST   /v1/hr/payroll/worker-events
GET    /v1/hr/payroll/state?cursor=...
GET    /v1/hr/payroll/exceptions
POST   /v1/hr/equipment/requests
POST   /v1/hr/access/requests
GET    /v1/hr/provisioning/requests/{request_ref}
POST   /v1/hr/provisioning/requests/{request_ref}/revoke

网关需要 HTTPS, 屏蔽不安全/ 私人目标, 验证出针DNS结果,不跟踪方向,限制响应大小,需要JSON,带有决定性的一能性,并支持时间标记HMAC。Webhooks总是提示,然后提供商会重新点火。

入网接门

3个公用门接收供应商回调: POST /opsiq/ajax_api.php?ajax=hr_connector_webhook (外地) connector_class, connector_key, topic), ?ajax=hr_esign_webhook (connector_key, offer_uuid, provider_ref?ajax=hr_check_webhook (check_uuid) 每一个通过认证连接器验证身体,烧掉交付,使回放死亡,只记录待处理的再静音;提供者自己的答案会改变记录。每次拒绝都是相同的通用答案。今天,PeopleOS不会提供出局的网络呼克事件: webhooks.events.list 是否为权威和名称, hr 家人,所以调查 hr.* 读取或使用 hr.connectors.health.

详细参考文献

完成 PeopleOS 手册

读取 doc/contracts/PEOPLEOS_HR.md 每个操作员在自营的装置中,API,连接器,webhook和发布规则。

网关开发者合同

市场包中包含 README.md, DEVELOPER.md, connector_contract.json, hr_profile.json 和一份签名的文件清单。

PeopleOS HR

测试和生产准备

发射要求是根据证据计算的,包装准备、供应商认证、法律批准、公平评价和无障碍证明是故意分开的。

1
验证代码和合同

运行 PHP 语法、 HR PHp Unit, 路由/API等价, OpenAPI/邮递检查, 软件包清单和JSONSchema 验证.

2
工作流程全数

试招,AI审查,面试/视频,上岗,签名,休假,工资单,出入口,通知,模式和连接器故障路径.

3
测试响应性和无障碍UI

驱动桌面,平板电脑和电话布局;键盘,焦点,标签,对比,回流,工具提示,对话框,通知卷轴和独立导航.

4
收集外部证据

使用真正的提供者圆通和删除,法律政策发布,代表性的公平数据以及独立的人类WCAG证明.

5
双重控制下的释放

与提交者不同的审查者批准连接器并释放证据。如果连接器证明过期,则撤销或关闭连接器。

每一个结果意味着什么

签名的软件包

自授权的软件包签名后文件没有改变。 它不能证明第三方账户的工程 。

沙盒通过

行为决定和状态过渡一致。它不能证明是真正的提供者、居住期限或删除。

生产连接器认证

具体的工作场所账户在双重控制下通过了提供方的五项义务。

技术咨询小组报告

已命名表面存在自动和评估人牵头的证据,不是第二人称证明。

发射准备就绪

所有所需大门同时为绿色,没有证据过期、被撤销、丢失或与实际健康相矛盾。

⚠️
绝不为了清关而建立经过的法律、公平、提供者或独立证明记录。 记录阻断者和所有者。 准备状态的视角之所以有价值,正是因为它拒绝无根据的索偿。
为何安装了连接器, 但仍未提供?+

安装可以证明软件包的存在。 启用它, 保存真正的最小值证书, 通过连接测试, 然后使用真实提供者证据和不同的审查者授予匹配的 PeopleOS 账户生产范围 。

为什么网友不改变记录?+

回调可能有效, 但只是提示。 请检查webhook 收件箱、 提供者状态终点和校正结果。 PeopleOS 仅在重新平息后更改权威状态 。

完整的机器可读HR在哪里?API?+

调用元动和过滤器,用于hr.和平台.hr;或/api/v1/openapi.php财务报告和已审计财务报表/api/v1/postman.php.它们是从同一个运行时间登记册生成的。

支助

帮助中心

您的帮助中心是一个自服务器的帮助网站, 由您发布的文章构建。 客户可以在自己的公共页面上阅读和搜索它, 在聊天部件内, 这样他们就可以在打开谈话之前自己找到答案。 它中的所有内容都来自您的知识库, 所以同样的内容可以证明您的AI也赋予您公共帮助的权力 。

顾客们看到的地方

其自己的公开页面

一个干净、可搜索的帮助网站 /help.php客户按类别浏览、搜索和打开任何文章。您可以给它自己的名字和风格 。

聊天部件内

聊天部件中的帮助链接, 这样客户可以搜索您的文章而不离开聊天。 如果他们还需要一个人, 他们就是一个启动谈话的录音机 。

打开它

1
打开帮助中心页面

转到 Config, then Help Center 在您的管理员中打开 启用公共帮助中心.

2
给它一个名字和看看

设置 HelpCenter 名称,该名称在页眉和浏览器标签中显示,并选择视觉样式。您可以关闭顶端导航,以获取一个没有菜单的干净页面。

3
发表一些文章

下一部分会说明如何进行

向帮助中心发布文章

文章在您的知识库中存在。一旦发表并标出公众名,一篇文章就会出现在帮助中心。有几种方法可以做到:

发表一篇文章

打开文章,标记所发表的文章,并打开选项在帮助中心显示.

立刻公布一切

使用该 全部发布 按钮将您发布的全部设定按下一击键,而不是一次一次执行。

将 FAQs 变成文章

已经有FAQs了? 使用 发布全部帮助 把它们变成帮助文章 让他们坐在其他东西旁边

导入现有知识库

从另一个服务台搬来? 导入 KB 按钮。您有三种方法可以指向您的内容 :

粘贴 a URL

给出您当前帮助中心的地址。 如果它能识别平台( 例如 Zendesk) , 它会读取该平台的精确分类树。 否则它会爬入网站并重建页面的结构, 只导入真实文章并跳过登录、 定价和联系页 。

选择一个连接的应用程序

如果一个平台已经连接到这个工作空间,并且拥有知识库,它就会在下方的下方出现 从连接的应用程序导入。选择并导入,否 URL 或密码。应用程序只有在连接和设置后才会被列出。

上传 a CSV

没有现场站点可以指向吗? 上传电子表格 title, category,以及 body 列。请输入 Parent / Child 中,在“类别”栏中,构建嵌入式类别。

无论你选择哪一种方式,你都会得到一个 预览: 它找到的文章, 按类别分组, 每篇文章都有一个复选框, 这样您就可以放下任何您不想的。 在单击导入前, 任何内容都不会被保存。 之后您可以 撤销 单击后整个导入,或 重同步( S) a/ 数据为: URL 或 连接应用程序导入到后端以拉出新和已修改的文章。

💡
开发者:任何连接者都可以通过声明一个来为它的知识库发布广告,以达到这个下拉速度 kb_capabilities 块中 settings.json (类型) kb_source,带有 adapter 和a 数据 base_template),参见"连接器"部分和"平台-连接器参考".

与大赦国际一起组织

干净的帮助中心很容易浏览,也更容易搜索。 与大赦国际一起组织 按钮为您进行清理。单击一次,它读取您已发布的文章,将其排序为明智的分类,并添加标签。当需要时,它会创建一个分类,重新使用已经匹配的分类并跳过任何您已经组织的东西,这样您可以每次添加新文章时,都会再次运行。打开 让 AI 组织到子类 在帮助中心设置中,它也可以在嵌入下文件文章 Parent / Child 分类,在输入有分节的知识库后便变得方便。

💡
分类可以给客户一种浏览方式, 标记会使在公共页面和部件中搜索更加清晰。 您可以在之后重命名或移动一些东西。 AI会给你一个强大的起点, 不是你所粘住的设置 。

您聊天部件中的帮助中心

您可以在聊天部件内显示帮助中心, 这样人们在给您发信息前会先搜索答案。 在聊天部件设置中, 请选择帮助链接的显示位置 :

头部

部件顶端的小型帮助图标 。

在底部 , 下边

信息框下的一个文本链接,例如“浏览帮助中心”。您可以修改措辞。

两个地方

以头和下为最能见度.

帮助链接在部件外观设置下有自己的颜色控制。 请打开它 或选择一个 实心 颜色或一个 渐变整个帮助体验都遵循了您的部件主题,所以它总是看起来像你的品牌的一部分.

将您的帮助中心设置在自己的网页地址上

出框时,您的帮助中心已经拥有了它自己的干净、可共享的地址(例如 /help/your-help-center你可以再往前一步,在你的下边服务 拥有域,所以顾客和搜索引擎 把它作为你的品牌的一部分,例如 yourdomain.com/help 或 单 help.yourdomain.com。所有东西都在您的域名上工作:链接、图像、搜索和文章收视率。

在你主站台下方

单位 配置, 然后是帮助中心打开 嵌入 选项卡并查找“在您自己的网页地址上显示您的帮助中心”。Cloudflare, Nginx 或 Apache),复制现成块并粘贴到您的站点。每个选项都有一个 设置指南 按钮旁边有精确的台阶。

在一个子域上

偏好 help.yourdomain.com相同的面板有一个子域选项。Cloudflare 一个子域是最可靠的路径, 它给你一个干净的地址 之后什么都没有。

💡
使用 Cloudflare 它只运行它的工人在一个地址上,通过 Cloudflare(橙色云). 您的主域经常直接指向您的网站, 因此放置在主域上的一条规则可以悄悄地无所事事。 可靠的方式是一个代理子域, 如 help.yourdomain.com设定指南会带您穿过其中的一条 DNS 记录和路线。
不错SEO。一旦您的帮助中心位于您自己的域名上,搜索引擎会将您的文章索引在您的品牌下。每页都会声明其正确的地址,网站地图会列出它们,所以同一篇文章从不会两次索引。
💡
使用 Widget 帮助链接吗 ? 在聊天部件的“ 在帮助中心打开” 设置中设置 链接到哪里 改为 您的帮助中心域 并输入同一地址。然后这些文章也会在您的域名上打开,而不是在 OpsIQ 地址,请问...

看看你们整个帮助中心都怎么样

除了单条票,帮助中心有自己的 分析。在帮助中心设置中打开它,它悄悄地记录人们如何使用你的帮助:最受欢迎的文章、他们搜索的内容以及空出回来的搜索(一个现成的可写入列表),自行制定访问国和设备,因此不需要安装的聊天部件来报告。每个数字都显示为 两者 设置您的帮助, 公开页面和窗口帮助,以及组合, 这样您就可以看到每个都实际使用多少 。

💡
解析器在开机前不要动 你可以有访客 IP 地址匿名化。在选择加入前,没有记录任何地址。

选择页面每一部分显示的内容

帮助中心每个部分(主页上的类别、通俗文章、分类页上的文章列表和更多)都有自己的简单规则。对于每个部分,您可以显示或隐藏,并显示 全部 项 目a 设置编号,该 最新消息或只有你一个人 特性 当规则封了一个列表时,客户仍然会得到一个“显示所有”链接,所以没有什么是真正无法到达的。

也决定了助选的模样: 隐藏,友好的比例像"12 联 合 国 14 找到这个帮助,或者简单的拇指算数。一个最小的选票设置会停止一个全新的文章,显示一个尴尬的“0调出0".

查看哪些文章有效

每篇文章都显示 有用吗? 提示。每篇是或不是都算在内, 这样您就可以一看哪篇文章回答得很清楚, 哪些文章需要重写。 同一访客的重复投票被忽略, 所以数数是诚实的 。

文字和标签

您可以修改帮助中心的标题和标签, 以匹配您的语音。 保留任何字段的空白, 并返回到一个合理的默认状态, 所以您只编辑您想要修改的措辞 。

帮助中心与你的AI共享一个库. 你在这里发表的每篇文章都与AI用来回答聊天和门票的内容相同,因此改进了其中之一,改进了另一条.

共同问题

我是否需要为帮助中心写单独的内容?+

不,它来自AI已经使用过的同一份知识库文章,一次发表一篇文章,可以同时为两者服务。

我能把一些文章留在内部吗?+

是的,只有你发表和标注公众的文章才会出现在帮助中心,任何未公布的都不要发表。

顾客还能联系到一个人吗?+

是的,帮助链接的部件会从开始对话中 被一个窃听器所包围 所以自控不会困住任何人

增长 & SEO

站点情报(SEO套件)

现场情报是 OpsIQ'是内置的 SEO 和搜索可见套件。 它将您的网站爬入一个搜索引擎, 跟踪您排行, 研究关键词、 监视回链接和竞争者, 扫描您的本地地图存在, 检查页面速度, 并将其全部转换成客户准备的报告, 由 AI 分析器解释要修复哪些内容并起草修正。 这是一个溢价特性; 当启用时它会出现在侧边栏中的 Site Intelligence 。 每个域的数据都会分开、 爬行、 排名和报告, 永远不会在域中混合 。

站点情报
站点情报仪表板一个SEO仪表板显示一个站点健康分数,关键词排行追踪和流量趋势.站点情报yoursite.com86卫生3重大问题关键词等级跟踪AI 服务台#3现场聊天#7机构津贴#12有机点击1克拉维尔发现技术问题2TRACK 目标排名、关键词、后联线3分析解释和草案修正
"站点情报综述":从最新爬行,活的关键词排位跟踪,有机点击趋势获得站点健康分数,并有"三步回路:爬行","跑道",让AI起草修复.

获取站点情报

现场情报是计划的一部分,在计划上,它的工作原理与PeopleOS HR完全相同:账户所有者打开 账户→自动加载( T),选择一个站点智能级并开始免费审判或直接添加。自由计划,或者仍在自己的计划试验中付费的计划,不能添加。直到它被拥有,套房从侧边栏被隐藏,直接链接提供附加;当达到一个站位上限时,页上提供了下一层;当没有购买的试验结束时,取消权利,不收取任何费用。 定价页面.

运行一个爬行... 从这里开始

一个爬行是 OpsIQ 浏览您的页面, 搜索引擎的方式, 寻找技术问题: 断开的链接、 缺少的标题、 内容稀疏、 页面缓慢、 索引问题。

1
开始爬行

在"概览"上,点击开始爬行. OpsIQ 排队,并在背景中的页面中工作;状态指示器显示进度。

2
阅读报告

完成后, 打开议题和页面列表。 每个议题都按严重程度分组, 这样您就能先解决最大的赢家 。

3
让人工智能帮忙

AI分析师制作一个简单语言的简况,说明什么是错的,为什么它很重要,并且可以在申请前生成你审查的建议的修补.

何为站点情报跟踪

树丛和遗址保健

扫描您的页面以获取技术SEO发布并列出每一页及其问题。随时重运行或安排。

等级跟踪

添加您所关心的关键词; OpsIQ 检查您所在的站点位置,并跟踪移动时间。

关键词研究

发现要瞄准的新关键字创意,由AI关键字导师帮助优先排序.

后链接

查看谁链接您, 刷新列表, 并拒绝您想要与您的网站连接的链接 。

竞争者

添加相竞域, 比较您的能见度与它们的, 并进行AI相竞分析 。

本地( 映射) 网格

扫描整个地理网格的本地列表能见度,看看地图上显示的地址,加上Google Business Profile工具.

页速

运行页面速度检查,以便您能够修复会伤害排名和转换的慢页.

AI 内容

生成内容简介和草稿, 目标为您所选择的关键词 。

报告

建立可打印的,客户准备好的报告上面所有的东西。

连接谷歌以获取准确数据

两个Google连接器将估计转换成真实的数字:

谷歌搜索控制台

搜索

提取准确的查询,点击并印象出您的网站的Google报告,映射您的地产,以及直接从Gooogle自己的数据中获取的地表排名机会.

Google Analytics 4

交通

把你的流量和接触数据 与你的SEO数据, 所以报告显示的能见度和行为在一起。

计划更新白标签报告( W)

不需要用手操作所有设备。排行榜的刷新程序包括:再运行爬行、排位检查、关键词检查、回路刷新、局部网格扫描和在节拍上报告生成(根据计划和音量而定,每天或每周)。这些系统通过运行到OpsIQcron, 参见 Cron 和自动化部分。生成的导出报告为可打印、可供客户使用的文件: 各机构向每个客户发送一个常规文件SEO更新,并且因为每个域的数据都是独立的,所以每个客户端只能看到自己的.

一些网站智能功能呼叫外部数据提供者和AI通过 OpsIQ 已配置的提供者。 当套件被启用时, 它们会工作到框外。 如果刷新未运行, 请确认 OpsIQ cron 正在运行(参见 Cron和自动化).
我需要在网站上加点什么吗 用于SEO追踪+

抓取、排位跟踪、关键词研究和回路工作,但不会触碰您的网站。对于流量和精确的搜索数据,请连接Google搜索控制台和GA4。

我能追踪到不止一个域吗?+

是的,将每个域分别添加;它们的爬行、排名和报告完全相互隔离。

我该爬多久一次?+

每周为大多数网站提供大量服务; 在内容或结构变化后按需爬行。 请设定一个日程, 这样您就不会忘记 。

增长 & SEO

自动安装( SEO 代理)

自动执行是网站智能中实际应用修正爬行和AI分析师推荐的部分,而不是仅仅建议您。代理严格按照网站智能已经发现的(它永远无法发明变化)进行工作,并走过每个固定的安全循环:一个干跑预览,你的每步批准,活写,自动快照,以及一个证明打开问题计数下降的再活化。这是一个只管理AI功能;它在网站智能部分内显示为自动插入(火箭)动作,直到您打开它为止。

自动执行
自动执行SEO代理商显示推荐的 SEO 修正通过预览,批准和活写来移动,并带有可证明的再缩写.自动执行yoursite.com建议的赔偿额Add missing <title>核定数修复机器人. txt核定数提交站点地图。xml审查德里-伦先锋(争议)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>核准跳过证明它 - 重新狂欢二. 未决问题 124已保存的快照1序言每个固定器的干燥驱动器2采用和修改SSH 或主办 API3推进和滚动重画相加快照
会话运行方式: 代理列出已推荐的修补站点智能, 显示每个站点的干燥 diff, 应用您批准的 dift SSH 或东道主 API,在每次写前都会有快照,然后重新缩放以证明打开的问题计数已放弃。

改变的是什么

代理只应用过Site Intelligence(或AI分析师)已经推荐的对该域的修饰。

服务器配置

网站地图。xml,机器人.txt,并重定向,可读和头规则在.htaccess(Apache / LiteSpeed)或nginx配置中.

重定向链

折叠多跳的链条向下移动到单跳直接到决赛 URL,在同一管理下的.htaccess块内,所以速度和链接值停止通过额外的跳出.

Page <head>

缺少或弱的页面标题,元描述,犬目标记和结构化-数据(schema)块.

WordPress SEO

通过WP-CLI应用的 Yast, Rank Math和SEOPress 标题 & meta,以及图像替代文本 SSH 路径或 REST API 在主机路径上。

WordPress 结构化数据

添加数 JSON-LD (schema) 到缺少的页。SSH 路径一个小的有管理的帮助器(一个必须使用的插件)打印标记,这样它就可以使用或没有SEO插件;在主机路径上,您的SEOC插件可以携带它。

内部链接

在现有内部添加一个相关的内部链接 WordPress 内容以拯救孤页并连接相关帖子。每页一个链接,从不包含标题、现有链接或短码,并且总是由您先批准。

页面内容重写

起草薄页的完整替换内容( 打开一个 craw 选项, 见下文) 。 每一份草案在任何文件发布前都会经过您审核和批准, 并且保留旧的内容以便恢复 。

页面缓存( E)WordPress)

当爬行发现速度问题并安装了插件时,打开 W3 总缓存页面缓存, 所以页面服务更快 。

Shopify SEO

产品和收藏 SEO 标题和说明,页面和博客文章 SEU, + 301 重新定向,通过 Shopify 管理员 API.

Webflow SEO

每页SEO标题和元描述通过 Webflow 数据 API 2. 关于《公约》第1条和第3条的规定

自动准备修正( 两个爬行选项)

用于域( 其 craw settings) 的 Site Intelligence 配置面板有两个选项, 可以决定代理线条在时间之前为您排出多少。 两者默认关闭, 并且都使用 AI 信用, 所以只有当您想要完成此任务时才会切换 。

每次爬行后自动预置AI修复

每个爬行也会为它找到的东西写出混凝土固定内容(标题,元描述,备选案文,计划,重定向),因此,这些固定可以随时审查和应用爬行完成的瞬间,而不是在以后提出要求时生成。每次爬行都使用AI信用.

AI 内容重写( 分页)

代理可以为薄页起草全部替换内容。 任何内容都不会单独发布: 每张草稿都作为修改内容同时出现, 并同时审核, 批准或拒绝, 保留之前的内容使其可逆转, 并且每张通行证只限几页。 使用 AI 信用 。

💡
两种选择都只准备和起草工作。 每一次修改仍然经过着与其他固定方法相同的逐步批准、快照和回滚,因此,开启它们就永远不会让任何东西单独存在。

两种方式连接

SSH / SFTP 路径

自我管理

对于您自己的服务器上的站点, 代理连接到 SSH/SFTP 使用您存储的证书,直接编辑服务器配置和页面文件,并运行WP-CLI WordPress。当您有 shell 访问并想要对文件进行全面控制时,最好。

主机 -API 路径( 无) SSH)

无外壳

对于不允许的平台 SSH 特工完全通过官员工作 API 连接器, WordPress (REST + 应用程序密码), Webflow (数据 API(v2)和(c) Shopify (编)API。主机上没有安装任何设备。

💡
Wix 和 Squarespace 没有公开的 SEO 写字 API,因此在这些平台上,“自动执行”以咨询模式运行:它显示您要手动应用的确切更改(精确的标题、元或设置)。其他的都是只读的和安全的。

打开连接器

代理通过连接器到达每个平台:

内建

Shopify 财务报告和已审计财务报表 WordPress 连接船与 OpsIQ,只需在连接器下启用它们,并添加商店/站点证书.

从市场

Webflow,Wix和Squarespace从Connectors → Complateplace安装,然后以同样的方式连接.

会话运行方式

1
选择修正

开放自动执行(Rocket)来自站点情报科,它列出了已经发现的可以在此域上解决的问题.

2
预览每个更改

每一次修复,代理都显示一个干燥的diff(确切地说它会写什么),然后才触摸现场。

3
逐步核准

您批准( 或跳过) 每项更改。 没有您明确要求该步骤, 任何更改都不会被应用 。

4
写,然后是快照

经批准后,代理商将现场更改 SSH 或主机 API 并首先保存快照,因此任何更改都可以回滚.

5
证明一下,活下来

执行每个更改时,代理立即重新检查准确的页面,并显示每一步“固定活”的判断,因此您会看到现场页面上的每个固定地块。最后它会重新绘制整个站点,确认空出问题数。

安全收费( B)

SEO- 仅此而已

代理只能执行 Site Intelligence 建议的该域。 它不能任意更改您的站点或服务器 。

逐步核准

每个写入都预览为diff,并且只有在您批准该特定步骤后才应用.

抓图回滚( R)

每次写前都会保存快照,因此任何更改都可以被还原.

每步活度证明

每个被更改的页面在写成的瞬间会重新检查,并获得一个"固定活"的判决,因此一个固定在直播页面上立即确认,而不只是在收尾再爬行中.

内容从不自动发布

内部链接和薄页内容重写影响较大,所以总是向您展示,供您批准,并且从未自动应用,无论您运行何种模式.

仅管理AI

Auto-Implement 运行在管理型AI上;当一个工作空间正在使用自己的(BYOK 钥匙。

计费

AI的指代费通常在您使用时使用,每自动安装会话加一平方元每用费,两者都取自同名管理-AI的入息.

自动导入默认关闭。 在 AI 配置页面( 自动插入卡) 上启用, 并确保您的平台的连接器先连接 。
事情没有问题就变了吗?+

否。 每一次更改都预览为干燥的 diff, 并且只有在您批准该精确步骤后才应用。 每次写入前都会保存一个快照, 这样您就可以滚回 。

我需要吗? SSH 进入?+

还没上 WordPress, Shopify 或 为 Webflow. 这些工作通过其官员 APIs 并且没有外壳进入。SSH 仅仅是两个路径之一,当您希望代理直接编辑您自己的服务器上的服务器配置和文件时使用。

我怎么知道这能奏效?+

应用所批准的修补后,代理重新绘制站点,并显示前后的开出问题计数,这样您就可以确认修补减少的问题.

它会自己重写或发布页面内容吗?+

不,AI内容重写在您打开爬行选项之前关闭,每通通行证限为几页薄,每张草稿在任何出版物发布前都会被显示给您,供边背边审批。之前的内容保存下来,所以重写总是可以回放的.

我能用我自己的人工智能钥匙吗?+

编号:Auto-Implement 仅管理-AI并被屏蔽在下 BYOK 它通常从AI管理贷款中为每期支付一笔固定的人均使用费。

增长和参与

调查工作室

调查工作室是创建可编辑调查的工作空间,这些调查可以作为丰富的独立页面、网站部件或内嵌式模块提供。当前产品还提供了主机链接、签名预览草稿、私人邀请、QR共享、响应浏览和调查范围分析。网站部件是一个交付选择;它不是调查的定义。

⚠️
当前与目标边界: 创建和预览体验,连接器构建器 survey 测量工作室仍然需要独立的多部署结构、签名式测量身份网关、目标/可变接线,CRM外联发送流量和输入 surveys.* API.

创建调查

1
选择人们如何接受

当前的向导提供独立的页面和链接、 Website 部件和内嵌。 批准的目标流量始于调查类型, 之后会添加 CRM 电子邮件、 私密链接和 QR 部署作为头等舱选择 。

2
选择目的

选择NPS, CSAT,CES,产品反馈,后购,取消,入职,网站,活动,网信,支持,主/解,试,证,研究,员工,收录或一般反馈.

3
使用完整的模板或开始空白

当前目录有可编辑的起始器, 并按目的分组。 选择模板创建复制的草稿: 更改您的调查不会改变起始器或另一个调查 。

4
自定义或快速审查

自定义打开每个问题、设计、行为和交付控制。快速审查会在客户-视图最终检查时打开同样的草稿。没有自动发布或发送。

交付选择和现相行为

独立的页面链接( L)

一个有自己品牌的响应性页面 URL。当每个收件人需要控制链接时,使用私人邀请并到期。在此主机体验中,QR共享点。

网站部件

迁移后遗留通道。 它可以使用页面、 地理、 设备、 访问者、 日期、 采样、 冷却、 参观和配额规则, 在部署架构建设时仍然有遗留的活化- 移动桥支持 。

内嵌

位于页面、门户、产品或帮助中心的响应性调查,不需要促进工作室。

电子邮件

今天,工作室可以生成邀请HTML和私人链接。端到端发送从CRM经同意、压制、排期、重试和反应关联的联络人/联系人是经核准的CRM外联一体化目标。

企业设计和预览

调查页面有调查拥有的主题和页面显示的家族,响应控制,欢迎和完成副本,以及签名的预览草稿。设计者预览预览在编辑器下方是全宽的,而不是一窄的侧式铁路。它使用沙盒框中真实主机运行的时间,并支持桌面,平板电脑和电话宽度;预览流量不会写出回复或分析.

💡
调查工作室独立于促进工作室。运行时间目标、身份、资产、渲染和分析必须属于调查所有。只有明确一次性复制/进口,从而产生独立的调查数据,才能重新使用宣传内容;以后的促进编辑不得有任何效果。

完整的形式产品

独立部署

现场直播

一次调查可以有单独的版本页面,部件,嵌入,CRM电子邮件、私人链接和 QR 部署,每个配置都有自己的状态、设计、受众和分析。每次调查都可以暂停、禁用或删除。

CRM外联和宣传活动

现场直播

建立来自CRM段和可勘测连接器,将其冻结为不可变的版本,各发出一份签名邀请函,并通过贴有标签的外延电子邮件连接器发送每封邀请函的传送证明。

外地工具包和验证

现场直播

幻灯片、图像选择、文件上传、签名、地址、电话、标题和丰富文本,有分钟/最大长度、电子邮件/URL/ 数字预设、 自定义错误文本和每问题预填 URL 参数。

逻辑、公式、结果

现场直播

和/或条件组,分支规则,一个安全公式引擎凌驾于答案之上,以及带着自己结果页的分数带:一个得分的测验会在其判断上着陆.

语言、亭和预填

现场直播

访问者语言下放只列出有真实翻译,共享平板电脑的站点模式(bigger目标,自动重置,不重定向),预填链接构建器,以及可编辑的安全-护栏和页脚文本等语言.

A/B版本测试

现场直播

发布一个挑战者版本,任何部署时都会有流量分割。访问者会被粘住,回复会被印在实际服务版本上,比较表显示每个版本的响应、完成和平均分数。点击一次即可提升胜者。

每周文摘

现场直播

每周发一封邮件,带上一封7日调查,最繁忙的调查,反馈脉冲和最新AI简报,通过被绑定的外出连接器发送. 配置到自动传送中心.

治理

现场直播

调查访问列表限制谁可以编辑,发布或删除调查. 出版批准(four-eyes)需要第二个管理员发布确切的草稿; 编辑重新发送批准内容. 草案共享链接让审查者在不登录的情况下看到真实的草稿.

开发者平台

现场直播

连接器合同 2.2,输入调查* 和反馈* api/v1,犬科调查. *事件,持久地签有"Slack"和"Google Sheets"中继格式的网络呼号,以及单回音 PDF 输出。

增长和参与

分析和反馈是不同的产品

调查分析解释调查本身如何深入人们,并表现。反馈解释了客户对所有允许来源的看法以及企业对此应做什么。 两种产品相互连接,但并不分享或覆盖分析的真相。

调查分析

由调查工作室的个人调查而不是从全球侧导航输入,它测量合格、暴露、触发行为、开始、完成、放弃、提问和分机摩擦、时间安排、部署/运动/转换结果以及运行时间可靠性。

反馈概览和收件箱

一份许可时间顺序反馈,供填写完毕的调查表答复、遗留部件反馈、聊天和票务CSAT、票务回复反馈、客户AI-答题评分、知识基础的助选票和核准的外部/海关来源使用。

反馈分析

分析客户意义:原始指标趋势、主题/话题、情绪、情感、意图、紧迫性、请求、投诉、赞扬、旅程/产品/服务/团队细分、批评者和闭环结果。

数据所有权

调查答复在调查存储中仍然具有权威性,反馈储存了可重建的源参考和所生成的信号,然后随需要加载允许的证据,一个已完成的调查答复最多就成了一个反馈项目。

⚠️
当前的反馈页面仍然有一个调查响应浏览器和一个单独的遗留部件收件箱,其AI总计尚未使用完全的正版源模型. Overview / Inbox / Analytics / source & hocific 设计是执行目标.

NPS, CSAT, CES, 恒星, 拇指和帮助必须始终保留其原始方法、 尺度、 样本、 日期窗口和分母。 绝不能将它们合并为一个无法解释的平均值 。

增长 & SEO

推广工作室

升级工作室将您的网站转换为转换引擎。 设计弹出、 横幅、 滑入、 上下行条、 全屏接管、 内置块甚至基于国家的重定向, 然后在正确的时间向正确的访问者显示正确的信息 。OpsIQ 部件已经在您的网站上了, 所以没有额外安装。 您会设计并保存运动; 它们只会在您发布后显示, 而工作室会被打开用于您的工作空间 。

推广工作室
推广工作室设计员视觉运动设计师有块调色板,画布上弹出并有目标面板.推广工作室 - 设计师x欢迎 {first_name}!获取 15% 你第一次点菜的时候SAVE15申请我的优惠券目标国家美国,加利福尼亚州触发退出意图A/B 拆分( 分期)50 / 50出版1设计将块拖入画布2目标国家、网页、受众3MEASURE 音乐A/B 胜者+AI 洞察力
外观设计师:左边是块调色板,画布上有你的竞选活动(这里有一个个性化的优惠券,使用 {first_name}),和右侧的目标+发布面板.

大局图

运动

或

一项推广:一弹出,横幅,栏杆,滑入,全屏,内线块或地心定向等,每个都有一个目标:销售,领跑,报名,聊天,调查,公告.

设计版本( V)

怎样

在视觉编辑器中构建外观。 每一份保存都创建出一个新的版本, 这样你就可以总是回滚。 任何东西都不会丢失 。

目标

是谁看见的: 国家、页面、设备、交通源头、返回对新、时间表和(带有连接器)登录客户。

触发器

何时

当出现时:即刻,在延迟,滚动,出站提示,闲置时,点击后,N页后,或从聊天/票务活动.

分析

结果

活取印象,点击通路,转换通路等,放出漏斗,国别/页面/设备分拆出,A/B取胜和AI透视.

首次升职5步骤

1
从模板或空白开始

开放促销工作室并点击新活动,或从模板展出室中选择现成的设计,在设计者中打开草稿.

2
设计它

拖放 : 以块、 标题、 文本、 按钮、 图像、 徽章、 统计、 倒计时、 形式、 优惠券、 视频、 收视率、 旋转轮等形式。 样式颜色、 梯度和 3D 效果与滑动器一起 。 预览桌面 / 平板 / Mobile, 并使用 Free Movement 将任意位置放置 。

3
个性化

类型符号 {first_name}, {country} 或 为 {company} 进入任何文本。在显示时,它们成为访客的真正价值。

4
目标触发( T)

选择谁看到它( 国家、 页面、 设备、 观众) , 以及何时开火( 延迟、 滚动、 退出) 。 请留下一条规则空白, 以表示每个人 。

5
检查, 然后发布

点击检查以快速进行发射前扫描, 然后发布。 它在数秒内开始运行并开始收集分析数据 。

块可以建

内容

核心

标题、段落、列表、引文、图像、图标、徽章、统计、分隔和空间器,任何信息的组成部分。

行动呼吁

核心

有真实动作的按钮:打开链接,开始聊天,创建出票,复制出出票券,或跳到一页.

紧急抓取( G)

保险费

倒计时计时器,表格(电子邮件/电话/文本),优惠券揭示和视频嵌入.

游戏反馈( R)

保险费

旋转到胜利的车轮,刮花牌,NPS/明星收视率和多步漏斗.

布局效果( E)

保险费

柱子,进步栏,社会分量,社会证明计数器,是/不是双步,被试;和3D效果,倾斜,发光,抛物,玻璃形态.

个性化符号

将其中任何内容输入标题、段落、按钮、徽章、统计、列表或引用。在升迁时(总是为安全起见),这些内容将被访客的现场详情所取代:

可用的指针
From the visit:   {country} {city} {device} {page_path} {utm_source} {referrer}
From your CRM:    {first_name} {last_name} {email} {company} {segment} {lifecycle_stage}
From a connector: {balance_due} {unpaid_invoices}   (logged-in customers only)

目标参考

国家与地点

仅通过 GeoIP 在选定的国家、城市或时区显示(或隐藏) 。 对特定区域的提议或地理方向来说是巨大的 。

页和 URLs_

使用等值/ 起始/ 包含/ regex 限制某些页面, 并排除页面 。

设备

桌面,平板电脑或移动式,例如移动上的一个瘦小的栏杆,桌面上的一种模式.

访客类型

新建,回放,已知(您在客户关系管理中)或匿名;CRM片段,生命周期阶段,铅分数或浏览器语言.

交通来源

由UTM(utm_source,utm-campaign)或参考站点,例如只从特定广告访问.

计划频率( V)

开始/结束日期,时间窗口,以及一个人能看多少次(每会话,每天在关闭/点击/转换后).

A/B 交通分开

向一定比例的访客显示并运行变体头相接;同一个人总是看到同一种变体.

观众(登录)

启用连接器,可按实取账户状态确定目标,例如客户未支付发票,或主动订户。

触发器

选择推广的出现方式: 延迟后立即在滚动深度、退出意向、闲置时、点击元素、浏览多页后、形式- 放弃或聊天/ 票务活动。 开发者可以从自己的代码中发射一个 window.OpsIQPromo.fire('event').

目标登录客户(连接商)

就是这样 OpsIQ 特别升级: 连接一个平台, 如 WHMCS (或任何支持观众的连接器)和工作室可以根据访客的活账户状态瞄准访问者.

1
启用一个受众连接器

在连接器下,启用暴露观众事实的连接器(WHMCS 客户在登录到该平台时被安全识别, OpsIQ 从来不信任输入的电子邮件 。

2
添加观众规则

在“目标定位”运动中,需要登录,并加上诸如未付发票的规则。1,订阅为逾期未交,或账户信用 > 0.

3
以个人身份处理他们的数据

使用诸如 {first_name} 或 为 {balance_due}. "你有过期的发票" 提醒本身。

观众目标定位是故障安全:如果连接器无法确认一个事实(或者访问者没有登录),那么宣传就只是没有显示,所以收费目标选项永远不会到达错误的人手中. 构建你自己的连接器?见下文"促进受众目标设定".

连通商务(工作室超级力量)

店里卖出的产品卡

实时数据

一个产品块直接从中拉出真实项目(名称、价格、销售价格、图像、链接) WHMCS, WooCommerce, Shopify 或您的语言 OpsIQ 计费,按"保持新鲜"计票,卡片发布后每小时从平台上更新出价.

存储提供的优惠券

库邦

券块可以在您发布时在您的商店中创建真正的折扣码,所以访问者透露的代码总是在退票时起作用.

定单-实收收入

归属

真正的订单来自您的平台 与运动的小时匹配(通过使用优惠券代码或由主电子邮件) 所以,你看到的收入来自 实际销售,而不是估计。

真正的社会证明

信任( E)

社会防控滴答器可以使用真实的近期订单("Ada order Starter Plan... 2h 名字和物品, 从来没有电子邮件或金额。

实验和旅行

A/B 变体和自动胜者

将流量分成不同设计变体; 让工作室自动宣传统计赢家, 或者将流量交给强盗选择者,

持久升降

保留一分钱,看不见的访客,这样你就可以证明运动本身会引发电梯.

分段变体

SAME运动中每个观众(流动访客,大推车,回程顾客)的不同内容,每个部分都获得自己的版本.

触发实验

变体还可以测试何时出现:即时对延迟出局对出局意图,被测量出头对出场.

旅程(链路)

以他人用另一场运动("锯木战役A但并未皈依")所做的事为目标,构建多步升级序列.

茶叶

小型药丸访客在活动结束后可以重新开放,因此封闭的弹出永远不会永远消失.

知其事迹

点击加热图

设计师

在设计者中,切换热图来描绘真正的访客点击了您设计的每一个街区.

步入漏斗

漏斗

多步骤运动 确切显示人们从哪里下来, 屏幕显示。

比较运动

工作室

并列开展多达4项运动(印象、点击、转换),强调最佳价值。

每周故事摘要( D)

大赦国际

每周一都会有一份文摘登入您的通知;📖每周的故事按钮会写一个简单语言的总结,并随想做下一步.

工作舒适

AI 副驾驶和想法

与设计副驾驶聊天来编辑画布("使标题紧急,再加倒计时"),从自己的流量数据中获取竞选想法,翻译每个国家的竞选,或自动固定低的设计分数.

品牌 Kit 导入

一个指挥部读取您的网站,并提议您真正的品牌颜色和字体;保存和每个拾取者都与它们一起领先.

多屏幕漏斗

步骤块每屏编辑时都会获得真实性:每个屏幕的分页,添加或重排屏幕,预览随行.

已命名的版本存在( S)

命名重要版本("劳恩奇候选"),恢复其中任何版本,并在队友编辑同名竞选时看到警告.

设备条标尺( L)

在一个视图中,请看到桌面,平板电脑和移动相并并列;切换像素标尺以精确地放置.

已主机页面频道( T)

每次竞选活动也可以是生物和QR代码的独立主机页面,被捕获线索的电子邮件滴入序列,或者一击一击的网络推取草稿.

企业安全

发布冻结窗口(change-freze periotions),紧急暂停所有开关,批准,审计线索和版本回滚.

我需要在我的网站添加代码吗?+

否. 晋升由同一人提供 OpsIQ 您已经安装了部件 。 设计、 发布、 完成 。

游客会看到同样的弹出 一遍又一遍?+

编号。设置频率上限( 每日每会话 / 或者在某人关闭、 点击或转换后停止) 。 应用了感知默认值 。

谁能出刊?+

出版、挖掘、归档和回滚仅限于工作空间所有人和正式管理员,任何小组成员都可以创建和设计草稿。

增长 & SEO

升级设计师

促销设计师是一名响应的块编辑,负责建设,审查,改版和出版竞选经验.

产品屏幕
升级设计师设计师结合了活画布,设备预览,块,个性化变量,评论和版本历史.升级设计师工作空间VIEWPORT桌面核查v12国家草案现场工作现场英雄区头条、媒体和反恐中心编辑提供块贴现和期限编辑个性化联系和活动变量准备发射检查意见和鉴定审查1BUILD BLOCKS编辑活版布局2序言桌面、平板电脑、移动3PUBLISH版本发布
设计师结合了活画布,设备预览,块,个性化变量,评论和版本历史.

使用块来编译体验, 预览每个支持的视图并插入已核准的个性化变量。 在发布前审查评论和AI- 媒体出处。 保存创建版本, 以便检查或恢复先前的设计 。

增长 & SEO

推广模板

模板为Promocil Studio运动提供了一个可搜索,分类的起步画廊.

产品屏幕
推广模板模板廊会过滤溢价布局,并在模板成为草稿时应用工作空间品牌颜色.推广模板工作空间类别改划RESULTS24应用现场工作现场退出要约紧急模式和CTA预览新来客欢迎封面和利益清单预览产品发射英雄,证明和倒计时预览反馈请求紧凑的快速调查预览1FILTER类别和搜索2序言检查整个设计3USE创建有品牌的草稿
模板廊会过滤溢价布局,并在模板成为草稿时应用工作空间品牌颜色.

按类别搜索或过滤, 加载额外结果, 预览完整的体验, 然后选择 使用模板. 新运动仍然是一项草案,在出版前可以在Premo Designer中更改。

增长 & SEO

宣传分析

促销分析将印象和点击连接到转换,受众背景,连接器动作结果和运动学习.

产品屏幕
宣传分析促销分析显示标题性能,受众和触发分解,引导导出和连接器动作结果.宣传分析工作空间IMPRESSIONS42.8k化学和化学反应中心6.4%CONVERSIONS814现场工作现场国家· 联合王国 31%细目页次/pricing · 22%细目触发退出意图 44%细目连接器动作库恩创建 . 97% 成功结果1MEASURE 音乐转换印象2SLICE页面、国家、设备3LEARN应用洞察力
促销分析显示标题性能,受众和触发分解,引导导出和连接器动作结果.

阅读印象、点击率和转换率。 按国家、页面、触发器和设备分列结果; 必要时导出捕获线索。 连接器动作结果显示,促进承诺的后续行动是否实际运行。 AI洞察力和学习摘要应作为验证假设而不是自动证明。

增长 & SEO

通知

通知在部件通知区域发布一条消息,并带有可选的目标、时间表和行动呼吁。

产品屏幕
通知公告编辑器包括内容,CTA,观众,片段,页面规则,活性日期和视觉风格.通知工作空间实际3AUDIENCE段次时间表朱尔 22–29现场工作现场标题计划维修准备内容标记下的消息准备中导队读取更新可选第 11 条定价页 活跃客户目标1WRITE标题和马克下2目标观众,部分,页3时间表活动窗口
公告编辑器包括内容,CTA,观众,片段,页面规则,活性日期和视觉风格.

选择所有访客,登录访客或新访客;可选的以联系段和页面规则缩小观众. 设置活动日期/活动日期并使用活动旗帜. Premium样式预设和颜色变化演示文稿,但不替换清晰内容.

增长 & SEO

推动运动

推動運動出站后会向订阅者发送浏览器通知.

产品屏幕
推动运动推力作曲家显示订阅范围,内容,媒体,动作,目标规则和时间表状态.推动运动工作空间SUBSCRIBERS8,214发送31.6kCLICK RATE5.8%现场工作现场标题你的车在等准备体质今天回来免费送货准备中导队打开推车准备时间表现在就发送或预定草案1PREPARE PUSH标题、正文、图标2目标观众,部分,页3SEND现在,日程安排或草稿
推力作曲家显示订阅范围,内容,媒体,动作,目标规则和时间表状态.

配置 Web Push 键首先在 Web Prush 设置下进行。一个活动可以包括标题,身体,图标,英雄形象,徽章,CTA和最多两个动作按钮;持续通知直到访客互动为止.

目标为观众,可选的接触部分和页面规则。 请立即保存草稿、 排程或发送。 请使用订阅和点击度量标准来判断访问范围。 HTTPS 和正确的托管服务人员需要访问嵌入第三方网站; 请查看第三方网站的Web Push 。

增长 & SEO

主动消息

主动信息在访客的行为符合规则时自动伸出, 在他们问之前。 您将每个内容构建为三部分的规则: 当它开火时会发生什么, 以及多久一次。 每一件事都通过规则来传递 。OpsIQ 部件已经在您的网站上了 。

主动
主动消息一个主动规则作曲家分三部分:选择动作(聊天,横幅,巡演,推取,电子邮件),增加条件,设置频率冷却.主动信件工作空间1行动聊天消息横幅巡回演出推开电子邮件2 · 条件page = /pricing页面上的时间 > 20s返回( E)3频率每届会议一次状态1行动聊天,横幅,电子邮件,推...2CONDITIONS页面、时间、分数、返回3自由主义冷却每名访客
每个主动的规则都是三个选择:发生什么(聊天、横幅、巡演、推倒、电子邮件、网络呼克)、何时(条件)和多久(冷却)。

规则的三个部分

1
会发生什么(行动)

显示聊天泡沫或页面上标语, 启动导游, 发送网页推取或电子邮件, 指派到一个部门, 或点出网页。 Tokens like {{visitor_name}} 财务报告和已审计财务报表 {{page_title}} 成为真正的价值。

2
当火燃烧的时候,

触发它的缩影: 页/URL,页上的时间,滚动深度,铅分数,返回对新,闲置。没有条件,每个访客的规则会起火。至少要增加一个目标。条件与AND结合。

3
多久一次(频率)

设置一个冷却点, 以便同一人不会受苦, 例如每届或每天一次。 每条规则都有一次启动/关闭状态 。

⚠️
工作区切换"运行时间/规则小时"让服务器侧动作(电子邮件、推取、网络呼取、指派)在已知联系人目前不在页面上的日程上起火,这样您就可以自动"发送闲置的热线索"。它需要 OpsIQ Cron运行。如果您只想在网页上直播,请不要使用它。
会不会给大家点火?+

只有在不添加条件时,才会添加至少一个条件(页,铅分,还原.),以锁定正确的访问者.

这些问题与流动和旅游有何关系?+

他们合作:主动规则可以启动"导行"(Guided Tour),而Chatbot Flow(英语:Chatboot Fllow)则可以通过主动规则来触发。从一个聊天-信息规则开始,然后将其他规则分层。

增长 & SEO

聊天室流出

聊天室流程脚本在您的聊天部件( greetings, keys answers, guided paths) 内进行分支对话, 没有代码。 流程是一组连接的步子( 节点): 您询问一个问题, 访客选择一个选项, 流程会把它们从匹配的分支中发送。 只有活动流程运行在您的站点上 。

如何运作
聊天室流出流布:将问候节点分出三个选项按钮,每个选项后会导出下一步,向上排列,或向人交接.问候嗨,我能帮忙吗?追踪我的命令计费问题和人类说话查查顺序→ 人类代理触发器:问候 · 关键词 ·手册 ·后细节 · 在聊天端
聊天室流出

流动与人工智能 。

使用流动

当路径可以预测,并且每次您都想要它相同:预订步骤,返回向导,“哪个计划”选择者,在交接前收集电子邮件。流程从不即兴。

使用人工智能

当问题没有限制时, “ 这样做与我的设置有关吗? ” 。 客户聊天AI 回答来自您训练有素的知识。 流水可以随时间推移而向AI( 或人类) 。

触发器

问候

当访客首次打开聊天时, 运行为打开消息 。

关键词

当访客键入您列出的单词时运行( 如退款、 定价、 取消) 。

细节之后/ 延迟之后

一旦联系方式共享, 或对话中设定的时间开始 。

在聊天结束/ 主动

运行为聊天结束(例如评分),或由主动消息规则启动.

四分一步建一个

1
创建流

单击新流程, 命名它, 选择触发类型( 如果关键字) , 保存。 它会关闭 。

2
打开画布

单击“编辑 Canvas”。您添加步骤(信息、带有按钮的问题、分枝)并连接这些步骤的视觉构建器。

3
添加分枝和交接

对于每个选择,请在下一步画出分行。通过解析、移交AI或转移给人类来结束路径。

4
打开它

单击 Election。 流量会立即在您的部件中运行。 随时禁用, 而不丢失设计 。

流量是否取代人工智能?+

两者并排运行。使用流动来获取可预测的路径,而AI来获取开放式的问题;流动总是可以让两者都放弃。

增长 & SEO

导游

导游是一步步走过,在您的页面部分部分有语音泡沫和聚光灯,引导访客通过登机或新功能,它们完全被设定为主题,并建在一个视觉设计器中,同时进行现场预览。巡演只有在标出主动时才进行。

如何运作
导游一个暗淡的页面,一个聚光灯环绕一个附加交易按钮和一个主题演讲泡来读 Step 1联 合 国4下一个按钮。+ 添加交易步骤1员额变动情况4创建您的第一笔交易点击这里添加一个交易到您的管道中 。ưμ㼯A→
导游

如何打造一个巡演

步骤

每个步骤都瞄准一个元素, 并用您的文本显示一个泡。 添加多少个停留, 以命令它们 。

预设主题( T)

从预设或设计出自己的泡(颜色,梯度,聚光灯)开始,右边有活预览.

触发

将主动规则可选地连接起来,这样,旅游在规定时自动启动(例如返回游客的第一次仪表板访问)。

活动切换

巡演仅在活动被勾选时才有资格运行。 取消删除它。 NAME OF TRANSLATORS

四分一步建一个

1
新参观

点击新导游, 命名它, 并选择链接一个主动规则, 使其自动启动 。

2
添加步骤

添加每站: 选择它指向的元素并写入泡泡文本。 重新排序直到路径流出 。

3
设计它

自己选择预设或样式来显示泡沫。 现场预览会显示访客所看到的。 Name

4
激活( A)

选中活动并保存。 巡演现在可以运行, 以自己的触发器运行, 或者由主动消息规则启动 。

游览怎么开始的?+

由他们自己触发,或通过主动消息规则的"被引导的巡演"动作,所以你决定哪个访客看到哪个巡演和何时.

增长 & SEO

转换目标

转换目标将您所关心的活动( 输入的网络hook事件、 聊天信息、 票务解析) 转变为记录的转换, 并完全归属。 当活动点燃时, OpsIQ 记录与联系人的转换,并将其与导致接触的竞选活动、部分和来源联系起来。

如何运作
转换目标入球流量: 一次支付. 成功webhook事件成为记录的"购买"转换值 $49,归结于它的源和运动,上面有快速启动的预设芯片.快开始Stripe购买预定的演示通讯注册payment.succeeded输入的网路改划"购买"... $49属性· 运动
转换目标

分三个步骤确定目标

1
选择触发活动

单击新转换目标。选择算作转换的活动类型,或使用快速启动预设,Stripe购买、Demo预订、《通讯》注册或订阅开始。

2
命名并设置一个值

给转换一个名称(购买,演示_已订入,注册),并可选择固定值和归属窗口.

3
保存

救活并启动 从那时起 只要活动点燃 OpsIQ 记录了与联系人之间的转换,并将归属归于上述触摸。

目标已经连接到输入的网络hooks:任何触发点与输入事件类型相匹配的目标,在事件降落时会自动触发。使用输入的网页连接Stripe,卡伦德利或任何能够 POST 的系统JSON.
转会是什么?+

任何被记录的活动:入住的webhook事件(pay. succeed),聊天邮件抓取,票务解析,联系时间线上的任何内容.

分析

自定义仪表板

自定义 Dashboard 允许您构建自己对重要度量的视图, 而不是只依赖标准概览。 添加您想要的部件, 拖放并调整大小到您喜欢的布局中, 保存它, 并与您的团队共享 。

自定义仪表板
自定义仪表板带有 KPI 和图表部件平板的仪表板构建器、 有破损的投放区和 Add-widget 按钮。自定义板工作空间我的仪表板+ 添加部件观察员2,481回归$8 2k (单位:千美元)贩运在此拖动部件托普纸/pricing/docs/signup1ADD WIDGETS选择参数和图表( H)2ARRANGE拖放大小( R)3共享与你的团队
构建自己的棋盘:添加 KPI,图表和列表部件,将其拖入所要的布局并调整大小,然后与团队共享.

分三步建一楼

1
添加部件

单击 添加部件并选择要跟踪的参数或图表。重复棋盘上想要的每件事。

2
安排布局

拖动部件以重新定位并拖动边缘来调整大小。 KPI 横跨顶部, 下方的图表。 随你怎么说。

3
保存共享( S)

保存仪表板,并分享它与你的团队 所以每个人都看相同的数字。

保持单独的董事会,以从事单独的工作(一个"每日一览"的董事会,有活计数,一个"月检"的理事会,有趋势图),所以每个董事会都保持专注.
增长 & SEO

外联运动

外联 OpsIQ 是因为...1:1和批量的电子邮件引擎: 编写个性化消息或运行一个竞选活动到一个 CRM 部分, 包含回复检测、 发送时间控制、 打开/ 点击跟踪、 跟踪像素和一次点击未订阅。 它符合同意和 CAN- SPAM / CASL 。

外联
外联运动外联屏幕上设有编曲/手语/平板/重制标签和一个显示发送、开放率和回复率的运动表。外联工作空间运动作曲家模板答复喀麦隆发送打开秘 书6月通讯1,20048%7%审判后续行动34062%14%赢回82039%5%答复检测自动停止后续 ^ 每一次发送一次点击取消订阅11:1 & BULK作曲或竞选2TRACKED打开、点击、回复3COMPLIANT取消已建入的订阅
外联引擎:发送1:1或运行运动到某一段,跟踪打开和回复,并遵守内置的未订阅和回复检测。

四个标签

作曲家

写个个性化1:1电子邮件为{tokens}从联系人和CRM.

运动

发送到预定或现在的CRM段,带有封顶和发件时间控制.

模板

重复的外联可使用消息模板 。

答复

答复侦测记录了答复情况,并对答复者进行了自动拦截。

竞选如何进行

1
选一个观众

选择一个CRM部件(或上传列表),自动适用禁止和同意。

2
编曲

以个性化符号写入信件; 预览对应于真实的接触.

3
调度( S)

现在或最好的时候发送。 打开一个跟踪像素记录; 点击和回复被归为正题 。

外联是同意和压制的,包括一次点击一次不订阅每次发送,并遵循CAN-SPAM/CASL。
分析

排定的报告

已排定报表的电子邮件中,有一套选定的计量标准,用于在(每日、每周或每月)时间表中选择的收件人,作为可打印的白色标签 PDF。设置一次,报告会自动在收件箱中通过 OpsIQ 克龙。

排定的报告
排定的报告排期报告屏幕:包含报告时间表、接收者和最后批次时间的表格,并加一个保存报告按钮。排定的报告工作空间排定的报告+保存报表报告时间表检索最后一发每周交通量月号9:00[email protected]两年前SEO客户端报告每月[email protected]军1销售摘要每日[email protected]today以白色标签形式交付 PDF 通过 OpsIQ 曲线1AUTOMATED每日/每周每月2白宫PDF 给客户的3检索按期发送电子邮件
设置一次报表( 度数集、 范围、 进度表、 收件人) 和 OpsIQ 电子邮件白标签 PDF 自动在你的下体。

立个报告

1
选择要发送的

选择公制(流量,SEO,销售量,支持.)和日期范围.

2
设定调度接收者( E)

每天、每周或每月,您选择时间向一个或多个电子邮件接收者发送电子邮件。

3
保存

保存和启用。 报告会按期生成和发送邮件, 没有手动步骤 。

💡
附表所列报告 OpsIQ cron,如果报告未到,确认cron正在运行(见Cron和自动化)。
隐私

隐私遵守( A)

隐私与合规页面是向一个负责处理个人数据的审计员展示以下内容的单一地点:同意分类账、管理员访问日志、数据保存和保存政策,以及即时打印 DPA,在一个有标签的视图中。只有完整的管理员才能打开它。

隐私遵守( A)
隐私遵守( A)隐私和遵守规定屏幕:用于同意分类账、访问记录、居住和 DPA 的分页,并附有同意分类的赠款表和按频道撤销。隐私和遵守工作空间同意分类账访问日志居住DPA联系人钱格尔行动日期[email protected]电子邮件获准军 12[email protected]push已撤销军 10[email protected]marketing获准军9通过渠道搜索每项同意的证明并撤销1相应标识每笔赠款的证明2ACCESS LOG是谁碰过数据3DPA可打印模板
一个审计人员准备的屏幕:可搜索的同意分类账(赠款/按频道收回)、接触数据的登录记录、居住/保留设置以及可打印 DPA.

四个标签

同意分类账

一份可搜索的每一份同意书的记录,并通过联系方式撤销频道(电子邮件、推取、短信、闪存)、动作、来源和日期。您的证据是已同意联系人(或已退出)。

访问日志

你团队中谁查看、编辑、输出、删除或传递了联系人的数据,以及管理员、联系人、行动、说明的理由和 IP 监管者要求的就是这个

居住和保留

宣布此工作空间的数据生活地点, 设定活动行保存天数( Q) :0 =永远),并记录您的数据控制器和DPO.

DPA 模板

可打印的数据处理增编,该增编将填写您的控制器、地址、DPO、居住和保留。PDF.

隐私与合规与 Cookie 同意工作室( 收集同意) 和 Export 页面( 为 a 生成数据副本) 对齐 DSAR),并参见Cron和自动化的夜间保留清理.
连接器

连接您的平台

连接器链接 OpsIQ 向外部平台开放:电子商务商店、计费系统、支付处理器、电子邮件提供者和定制 APIs。一旦连接起来,AI可以查询订单、客户数据、订阅等信息,并在你同意的情况下采取行动。

如何运作
连接器枢纽OpsIQ核心连接到WHMCS, Shopify, Stripe, WooCommerce,SendGrid和Google Business Profile,各显示一个连接状态.WHMCSShopifyStripeWooCommerceSendGrid谷歌在线OpsIQCORE 战地1PLUG IN25+ 预建连接器2AI CONTEXT真实平台数据3ACTIONS由你批准完成 已经同意了
连接器

载运船舶OpsIQ

这些是安装时在场的,只需要他们的证明。

WHMCS

计费

网络托管计费:客户端,服务,票房,发票,域名,服务器.

Shopify

电子商务

电子商务:订单,客户,产品,存货,支付,网络呼号.

WooCommerce

电子商务

WordPress 电子商务:订单,客户,产品,券,通货.

WordPress

内容管理系统

内容和用户aWordPress网站。

平方边

付款

付款和销售点:订单、客户、目录。

osCommerce

电子商务

后遗症电子商务:订单,客户,产品.

博特布尔酒店

通过签名的Botble CMS酒店网站OpsIQ桥。没有API.

Zendesk

支助

服务台:入场券,用户,组织,评论.

谷歌商业简介

营销

当地业务:评论、帖子、QQA、见解。OAuth.

谷歌日历

生产力

日历和活动。OAuth.

Gmail财务报告和已审计财务报表IMAP

电子邮件

邮箱:出入境邮件,地址簿同步.

SendGrid

电子邮件

电子邮件发送:发送电子邮件并管理模板.

邮件枪

电子邮件

电子邮件发送:通过邮件枪发送邮件.

Slack、电报、在线、XDM

消息

发送进出通话的频道。

元频道

消息

Facebook Messer, Instagram DM and WhatsApp. 互联网档案馆的存檔,存档日期2013-12-21.

站点情报( O)GA4, 搜索控制台)

分析

分析和搜索数据SEO套间。

网站浓缩和CRM导入

CRM

公司浓缩和大宗客户进口。

可从市场上获取

这些是已发布的软件包,而不是安装的一部分。 安装一个来自 Connectors, Complateplace , 并被复制到活的连接器文件夹中, 然后它的行为与上面的完全相同 。

Stripe

采购网

付款:收费、客户、发票、订阅、付款、纠纷。

BigCommerce

采购网

电子商务:订单,客户,产品,类别,品牌.

马根托2

采购网

电子商务:订单,客户,产品,类别,存货.

PrestaShop

采购网

电子商务:订单,客户,产品,手推车规则,载体.

OpenCart

采购网

电子商务:订单,客户,产品,类别.

亚马逊 SES, 邮戳, 重发

采购网

交易邮件发送。

线性吉拉

采购网

问题和项目跟踪。

缩放、 微软日历、 展望邮件

采购网

会议、日历和邮件。

多库西恩 阿波罗 塞尔帕皮Google Analytics

采购网

5. 签字、探矿、搜索和分析数据。

Webflow, Wix, 平方空间

采购网

网站平台.

💡
连接器列表随包的发布而移动。您安装的权威列表是连接器页面:列出的是运行时间发现的内容,而"市场"标签显示的是您可以添加的内容.

安装连接符

1
转到连接器

导航到管理员侧边栏中的连接器 。

2
查找连接器

浏览列表或搜索。连接器按类别分组。

3
打开它

单击连接器并切换“启用”。

4
输入证书

填入所需的字段 : API 键, URL,指使等。每个连接器在设置面板中都有文件记录的具体要求。

5
测试连接

点击“ 测试连接” 。 一个绿色结果表示连接器可以到达外部平台。 一个红色结果显示错误 。

6
配置特性

选择要启用的特性: 知识同步、 网络同步、 有AI 动作。 并非所有连接器都支持所有特性 。

连接器给你什么

AI 背景

AI可以通过连接器查询客户数据,订单,订阅,更多内容. 客户聊天时,AI有真实的平台数据可以参考.

AI 语境( 连接作者)

您的连接器背景 Provider 向购票机构提供一张只读账户的票主摘要。 请通过 customer_id (ctx旗的自动复制票) customer_trust_email 是真的, 查一下账户 customer_email 远程平台曝光一个 /context/customer-by-email 端点和连接器都称它为“ ” 。 因此AI 引用了真实的平衡/ 发票, 而不是“ 请登录 ” ( 请登录) 。 以纪念操作员的数据类切换( ) ( ) !customer_sections, customer_allow_credit),并严格保留只读,绝不泄露秘密.

客户目录( 连接作者)

您的连接器身份 提供 3 个通用的票型查询: lookupCustomerById() (客户卡), lookupCustomerServices() (产品/服务表), listCustomers($query,$limit): 本地的 Capose-New-Ticket 表格上的“搜索客户端或类型电子邮件”拾取器。返回行 {id, external_id, name, email, company, phone, platform, platform_label}. 远程规则 : 如果你的客户住在另一个数据库或服务, 把他们从您的平台上拿过来 API 在这些方法内,绝不直接阅读其他系统的表格(在 OpsIQ DB 它们是空占位符, 因此本地读取器返回空取器 。 打开您配置的远程路径 API URL; 保持本地读取只作为同为 DB 的倒计时.

电子邮件接通的票、检测和路由(连接者作者)

当入境邮件成为本地票时, OpsIQ 通过调用来检测发送者 lookupCustomerById(0, ['email'=>$sender]) 横跨每个连接器; 第一次匹配“ 拥有” 客户及其 platform 弹片被印在 ticket.created 事件为 _pipe_owner_platform (空=来宾)所以 WHMCS- 顾客电子邮件打开一张票 WHMCS (WHMCS 编号,镜像为一),而未知的发送者仍会留下本地来宾. 如果你的连接器在自己的平台上 照亮本地的票,你的,你现在 ticket.created 操作者必须打开此门 : if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;。钥匙在非接通(聊天/人工/人工)门票上缺失,因此与以往一样,这些镜像。每个部门的控制由小组和部门负责。→通过电子邮件开出门票(任何人/客户只开出/关闭).

行动

AI可以通过连接器执行动作:创建出票,更新订单,取消订阅,所有动作都通过"信任层"获得您的批准.

知识

连接器向AI提供特定平台的知识文章. Shopify 连接器增加了电子商务故障排除; WHMCS 连接器添加了托管知识.

知识库导入(连接作者)

如果您的平台拥有知识库, 请声明 kb_capabilities 块中 settings.json (类型) kb_source),您的连接器出现在帮助中心编辑器中 导入 KB→从连接的应用程序导入 当它启用和配置在工作空间时, 便会下放。 它具有声明性, 没有执行的方法: 命名内置 adapter (zendesk 确切的树木帮助中心 API,或 crawl 用于任何 KB 站点)和 a base_template 诸如 https://{subdomain}.zendesk.com中,哪个 OpsIQ 从您存储的连接器设置中填充 。 身份证书从不离开服务器; 浏览器只发送连接器 sattle。 要支持新平台, 请添加一个 opsiq_kb_<platform>_manifest() 适配器并按名称引用。 connectors/PLATFORM_CONNECTORS.md §5.

Webhook

一些连接器与外部平台注册了webhooks,用于实时事件通知(新订单,更新票等).

销售追踪

电子商务连接器将收入数据输入销售仪表板,以供归属和分析。

💡
连接器是工作空间范围。每个工作空间都可以使用不同的连接器,但证书不同。WHMCS 工作空间使用 WHMCS 连接符; a Shopify 工作空间使用 Shopify 连接器。
能不能马上用多个连接器?+

是的,你可以拥有Shopify命令和命令Stripe用于在同一工作空间中支付。AI合并了来自所有已启用连接器的数据。

如果我的平台没有被列出呢?+

使用连接器构建器为 REST 的任何平台创建自定义连接器 API。或者检查市场,以获取社区建设的连接器。

连接器是否使用自托管 OpsIQ?+

是的 连接器在云和自办的版本中都一样工作。

连接器

销售和开具账单连接合同

每个商业连接器都使用相同的平台中性事件合同. WHMCS 是参考执行,但SaaS Bridge、商店、支付供应商、市场连接器和连接器构建器包必须遵守同样的规则。

每个商业连接器必须公布的内容

一份权威分类账

Publish realised economic events to opsiq_sales_events through CommerceEventRegistry::normalize(). Do not build a connector-specific Sales table or make core analytics query a remote platform directly.

稳定源身份

平台是连接器注册 swit,例如 whmcs, shopify 或 opsiq_saas. traffic_ source 在提供时包含已核实的获取属性; 否则会使用与倒置时相同的shot。 存储标识符, 不显示标签 。OpsIQ 解决 UI 中友好连接符名称。

出现严重性

event_id 必须具有决定性。至少绘制一个不可变换的订单_ref, 发票_reff 或订阅_refs so webhook retries并回填更新同一事件,而不是创建重复销售。 service_reft 确定受影响的产品或服务实例。

源时间戳

发生在源平台报告的支付或经济活动时间。从不以导入时间取代历史支付日期。

钱和FX

发送源数和有效三字母 ISO 货币。如果连接器设置允许 OpsIQ FX转换,报告转换为工作空间报告货币;否则报告保留了存储或计费平台货币. Connectionr代码不得硬码为报告货币或汇率.

循证生命周期

使用新的,续约,升级,退款,信用或未知. 根据发票理由,订阅或服务关系,行项类型,或另一个权威源字段进行分类. 同一客户的重复购买并非自动续约.

销售边界

销售和转换中只有正向支付的新账、续签、升级或合法未知的商业收据。退款通过退款和净收益分析报告。账户信用、钱包上注、象征性上注和添加基金仍然是计费引导的活动,从未算作销售、转换、订单数量或销售收入。

CRM保持分开

CRM交易是管道和交易活动,不是商业平台的销售,除非连接的开单或储存平台通过本合同发出已支付的订单或发票。

每道支付信号打开行

不需要依赖一个事件名称. 当平台发送数个支付确认(发票支付,订单支付,交易添加,支付完成)时,一旦平台确认销售支付,其中任何一位都可以打开分类账行;销售指纹会将兄弟姐妹倒地一行.

排定的对账(合同) 2.3)

A connector whose platform can list completed sales declares sales_reconciliation and implements SalesReconciliationInterface::reconcileSales(). Core re-reads the platform list on a schedule (once per workspace interval, bounded, cursored) through the same idempotent writer, so a dropped webhook cannot lose revenue. Conformance fails a package that can list history but does not reconcile. The Connector Builder derives the capability from the sales backfill action.

衍生预测

opsiq_转换和仪表盘摘要是从分类账中重建的相容性预测。连接器不能将预测作为真实性的财务来源。合同修订可以重新评价衍生行,而不必删除基本的计费历史。

远程平台边界

一个远程连接器通过配置的认证读取其平台 API。它决不能依赖同一服务器数据库表格。精确认证的域站点_key由 Connector Registry 提供,必须应用到每个分类账写和回填。工作空间或组范围只能是读取时间聚合;它绝不能扩展存储的事件所有权。

典型的有酬活动

实现商务正常化的活动
{
  "event_id": "acme_store:invoice:INV-1042",
  "event_name": "invoice.paid",
  "platform": "acme_store",
  "order_ref": "ORDER-884",
  "invoice_ref": "INV-1042",
  "subscription_ref": "SUB-28",
  "service_ref": "SERVICE-91",
  "status": "paid",
  "lifecycle_type": "renewal",
  "amount": 129.00,
  "currency": "USD",
  "traffic_source": "acme_store",
  "occurred_at": "2026-07-23 08:30:27"
}

连接器构建器映射

当 Connector 构建器启用销售和计费时, 映射量、 货币、 源状态和源日期, 加上至少一份订单、 发票或订阅引用。 map security_type when the connected API 揭示权威的生命周期证据。所生成的“销售信息”通过内置和市场连接器使用的同一“商务事件登记规范化器”逐行传递。

⚠️
信贷和添加基金被有意保留,用于记帐历史、客户余额背景和分类账分析,不从销售中扣除这些款项并不删除;这只能防止它们夸大商业业绩。

生命周期_类型决定成为什么CRM发牌

lifecycle_type 不是分析标签。OpsIQ来决定销售是否进入CRM管道,所以每个销售连接器 正在做一个管道决定 它是否打算。

新建( N)

开通封闭式交易(新业务).

续订、升级

记录为经常性收入。没有新的商业交易——续约在不同的概率曲线上转换,并混合它们会破坏两个预测。

退款,贷记

绝不以任何方式开出交易,退还给客户的钱不是赢家.

省略/ 未知

仅收入,销售记录在案,但从未到达管道。

一份销售,一份分类账:身份是SALE,不是事件

不匹配于( E) event_id 并插入自己。 event_id is platform:eventName:externalId,它回答“我们已经处理过这一交货”,不能回答“我们是否已经记录了这一销售”。 invoice.paid 并且再次作为 payment.completed ——薄荷2个ids并两次登陆同一笔钱,没有相撞和警告.

💡
在参考安装上找到:6张发票,每张有3个分类账行,从3个代码路径中找到,使用3个不同的事件_id方案。这些发票都带有0.00因此,没有总额看起来是错误的,任何后来的程序恢复实际数额将计算出一次付款三次。

调用共享的写法。 Core 计算销售的商业身份( NAME OF TRANSLATORS)sale_fingerprint),与其中已有行相匹配,保留正本 event_id ,并过滤到真实列:

唯一支持的写销售分类账的方法
\OpsIQ\Commerce\CommerceEventContract::upsertSaleRow('opsiq_sales_events', $row);
同样的买卖,很多事件

一张发票的指纹 并更新了一行

退款保持分开

钱出钱与钱入钱不同。 退款发票保留了自己的身份,因此它永远无法覆盖它所退款。

没有参考,没有指纹

连一行都找不到订单、发票、订阅或服务参考书 都得不到指纹 所以两行无关的字条就永远无法拼接 因为都缺少了一张身份证

参考优先

发票_ref,再订购_refs,再订阅_reif,再服务-ref——最强先发售,所以一出出售能保持稳定身份.

分类账是仅附加的: 永远不要重写销售

退款、注销或更正是: 新日期条目。不要更改它纠正的行。将付款重写成退款,看起来很干净,一次打破三道:

破坏毛收入

销售总额和退款率不再分开——退款率为所通知的逆转的衡量标准。

倒转的时期是错的

3月退一月发售必须减少三月. 重写一月行默地重复了关闭期.

弄坏了审计线索

一种分类账记录了某一时间发生的事情。 惩戒是反向的,这就是双入帐记已经运作了五个世纪。

连接器会报告逆转而不是应用:返回 refunded_at 财务报告和已审计财务报表 refund_amount 与销售本身的生命周期同时并存的,让呼叫者将退款写作退款发生时的自有行。 两者永远无法碰撞,因为销售指纹将退货与出售分开。

💡
同一原则也适用于金额。不要“修复”平台现值所储存的金额:从合法记录的账户信用结算的发票0在支付时,当客户超额时,这笔钱就已经记录下来了。恢复面值将计算两次。

分类合同

OpsIQ 决定生命周期 一次, in \OpsIQ\Commerce\SaleLifecycleClassifier中,连接器只声明其中的哪个 自己的平台的 词语的含义,通过执行 \OpsIQ\Connectors\SalesLifecycleConnectorInterface::salesLifecycleVocabulary(),然后调用共享分类器。不要重用推理。

申报词汇,授权决定
public static function salesLifecycleVocabulary(): array
{
    return [
        'credit'             => ['addfunds'],                  // adds balance, sells nothing
        'upgrade'            => ['upgrade'],                   // resizes an existing commitment
        'recurring'          => ['hosting', 'domainrenew'],    // continues something owned
        'acquisition'        => ['domainregister'],            // obtains something new
        'recurring_prefixes' => ['domainaddon'],               // families that grow over releases
    ];
}

$lifecycle = \OpsIQ\Commerce\SaleLifecycleClassifier::classify([
    'explicit'    => $platformSaidSo,     // wins outright when present
    'line_types'  => $types,              // your platform's own line/item types
    'vocabulary'  => self::salesLifecycleVocabulary(),
    'is_order'    => $cameFromANewOrder,
    'is_refunded' => $moneyWentBack,
]);
💡
优先级是固定和共享的:明确,然后退款/取消,然后信用,升级,然后是_订单,然后反复,然后获得,然后未知。升级比订单检查还要高,因为平台也提出升级订单;重复的坐到它下面,因为新订阅的第一份发票带有反复出现的行型。在一次模棱两可的非订单销售中,分类商倾向于收入,远离管道。

声明平台的全部词汇

这是代价最大、看起来最不正确的失败。WHMCS 匹配的连接器 ['hosting','addon','domain'] ——列表内容完整.WHMCS 绝不放出赤裸的、 Domain 键入真实域行; 它会释放 DomainRegister, DomainRenew, DomainTransfer, PromoHosting, PromoDomain, DomainAddon* 财务报告和已审计财务报表 Upgrade全部从名单中掉到 unknown: 1,288 发票,三年,无出错和行日志.

每个新客户都通过连接器回填输入历史,所以分类错误不会影响一个工作空间 — 它会影响每一个通过连接器登入的工作空间,在他们第一次查看他们的管道时。从平台的文档或对活数据进行普查中提取词汇,然后匹配成长中的家庭。 前缀 所以一个兄弟还没有人看到 与它的亲属分类 而不是消失。

💡
实际检查: 数出您自己行中有多少个在未知位置上。 一个健康的销售连接器将几乎所有的事物都分类。 稳定的未知流几乎永远不是您没有的数据 — 这是连接器从未学会读取的词汇。

修复进口历史

每一次运出OpsIQ销售连接器执行此功能 — WHMCS, Shopify, WooCommerce, osCommerce, SaaS Bridge, Stripe, BigCommerce and Magento 2. Treat it as expected, not optional: a customer imports their old records on day one, so a classification fix that cannot reach that history only helps people who signed up afterwards. Implement \OpsIQ\Connectors\SalesLifecycleRepairInterface::reclassifySale() 使用您已经拥有的连接器, 使用所有记录中的任何内容 。 tools/crm_backfill_sales_lifecycle.php 然后用没有每个连接码的连接器导入历史修复:默认的干运行,在写入前备份并验证行数,通过一个倒数分类账可逆转,它从未将失败读取为答案。

💡
如果您的连接器不能重读过去的记录—— 一个只使用网络连接器的连接器—— 请不要打乱这种方法。 返回未知的分块比没有执行更糟糕: 回填会将好的行重写为未分类并报告成功。 只执行词汇界面 。
💡
详细软件包参考文献仍可使用连接器/CONNECTOR_EVENTS. md和连接器相接/PLATFORM_CONNAECTERS. md在自发源地分布中提供.
连接器

旅行活动合同

Journey Intelligence接受浏览器部件,内置连接器,SaaS桥,市场包和Connector Builder输出的一个平台中立事件信封. 月台特定名称在边缘翻译;漏斗,归属和站点智能代码只消耗犬类事件.

隔离和信任边界

精确的对等域密钥

每个事件都绑定在认证的域站点_key上。连接器必须从 Connectionor Registry 或其认证的端点取出该密钥, 绝不从一个不信任的请求机构取出。 域保存单独的记录; 域组仅仅是读取时间的集合 。

具有更充分能力的身份

事件_id是连接符的要求,必须确定同一本地事件。要更新一个事件,而不是重复行程或销售。

原生加冠名

保护 source_event_name 找出证据和解决问题,然后绘制地图 event_name_canonical核心分析器绝对不能在连接器弹道上分出

服务器证据胜出

浏览器观察可以开始或推断行程。 认证的连接器事件确认签名、 登录、 付款、 购买、 续签、 退款和其他终端结果。 一个有效的站点关联符是最强的连接; 一个无效的符号被拒绝, 而其嵌入的ID 是不可信的 。

隐私

只发送所声明行程所需的识别符和字段。 尊重同意、 遮盖和保留设置。 绝不将证书、 纸牌数据、 认证秘密或私人信件机构放置在属性中 。

封装封装

旅行活动信封
{
  "contract_version": 1,
  "event_id": "myshop:order:884:paid",
  "source": "myshop",
  "source_event_name": "order.paid",
  "event_name_canonical": "commerce.purchase.completed",
  "site_key": "exact_domain_site_key",
  "occurred_at": "2026-07-23T08:30:27Z",
  "visitor_id": "optional-browser-visitor",
  "session_id": "optional-browser-session",
  "journey_id": "optional-journey",
  "attempt_id": "optional-attempt",
  "correlation_token": "optional-signed-token",
  "customer_ref": "C-42",
  "user_email": "[email protected]",
  "object_type": "order",
  "object_ref": "884",
  "order_ref": "884",
  "outcome": "succeeded",
  "evidence_level": "server_confirmed",
  "confidence": 1,
  "properties": {"amount": 129, "currency": "USD"}
}

犬科分类学

使用最窄的真实名称。 受支持的家庭包括订婚页面/ CTA 活动; 账户注册、登录、 外出和密码重置; 领导和形式阶段; 产品、推车、 退货、 付款、 购买、 订阅、 续签和退款; 宣传印象和转换; 帮助中心、 聊天和售票活动; 有名的自定义事件。 典型的终端名称是 。 account.signup.succeeded, account.login.succeeded, lead.form.succeeded, commerce.payment.succeeded, commerce.purchase.completed, commerce.subscription.renewed 财务报告和已审计财务报表 commerce.refund.completed.

浏览器推断、确认和放弃

部件可以不连接器而工作, 方法是观察页面结构、 形成动作、 DOM 结果和访问者行程日志。 这些证据仍然被明确分级为观察到或推断的级别。 连接器会添加权威服务器确认, 可以将其与同一浏览器尝试相链接。 弃置首先作为候选工具存储; 它只有在UI 设置了不活动窗口之后, 并且只有在以后没有恢复或成功时才会被放弃 。

分配和收入

归属更喜欢有效的签名关联符,然后是准确的行程、尝试、会话或商业参考,然后则是同意的身份图,最后是一种有界限的行为匹配。无匹配的销售仍然没有属性。多触控分类账加权数必须总计。1。站点智能属性收入读取此分类账;信用、钱包上加、符号上加和添加基金从不购买转换。连接器 FX 行为仍由该连接器设置控制。

⚠️
归集模式,回望窗口,直通处理,最小置信度,废弃超时和漏斗定义都是UI政策. Connector代码不能硬编码.

连接符显示和构建器

连接器行程声明
{
  "capabilities": ["sales", "journey_events"],
  "journey_capabilities": {
    "journey_events": true,
    "payments": true,
    "subscriptions": false,
    "correlation_token": false,
    "backfill": true
  },
  "journey_event_mappings": [{
    "source_event_name": "order.paid",
    "event_name_canonical": "commerce.purchase.completed",
    "field_map": {
      "order_ref": "order.id",
      "customer_ref": "order.customer_id",
      "amount": "order.total",
      "currency": "order.currency",
      "occurred_at": "order.paid_at"
    }
  }]
}

声明只具备软件包真正交付的能力。 Connector Builder 验证了绘图并生成第一当事方软件包使用的相同平台中立的适配器。 Journey introduction 接受一个事件或限定批次 100 通过生成的经认证的集成端点。

💡
商业分类账仍然是真实的资金来源. 商通通通桥发布服务器确认的结果,并在现有的同位素分类账上调后调节归属,因此一次支付永远不会变成两次销售.
连接器

AI行动如何运作

每个连接器都宣布一组动作:AI通过外部平台可以做的事情,动作是"AI说"和"AI做"之间的桥梁.

大赦国际的行动
AI行动如何运作客户请求映射到删除类型的动作卡,然后是核对表: 检查权限,你确认, API 打电话来AI行动如何运作工作空间放弃我的订阅客户大赦国际cancel_subscriptiondelete需要确认parms:订阅_id(从上下文)行动类型readdelete权限角色检查( L)你确认行动API 报告结果1DECLARED每个连接器列出动作2GATED权限+确认3THEN RUNAPI 呼叫,结果返回
请求成为已宣布的行动(已读/写/删除),并经过许可检查、确认、执行和汇报。

动作生命周期

1
顾客要买东西

"取消订阅",AI识别此需要"取消订阅(cancel_servation)"动作.

2
AI 检查权限

是否允许此动作? 它是否启用了? 当前用户是否有正确的角色 ?

3
AI 收集参数

动作需要订阅身份,AI从客户背景中查找或询问客户.

4
确认

对于破坏性或高影响的行动,大赦国际要求在执行前予以确认。

5
执行

动作唤起外部平台 API.

6
结果

AI向客户报告结果.

行动类型

读取动作

查找数据而不改变任何内容。 例如: 列表_ 顺序, 获取_ 客户。 安全, 不需要确认 。

写入动作

创建或修改数据。示例:创建_ticket,更新_顺序。可能需要确认。

删除动作

删除数据。 例如: 取消_ 订阅。 总是需要确认 。

HTTP 动作

以行动宣布。json,通用 API 以声明方式发出电话。

能力标记

可选的每个动作"能力"领域在动作中.json,一个连接器中性类标签(例如"tickets"用于读取/抬头的票,"tocket_create"用于开票).OpsIQ 将全班统一关入每个连接器:当操作员关闭AI 车票意识时,票读退出AI,而票的创建则被保留给 OpsIQ 自己的作曲家( 所以连接器的创建工具不能复制它) 。 声明它和您的连接器符合 。OpsIQ 不需要知道您的动作名称 。 连接器构建器将它暴露为每个动作的能降 。

代码动作

已执行, 位于连接器类中的 PHP。 完全控制逻辑 。

动作定义示例
{
  "lookup_order": {
    "label": "Look up an order",
    "description": "Find an order by ID or email",
    "method": "GET",
    "endpoint": "/admin/api/2024-01/orders.json",
    "params": {
      "order_id": { "type": "string", "label": "Order ID" },
      "email":    { "type": "email",  "label": "Customer email" }
    }
  }
}
连接器

构建连接符

连接器构建器允许您为任何带有 REST 的平台创建完整的连接器 API。基本连接器不需要编码。

构建连接符
连接器构建器无代码连接器形式: 名称、 认证类型、 碱性 URL,动作映射, 通过测试和发布按钮。连接器构建器工作空间连接器构建器名称我的平台认证OAuth 2.0 (PKCE) (韩语).基数 URLhttps://api.example.com/v2行动GET/customers →列表客户(_C)测试通过软件包连接器1NO-CODE名称、 认证、 基础 URL2ANY API钥匙,熊鼠,基本,HMAC, OAuth3PUBLISHInto /connectors/<slug>/
指向任何 REST 的构建者 API 设置认证, 基础 URL 和动作,测试它,并发布一个工作连接器。不需要代码。

完整供应商 API 覆盖范围

每个生成 API 连接器可以显示独立的原生 API 阅读和土著 API 写入动作 。 默认动作仍然优先; 本地动作覆盖后加的提供者端点 。JSON,形式, XML 生的多部分活体,有捆绑的花纹,API- 版本头和一能,同时将资质保存在工作空间连接器设置内。

⚠️
采购网包来源于 /marketplace_connectors 和捆绑的, /connectors. 增加包版,再生合同和文档,运行符合性测试,再重新签名并发布新的"市场"版本.

连接器构建向导

向导有六步, 显示为横跨顶端的标签。 您可以在它们之间自由跳动, 保存草稿 脚印上随时保留你的工作

1
身份和概况

名称、 swit、 描述和图标, 然后选择合同配置文件: 标准API、商务、服务台、邮箱、站点情报、SaaS桥、当地PHP平台,或 平台没有 API 当平台没有可调用服务,并且 OpsIQ 需要安装桥。配置文件选择了一个完整的能力起点; 您仍然可以调整个人的能力。

2
认证

选择平台使用的认证模式并填入其字段。 在此输入真实的测试证书: 它们被用于下一步的连接测试, 并且不会在您发布后存储 。

3
测试

输入 API 基础 URL 和验证端点,然后使用从步骤开始的证书进行实时连接测试2。在定义任何动作之前这样做,如果认证或基础 URL 错误的,你之后写的每一个动作都会因为同样的原因失败,并且会调试错误的东西.

4
行动

定义每个操作: 名称、 HTTP 方法、 终点路径、 参数、 响应字段映射, 以及下面描述的可靠性设置。 您可以针对活性运行每个动作 。API 从这一步。

5
触发器

映射您平台发送到的 Webhook 事件 OpsIQ 事件,所以发生在您的平台上的事情可以开始工作 OpsIQ.

6
审查、企业合同和出版

Review every action, trigger and capability. Enterprise profiles expose the generated queue, worker, hook, migration, ticket-mirror, attachment and conflict contract before publishing. Publishing writes the package into /connectors/<slug>/.

⚠️
出版不运行兼容套件。 出版只验证向导表, 并发出警告而不阻断。 完整的套件 — 清单、 能力文件、 身份卡和桥接剪切检查 — 会在您按 Dry- 运行时运行, 并在安装时再次运行。 在您飞船前按 Dri- 操作。 每次都按 Drain- 。

出版的作品并没有显示表格

发电机的五种行为让人惊讶。没有一个是虫子;如果偶然遇到它们,所有它们都会花费你一个下午的时间。

一个问题决定了通过:平台是否服务于API?

分步回答,你先说1通过选择数据访问模式(或“没有的公式”)API" 简介"。API模式声明 native_api and emits the <slug>_api_call passthrough. Bridge mode declares platform_bridge 而不是沙发 native_api 即使一个更古老的规格 带有它 所以表 生成的阶级和专长 ai_brain_aware 以两种方式添加。

沉默意味着"它有API"

建设者遵循你的回答;它不能为自己解开真理,而虚无的默认是:API模式。所以没有。API平台必须实际如此说——选择“没有的公式”API" profile, 设置数据访问桥接, 或是勾选 platform_bridge; any one of the three is enough and they cannot contradict each other. Skip the question on a platform with no API and you are back to the old failure: a dead <slug>_api_call the model keeps reaching for. This used to be stamped unconditionally, so the trap is now escapable rather than gone.

连接测试默认要获取/ping

如果您将校验路径留为空, 构建器会写 /ping 输入生成的连接器和配置文件。json'' 测试块。 几乎没有真正的平台服务该路由, 因此测试连接失败了 HTTP404在每次安装和读取时, 都像一个客户配置错误而不是包缺陷。 设置一个验证路径, 您的平台实际上会回答这个问题。 对于桥连接器, 请用自己的诊断端点来显示它 。 它在一个呼叫中证明了整个链: 桥被部署, 密钥匹配, 桥可以到达数据库 。

重新出版仍覆盖您的手版

现在的能力遵循数据访问的答案,所以这些不再漂移。其他生成的都仍然如此:编辑ContextProvider. php或其他任何已出出的文件,然后在下一次发布时替换它。保护的例外是桥文件——向导只覆盖一个带有自己标记的桥,所以手写一个则留下了。

重新删除文件

取消选中一个功能, 然后下一次发布会删除其提供者文件。 手动编辑到任何生成的文件 — Context Provider.php 最重要的是 — 在不发出警告的情况下被覆盖。 复制自定义, 或者通过删除来获取软件包的所有权 。opsiq- 建筑师。json(之后巫师将不再管理它).

总是预览

向导对它没有控制。 打算作为生产载运的软件包必须在设置中手动改变释放_ 状态 。json——编辑时会断开签名,所以之后会重新签名.

签名证明完整性,而不是来源

构建器包与此安装的对称密钥一起签名。 这检测到篡改。 它不能证明谁写了包, 而任何持有相同密钥的安装都可以产生相同的签名。 将本地签名的包当作自签名 。

仅检查一棵树的相撞情况

发布拒绝一个已存在的 slot 。/connectors/.它没有看/marketplace_connectors/,因此手写出同一种弹片的一党套件,最终可以被阴影所笼罩.

💡
向导没有知识授权步骤。描述您平台的知识文件是从您定义的名称、描述、 认证类型和动作中生成的, 当连接器启用时它会被加载到 AI 中 。

定义动作(步骤) 4)

每个动作都有以下设置: 只需要前四个; 其他控制器可以由谁运行, 以及操作时的谨慎度 。

动作键和标签

关键是AI所说的;标签是人类读取的. 关键词与你的连接器弹簧自动相隔,因此两个连接器都可以有一个"list_orders"而不会相撞.

HTTP 方法

得到,邮, 点, 帕奇或德利特。

URL 路径

附加到基地内 URL。使用时 {name} 用于占位符,例如 /opportunities/{id}/stage

参数

您还选择每个参数的去向 : 体型, 路径, 查询 或 单 。路径参数填充 a {placeholder}; 查询参数附于 URL.

反应绘图

请说 JSON 响应中的哪个字段意味着什么, 谁是客户名, 是电子邮件, 是命令的总数。 这就是让 AI 读取您平台的数据而不是猜测它的原因 。

谁能用得上呢

您的团队( admin AI) , 签入客户( 客户聊天) 、 两者兼有, 或写入助理。 客户动作只为签入的客户运行, 而身份域自动锁定在他们身上, 这样一客户无法询问另一个客户 。

需要确认

行动开始前,人类必须批准

破坏性

将动作标为删除或更改状态。 用于运行前警告 。

要求的许可

管理员必须持有此权限, 才能让 AI 代表他们运行动作; 完整的管理员总是通过。 从管理_ 整合、 管理_ 一般、 管理的_ 帐单、 的管理_ 销售_ 桥牌、 控制_ 知识、 处理_ 出现、 管理和_ 管理- 危险区、 答复_ 聊天、 升级_ 到_ ticet、 发送_ agent_ 电子邮件, 或者没有, 意思是任何认证的管理员 。

描述/ AI 提示

可选但值得写作。 它告诉AI何时可以达到此动作, 例如“ 当管理员要求更改交易阶段时使用此动作 ” 。 一个好提示是AI正确使用的行动和它忽略的行动之间的区别 。

能力

可选的班级标签,或者票(一张票读取或查取)或者票_创建(开一张票)。OpsIQ 例如,当一个操作员关掉AI的票意识时, 隐藏票就立刻打开整个班级的门。

列表路径

可选。 对于返回列表的终点, 数组的点化路径, 例如数据或数据 。

错误路径

可选。 存在意味着呼叫失败的天体字段, 例如错误. message, 对 APIs 返回的 HTTP 200 失败。

运行它

每一个行动都可以对着现场进行 API 从这个步骤,所以你可以在别人使用之前修补错误的路径或字段名称.

⚠️
写入动作默认保护。 使用 POST、 PUT、 PATCH 或 DELETE 的任何动作都需要管理_ 整合权限 财务报告和已审计财务报表 运行前的人类确认。 这是刻意的。 新的写入动作失败了, 而不是让 AI 更改您的数据而不受监督。 您可以在操作中同时更改, 但故意更改 。
💡
要从客户聊天中调用,动作必须只读:既需要确认,又不刻意破坏。 客户也可以触发改变状态的行动不是巫师会让您意外运送的东西。

接收网点( 步数) 5)

触发器的台阶给你一个网球 URL 并核实所有到来的请求

签名页眉

您的站台标头, 例如 X - Hub - Signature -256.

签名算法

HMAC-SHA1,HMAC相接器-ShA256或HMC-Sha512.

签名计划

简单,一种平地六氧化物或基质64的文摘。Stripe- 样式, t=., v1=...Stripe和几个平台复制它。

签名前缀

可选。 有些平台在摘要前加了 sha256=等字样。 如果您没有的话, 请留空 。

事件绘图

映射您平台发送到的每个事件 OpsIQ 事件,它应该提高。

自动注册网页

如果你的平台有一个 API 用于管理自己的网络用户,您无需注册 URL 手动打开 启用时自动注册此 Webhook 并指向两个你所定义的动作4:

创建- 网页动作

当管理员启用连接器时调用。 您给出了带该连接符的参数名称 。URL,可选地包含事件列表的,以及响应中持有新webhook id的路径.

删除网路动作

连接器被禁用时调用,使用上面所捕获的ID,因此连接器也停止了将您的平台发送到死端.

能力,你可以打开

配置和容量由连接器合同定义 2.2 产生和申报的能力直接被排放;企业能力产生 EnterpriseExtension.php 带有跑时寿命周期接线的脚手架.

行动

AI可以在您平台上运行操作:列出订单,找到客户,发出退款.

触发器

接收您平台上的网络呼号并将其转换为 OpsIQ 事件。

人工智能机票

AI Triage 和 在您的平台上停留的票的回复副驾驶。 选择一个端点, 并用它的答复返回一张票, 绘制场景地图 ; OpsIQ 读取线程通过它。

邮箱和联系人

将客户的邮件显示在他们的时间表上, 从交易中发送, 并同步您的地址簿到 OpsIQ CRM(英语:CRM (film)).

客户导入

通过您的客户列表页并导入每个列表为 OpsIQ 联系人。 这是导入按钮运行的 。

内容

把直播数据从你的平台 推到每个AI的对话。

身份

查查客人是谁 出示他们的相貌和买票

销售和账单

将收入事件和MRR数字输入 OpsIQ 仪表板.

入场券

将您的平台通过webhook发送的门票和电子邮件转换为 OpsIQ 支持线程。

境外答复

员额 OpsIQ 工作人员回信到平台 线程的源头。

同步用户

将您的员工账户导入 OpsIQ 管理员用户。

同步部门

将您的支援部门导入到 OpsIQ.

推广目标选择和产品饲料

让升职工作室的目标 了解一个人的事实 并让你真正的产品 在升职。

调查工作室供应商

曝光服务器验证的勘测事实、逃出变量和界限CRM通过一个专门的SurveyProvider.php向受援方提供网页。这不会重复“促进”运行时间。

原生的 。IP 屏蔽

何时 OpsIQ 块a IP,拨打您的平台自己的块 API 所以这个街区也在那里被强制实施。

安保活动

接收被屏蔽的...IP 威胁信号来自 OpsIQ.

AI的平台知识

每一个连接者都造船 一个简短的参考,描述你的平台是什么,它的行动是做什么的。OpsIQ 当连接器启用时, 管理员 AI 读取它, 因此它理解您的平台, 而不是只看到一个动作名称列表。 这是为您生成的 。

API 传球

您的连接器总是得到一个通用的呼叫, 以便AI能够到达一个您没有定义输入动作的终点。 在您可以时使用输入动作; 这是逃生舱口 。

Canonical 连接器合同 2.2 参考文献

合同版本 : 2.4 · 57 capabilities · 8 profiles.

连接器配置文件

standard_api · Standard REST or GraphQL API

Actions, triggers, OAuth/API-key authentication and optional context/identity mappings. Capabilities: actions, triggers, native_api, ai_brain_aware.

commerce · Commerce and billing platform

Customers, orders, sales, subscriptions, billing, promotions and journey events. Capabilities: actions, triggers, journey_events, sales, sales_reconciliation, billing, sync_orders, customer_import, survey, promo_audience, promo_feed, context, identity.

helpdesk · Helpdesk and ticket platform

Inbound tickets, outbound replies/notes, customer roster, AI triage and bidirectional ticket mirroring. Capabilities: actions, triggers, inbound_ticket, outbound_reply, outbound_note, ai_tickets, customer_import, survey, context, identity, ticket_mirror, ticket_merge, attachment_bridge, conflict_resolution.

mailbox · Mailbox and email provider

Inbound/outbound mail, address-book sync, multi-account OAuth and CRM timeline integration. Capabilities: inbound_email, outbound_email, mailbox, email_mailbox, oauth, actions, customer_import, ai_reply.

site_intelligence · Site Intelligence data provider

SEO, analytics, search-console, local-search or monitoring provider with scheduled sync. Capabilities: actions, triggers, site_intelligence, seo, scheduled_workers, durable_queue.

saas_bridge · SaaS bridge

Deep two-way SaaS integration with customers, billing, identity, tickets, webhooks, queues, attachments and workers. Capabilities: actions, triggers, webhook, context, identity, customer_import, survey, journey_events, sales, sales_reconciliation, billing, inbound_ticket, outbound_reply, ticket_mirror, ticket_merge, attachment_bridge, durable_queue, scheduled_workers, database_migrations, conflict_resolution, enterprise_hooks, admin_assets.

no_api_bridge · Platform with no API (OpsIQ installs a bridge)

For a self-hosted PHP application that serves no callable API. The wizard generates a signed bridge file the operator drops into their own site, plus the typed actions that read and write through it. Capabilities: actions, platform_bridge, ai_brain_aware.

local_php_platform · Local PHP platform bridge

WHMCS-style local hooks, database access, two-way tickets, billing/customer sync, queues and migrations. Capabilities: actions, native_data, context, identity, customer_import, survey, journey_events, sales, sales_reconciliation, billing, inbound_ticket, outbound_reply, ticket_mirror, ticket_merge, attachment_bridge, durable_queue, scheduled_workers, database_migrations, conflict_resolution, enterprise_hooks, admin_assets.

警械能力

动作

Universal actions. Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: actions.json.

触发

Inbound event triggers. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Package files: actions.json.

网络浏览

Inbound webhook endpoint. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook.

journey_events

Universal Journey Event Contract mapping. Capability version: 1.1. Mode: generated. Interfaces: OpsIQ\Connectors\JourneyEventConnectorInterface. Package files: settings.json.

上下文

AI context providers. Capability version: 1.0. Mode: generated. Runtime methods: contextProviders. Interfaces: OpsIQ\Connectors\ContextConnectorInterface. Package files: ContextProvider.php.

guest_lookup

Guest record lookup without login (reference + proof match). Capability version: 1.0. Mode: generated. Runtime methods: contextProviders. Interfaces: OpsIQ\Connectors\ContextConnectorInterface. Package files: GuestLookupProvider.php.

身份

Admin/customer identity providers. Capability version: 1.0. Mode: generated. Runtime methods: identityProviders, detectAdmin, detectCustomer. Interfaces: OpsIQ\Connectors\IdentityConnectorInterface. Package files: IdentityProvider.php.

sales

Sales and revenue ingestion. Capability version: 1.2. Mode: generated. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface. Package files: SalesIngest.php.

sales_reconciliation

Scheduled sales-ledger reconciliation against the platform. Capability version: 1.0. Mode: generated. Runtime methods: reconcileSales. Interfaces: OpsIQ\Connectors\SalesReconciliationInterface.

账单

Cross-platform billing snapshot. Capability version: 1.0. Mode: generated. Runtime methods: billingProviders. Interfaces: OpsIQ\Connectors\BillingConnectorInterface. Package files: BillingProvider.php.

payments

Payment-provider capability bus. Capability version: 1.0. Mode: generated. Runtime methods: paymentsCapabilities.

商业

Sell through chat: canonical commerce role map. Capability version: 1.0. Mode: declarative. Package files: commerce_roles.json.

inbound_ticket

External ticket/email to OpsIQ ticket ingestion. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.

outbound_reply

Reply mirroring to the external platform. Capability version: 1.0. Mode: generated. Runtime methods: pushReply. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.

ticket_merge

Ticket merges applied on the platform (native merge or private transcript note). Capability version: 1.0. Mode: generated. Runtime methods: mergeTickets. Interfaces: OpsIQ\Connectors\TicketMergeConnectorInterface.

sync_users

Staff/customer synchronisation. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface. Package files: SyncImport.php.

sync_departments

Department/team synchronisation. Capability version: 1.0. Mode: generated. Package files: SyncImport.php.

sync_orders

Order roster and order-event synchronisation. Capability version: 1.0. Mode: declarative. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface.

sync_products

Product, catalog and inventory synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

sync_projects

Project, issue and workspace synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

customer_import

CRM customer roster import. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers, backfillChunk. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface.

security_events

Receive and emit security events. Capability version: 1.1. Mode: generated. Runtime methods: securityCapabilities, syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.

security_native_block

Native remote IP/CIDR blocking. Capability version: 1.0. Mode: generated. Runtime methods: syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.

survey

Survey identity, audiences, recipients and variables. Capability version: 1.0. Mode: generated. Runtime methods: surveyAudienceCatalog, surveyAudienceFacts, surveyVariableCatalog, surveyVariables, surveyRecipientPage. Interfaces: OpsIQ\Connectors\SurveyConnectorInterface. Package files: SurveyProvider.php.

reply_feedback

Ticket reply feedback mirror (platform reply ratings land via the portal write method). Capability version: 1.0. Mode: generated. Runtime methods: replyFeedbackCatalog, pullReplyFeedback. Interfaces: OpsIQ\Connectors\ReplyFeedbackConnectorInterface.

promo_audience

Promotion targeting facts. Capability version: 1.0. Mode: generated. Runtime methods: subscribers. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.

promo_feed

Promotion product/content feed. Capability version: 1.0. Mode: generated. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.

email_mailbox

Mailbox bus, outbound mail and address-book sync. Capability version: 1.0. Mode: generated. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

inbound_email

Receive inbound email. Capability version: 1.0. Mode: declarative. Runtime methods: poll, handleWebhook. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

outbound_email

Send outbound email. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

mailbox

Mailbox connector. Capability version: 1.0. Mode: declarative. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

ai_tickets

AI triage and Inbox Copilot for remote tickets. Capability version: 1.0. Mode: generated. Runtime methods: loadTriageContext. Package files: AiOperations.php.

ai_reply

AI-assisted reply drafting. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

ai_brain_aware

Connector expertise supplied to Admin AI. Capability version: 1.0. Mode: generated. Package files: ai_expertise_admin.md, ai_api_reference.md.

native_api

Native API passthrough. Capability version: 1.0. Mode: generated. Runtime methods: registerActions.

platform_bridge

Signed platform bridge (for platforms with no API). Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: bridge/.

native_data

Local database/platform data adapter. Capability version: 1.0. Mode: declarative. Runtime methods: nativeDataProviders. Interfaces: OpsIQ\Connectors\NativeDataConnectorInterface.

缩写

CRM capability provider (calendar, enrichment, telephony or customer data). Capability version: 1.0. Mode: declarative. Runtime methods: crmCapabilities. Interfaces: OpsIQ\Connectors\CrmCapabilityConnectorInterface.

block_registry

Remote sender block-registry synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: blockSender, unblockSender, isSenderBlocked. Interfaces: OpsIQ\Platform\BlockRegistryInterface.

inbound_comment

Inbound comment ingestion. Capability version: 1.0. Mode: declarative. Runtime methods: handleWebhook.

outbound_note

Outbound private note. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

outbound_notification

Outbound notification delivery. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

oauth

OAuth 2.0 authorisation. Capability version: 1.0. Mode: generated.

reviews

Review ingestion and response. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

当地

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

瑞奥

SEO data and actions. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

site_intelligence

Site Intelligence provider. Capability version: 1.0. Mode: declarative. Runtime methods: siteIntelligenceProviders. Interfaces: OpsIQ\Connectors\SiteIntelligenceConnectorInterface.

分析

Analytics data provider. Capability version: 1.0. Mode: declarative. Runtime methods: analyticsCapabilities.

comms

Communications/video-meeting provider. Capability version: 1.0. Mode: declarative. Runtime methods: commsCapabilities.

admin_assets

Connector-provided admin/account/public browser assets. Capability version: 1.0. Mode: generated. Runtime methods: adminAssets. Interfaces: OpsIQ\Connectors\AdminAssetConnectorInterface.

enterprise_hooks

Platform-native hooks and lifecycle callbacks. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

durable_queue

Durable outbox/inbox queue and retry policy. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

ticket_mirror

Bidirectional ticket mirror with conflict handling. Capability version: 2.0. Mode: extension. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface. Package files: EnterpriseExtension.php.

attachment_bridge

Attachment upload/download transfer. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

database_migrations

Connector-owned schema migrations. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

scheduled_workers

Connector-owned scheduled/background workers. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

conflict_resolution

Two-way sync conflict strategy. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

⚠️
构建器规格仍然是权威来源. 在生成的扩展点中设置平台专用业务规则; 包生命周期,队列,工人,迁移和符合性测试仍然是由构建器管理.

每项动作的可靠性设置

复试

重复试一次失败的呼号多少次,每次尝试的后退都加倍。只有超时, 429s 5xx错误被重审; 4xx是您的要求的错, 重复它只会烧掉你的利率限制。

费率限制

每分钟有一个上限,所以一个忙碌的触发器不能击打您的平台。0以无所限.

超时

等了多久才能放弃

确认

行动开始前需要人批准 用它来破坏一切

认证类型

步骤2提供七种模式。选择匹配您的平台的 API 文档,生成器会为它发出正确的 HTTP 客户端。

API 信头中的密钥

静态密钥作为固定头发送, 例如 X -API- Key. 您给出了页眉名称, 并且应该显示管理员表单的标签。 这只作为页眉发送密钥; 如果您 API 将密钥作为查询参数,然后使用自定义头或全码连接器。

持牌人 签名

Token sent as Authorization: Bearer <token>. Common for modern APIs.

基本认证

用户名和密码, 已编码为授权页眉的基数64。 您选择管理表格上显示的这两个字段的标签 。

HMAC- 签名

公钥加密钥, 请求机构签名。 您会给签名头、 密钥头和您平台所期望的时间戳头 。

OAuth 2.0 (客户全权证书)

服务器到服务器, 没有用户交互和方向调整。 您给出了符号 URL 和可选范围; 管理员提供客户端的ID和秘密。 当您的平台向一个应用程序而不是向个人颁发证书时使用此功能 。

OAuth 2.0 (接合按钮)

与 PKCE 的授权码流,用于Stripe, Shopify, Slack和快书式的应用程序。您授权URL,标志URL。发布后,管理员点击连接器上的连接,在您的平台上授权,以及OpsIQ存储刷新令牌和薄荷访问令牌。URI注册到您OAuthapp在连接器的设置页面上显示.

自定义信头

免费形式 JSON 上面所有图案的页眉映射没有覆盖, 例如 {' X-API- 钥匙":"{api_key}"","X-特南特":"......{tenant_id}} 每一个占位符都变成管理表上的字段 。

💡
PKCE只应用于 Connect-按钮流,客户端-证书流没有方向和用户步骤,因此PKCe不应用.

贴花样式

偏移

用途抵消和限制参数。100 限制( L) :50.

页次

使用页码。 例如:?page=3per_page= (P) (中文(简体) ).50.

光标

使用来自上一个响应的光标符号 。

链接页眉

使用有 rel="next"的链接响应头.

高级: 自定义 PHP 代码

连接器.php Returnens 是一个实例。 它不声明一个命名的类OpsIQ猎取。下面的方法名称是 Connector Interface 所需要的; 错误的操作是致命的,而不是警告。

连接器. php——真实合同,最小且可操作
<?php
/* connectors/myplatform/connector.php */
declare(strict_types=1);

use OpsIQ\Connectors\AbstractConnector;

require_once __DIR__ . '/Client.php';

return new class extends AbstractConnector {

    /* ── the three identity methods. NOT identifier()/label(). ── */
    public function slug(): string        { return 'myplatform'; }
    public function name(): string        { return 'My Platform'; }
    public function description(): string { return 'Orders and customers from My Platform.'; }

    public function capabilities(): array { return ['actions', 'context']; }

    public function settingsSchema(): array
    {
        $f = __DIR__ . '/settings.json';
        if (!is_file($f)) return [];
        $j = json_decode((string)file_get_contents($f), true);
        return is_array($j['settings'] ?? null) ? $j['settings'] : [];
    }

    /* ── NOTE THE ARGUMENT. testConnection() with no parameter is a fatal. ── */
    public function testConnection(array $settings): array
    {
        try {
            $resp = \OpsIQ\Connectors\MyPlatform\Client::callWithSettings($settings, 'GET', '/me', [], []);
            $code = (int)($resp['http_code'] ?? 0);
            return ($code >= 200 && $code < 300)
                ? ['success' => true,  'info'  => ['message' => 'Connection OK', 'http_code' => $code]]
                : ['success' => false, 'error' => "Verify endpoint returned HTTP $code"];
        } catch (\Throwable $e) {
            return ['success' => false, 'error' => 'Test failed: ' . $e->getMessage()];
        }
    }

    public function onEnable(array $settings): array  { return ['success' => true]; }
    public function onDisable(array $settings): array { return ['success' => true]; }

    public function handleWebhook(array $payload, array $headers, array $settings): array
    {
        return ['success' => true, 'note' => 'No triggers declared.'];
    }

    /* Inherited from AbstractConnector: reads actions.json for you.
     * Override only to ADD actions the manifest cannot express. */
    public function registerActions(array $settings): array
    {
        return parent::registerActions($settings);
    }
};
⚠️
Three things that fatal at class load rather than failing gracefully. The identity methods are slug(), name() and description() — not identifier() and label(). testConnection() TAKES an array of settings; a no-argument version is an incompatible signature. And there is no $this->http() or runAction() on AbstractConnector — HTTP goes through your own Client.php or through an action declared in actions.json.

镜票进入本土票系

当你的平台拥有一张票, 镜像到 OpsIQ 从连接器中, 使用您连接器继承的连接器( 为新票创建, 附加备份以备后续) 。 发送并订阅连接器中的通用门票事件 。 subscribers() 方法, ticket.created, ticket.replied, ticket.updated, ticket.deleted自动重写、升级、SLA和CSAT都勾上同样的事件,所以你没有额外的代码来继承它们。

如果你处理 ticket.deleted,您还处理合并。 合并票的删除载数 merged_into 而不被送到一个连接者那里,而该连接者将宣布 ticket_merge;合并后,将一度作为 ticket.merged 而不是关闭合并的车票。 车票合并能力( 2.4).

说是谁写的开场白

票总是这样 备忘 ,但开通信息可能由下列人写出: 工作人员:代理开票人代表客户,或主动联系。每个服务台都支持这一点,因此属于通用 ticket.created 而不是每个连接器私下解决的

author_type

客户端(默认)或管理者。关闭它和客户被假定。

author_id

作者_type=admin时的员工代号,从未出现过客户代号.

author_name

特工或部门显示名,回"员工"

author_email

代理地址 永远不要给客户地址 客户电子邮件下的工作人员信息是报告和审计错误

这不是化妆品。 消费者读取 author_type 工作人员撰写的开幕词报告为: client 自动复制机可以回答你自己的经纪人写的信息 让你的平台的回声看起来像新的客户信息 然后它作为复制品降落 然后翻转票到 已回答( E)。将您的平台信号映射到连接器的上方 事件常态永远不要在消费者。

集中封堵

当代理者封锁发送者时, 则适用于整个 每隔一段时间 频道( 电子邮件、 聊天、 传送口、 部件和每个连接器双向) 因为块是集中执行的, 在任何连接器看到消息之前。 您的连接器通过不做任何工作来继承它。 没有输入的工作可以执行, 也没有任何方法弄错 。

选择的半边是 出入境: 告诉你的平台被封住。 只有您的平台能够表达等同的东西时, 才会执行 。

能力()

包含块_ registry 和 类必须执行 Block Registrict Interface。 旗帜是要求的; 接口是保证的。 注册需要两者。

blockSender($b)

接收类型( 电子邮件- domain- )ip, 值, 理由, admin_id, 过期 _at, site_ key. 返回 [结果, 细节?, 远程 ref?]。

unblockSender($b)

相同的有效载荷,必须具有"一能"性,解锁从未被阻断的东西是无用的,不是错误.

isSenderBlocked($b)

为了核对,漂移是由客户报告而不是发现的。返回[结果被封 。

结果值

ok

应用在您的平台上。 如果您有值得录制的ID, 请包含远程信息 。

noop

已经进入了请求状态

unsupported

您的平台没有等同的概念, 不是错误 。

失败

你本可以这么做的,但结果却错了。请详细介绍,它会进入审计线索。

衰落是正确答案。 许多平台没有“封堵这个发送者”的概念,只提供AccooUNT中止,它停止了计费、登录和服务,而不只是支持邮件。将“代理屏蔽了垃圾邮件地址”映射到“关闭客户账户”上,会让一个错误点击的块终止付费客户的服务。如果这是您唯一的杠杆,请返回 unsupported 且别取.

下降还涉及平台的情况 能够 做吧,但不会让你的,检查一下 API,不是特性: 仅存在于平台的管理员UI中的杠杆是连接器没有的杠杆.

工作实例- Zendesk(参考执行)

读取 connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

电子邮件→罢

点点 /api/v2/users/{id}。一个被暂停的终端用户的新请求会转移到悬停出票机上,而不是打开一张,这与屏蔽发件人的想法完全相同,并且由于 Zendesk 终端用户没有,它不会停止计费。返回用户代号为远程_ref。

域 → 不支持

Zendesk Can 暂停整个域名, 但只能通过暂停: 管理中心块列表文本区域中的关键字, 而否 API 写入字段。特性存在;杠杆没有。

ip →不支持

没有票级 IP 块存在。

未知地址( N)→无

Zendesk 不能预先悬停它从未见过的地址,没有事情可做不是失败,当地块仍然会停止出票.

代理或管理员→不支持

暂停工作人员将一个同事锁在服务台之外,到达一个综合清单的工作人员地址比指示更有可能是一个错误,在您采取行动之前检查一下角色。

合同不能阻止你绘制一个街区图,让破坏的东西,所以每个连接器必须自行决定它会拒绝什么。 detail 操作员可以读取,可以跳出服从。

老实报告 注意这些行有多少 ok。这是正确的结果,而不是空白:一个域块仍然起作用(它被写入时在核心中执行);它完全不能被反射出。返回 ok 你没有做的事情 会告诉一个操作员 块到达你的平台 当它从未离开 OpsIQ.

规则

本地的街区总是赢

命令之前,它已经写好了,无论你返回什么地方,都站着。你不能阻止操作员阻止别人。

永远不要扔

丢弃被视作不支持和记录。 返回失败, 但细节却有误, 因此原因仍然存在 。

做个有本事的人

同一区块可不止一次宣布。

赶快回来

Fan-out 与操作员点击同步. QQ 慢工作而不是将请求打开.

别再打回去了

永远不要重新封锁到 OpsIQ 从您的处理器。 注册会跳过原连接器, 但第二跳会循环 。

每封公告都会写给 opsiq_block_registry_log (操作,类型,值,理由,管理员,出处,接通器弹出,结果,细节和时间戳)这样一个操作员就可以看到一个块从你的平台而并非从代理中被到达,以及每个连接器对此所做的.

正确按下附件

手拿开 attachments 要创建的阵列( )/addReply(). 每个项目都带有三个形状之一的文件:

content_b64

RAW文件字节的 Base64,用于认证后的文件(多为输入的大小写). OpsIQ 为您解码并重置文件。 最便携的形状 。

url/ 来源 url

公众 https URL (例如 Zendesk 内容_url) 。 必须为 https; 在存储前通过 SSRF / 允许列表检查 。

stored_path

您已经写过的文件引用( 本地作曲上传者生成的) 。

Items also accept filename, mime_type and size_bytes. Caps: 12 MB/file, ~24 MB total, 10 files per call. Most platform read APIs return attachment 仅文件名 (不是字节),所以可靠的输入模式是:读取您代码已经运行的字节(在平台内,或从网络呼克有效载荷),基数64,并把它们作为运输工具运出. content_b64 活动上。

出入境(OpsIQ →- 说吧,你的平台。 当代理员附上文件时, ticket.replied 有效载荷将回复文件作为 stored_path 方案下所列项目 OpsIQ 文件存储 。 读取它们并按您平台自己的格式, 检查平台文件, 编码事项 : WHMCS 想要吗 base64_encode(json_encode([[name,data]])) (JSON; Zendesk 上传原始字节到 /uploads.json 用于一个符号,然后设定 comment.uploads; Gmail 发送多部分/混合 RFC -822 消息基础64url- 编码于 raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

远程平台 : API + webhook, 永远不要其他应用程序的表格

如果你的平台是一个 单独的应用程序或数据库 (一个托管的SaaS,一个远程 WHMCS,同一服务器上不同的 DB , 绝不直接写表格: 一个跨数据库在任何连接上写出正在活动并且默默地想着真实行的 Lands。 总是 : 出入境 呼叫平台的签名 REST API (副本、状况、部门、删除); 入境 = 平台 POST 签名的网络呼号, 您的 handleWebhook() 校验一下,然后发射火柴 ticket.* 事件。为了停止镜像循环,请用原出地标记标记所推出的东西(例如: mirror_origin:'opsiq'); 平台在webhook上回响它,而您的入境处理器跳过自己的回声。 请检查 OpsIQEvents::isMirroredEvent() 在每个操作者的顶端。

镜像状态、 优先级和部门

回复自动移动状态, 一种 代理商 回复→ answered, a 客户 回复→ customer_reply; 反射同样的方式。对于明确的更改,请订阅 ticket.updated 读取 payload['changes'] (例如, {status:'closed'}).

状态 : OpsIQ 条子集是 open, customer_reply, answered, in_progress, pending, closed。保留一张小的双向地图,以查看您的平台词汇,并确保您的列实际接受您所写的数值(一个 ENUM 缺少一个值会被一些数据库静静地降为空。 部门: 联 合 国 OpsIQ 部门ID是毫无意义的 在你一边, 永远不要寄出去。发送描述符(name, email 财务报告和已审计财务报表 slug并用电子邮件解决你们自己的部门的问题,→名称→弹道,所以"Billing Department"在 打开 计费部门而不是 常规。触发两个 ticket.escalated 和a 数据 department_id 变动 ticket.updated.

💡
状态/优先级/主题/部门/删除镜像由每个连接器切换器(mirror_status_changes,镜像-proference_chings,镜象-subject_chengineers,镜花-部门-changers,鏡花-去取取取)通过共享读取. OpsIQ\ Connectors\ Mirror 选项帮助器。 在您的设置中嵌入该块 。json 每个票迷的连接器 都读取同样的切换。

将一张票与产品/服务连接

如果客户在开票时选择了特定产品,请在提示上盖上印出提示,使代理商看到有重点的服务卡(其余的则使用一击"查看其他产品"模式). 傳出其中任何一個以建立(:

related_service_id

Preferred: the service id exactly as it appears in your IdentityProvider::lookupCustomerServices() list (each service's id). Unambiguous match.

related_service_label

平台服务码,例如: WHMCS S396(服务)396)/ D11(域名)11). OpsIQ 解析可选的字型字母+ id,并与您的服务列表相匹配,并设置一个类型守护,所以域名代码永远不匹配同一码的产品。在每项服务上显示匹配的对应比对以进行精确匹配。

related_domain

一个域名; 匹配为子字符串, 以对抗每个服务的细节/域.

💡
以上方形状构建附件列表一次,以及 OpsIQ 处理其余部分: 主机 URLs 并重新为您存储和托管了基础64的内容。您不需要写入每个平台的文件处理。
⚠️
动作键是小写字母、数字和下划线。构建器接受3改为:80字符, 并允许点; 动作商店接受2改为:100没有点的字符,所以要保持字母、数字和下划线,同时满足两者。添加一个动作不会产生 AJAX 路由,因此没有任何东西可以再生——重新保存连接符并同步。

让人工智能帮你建吧

不需要用手填写六步。用您自己的单词描述连接符 。OpsIQAI起草整个规格,通过向导使用的同一验证器运行,并在将任何内容写入磁盘之前向您显示计划。有两个位置可以完成,它们会生成相同的软件包。

巫师的

打开 连接器→+ 添加连接符→构建连接器步骤中1你会看到 ✨帮我盖好键入连接器用于什么——平台,什么OpsIQ应读和它应该写什么,以及谁使用它——加上API根, 如果您知道, 按下它。 向导会从草稿中填入每个步骤, 然后按您输入的顺序审查和编辑 。6面板显示为 ✨完善AI,因此可以要求更改("也读取发票"),而无需编辑字段.

通过问OpsIQ

打开 询问 OpsIQ 管理器中的任何地方的副驾驶都说出自己想要的东西。你不需要命名动作,也不需要知道向导的存在。

1
问吧

例如:"为特莱洛建造一个连接器,它应该列出我的板和列表,读取卡片,并在一板上创建出一张卡片. 特莱罗使用一个API副驾驶在句子中回答并显示 起草此连接符 。您的信息是简短的,所以将平台、读取和写作放入其中。

2
确认草案

还没有写出来。副驾驶起草规格,验证它,并用计划来回答:连接器做什么,它将暴露的行动(写出标记),所作的假设,以及你仍然必须回答的问题——通常需要提供哪些证书。草稿停在身份证下,可供使用。24小时。

3
说"建"

副驾驶显示 构建 card naming the connector and its slug. This one writes: it publishes the package into /connectors/<slug>/. Confirm it and you get the path back, together with the setting you still have to fill.

4
输入证书并启用

新连接器已发布但未启用, 它没有秘密。 打开其设置, 输入API键或符号,按 测试,则 启用直到你发现,它什么也没有。

💡
两张牌都需要点击。 草稿步骤完全没有写出; 构建步骤具有破坏性, 总是问。 AI 无法发布连接符、 启用一个或自行输入证书 。

AI是和不允许的

校验器是墙

已起草的规格通过完全相同的验证() 向导的出版按钮。 如果它没有通过, AI 会被赋予错误并再次尝试, 最多三次, 然后在验证器的自己单词中拒绝。 草稿永远不会变成包 。

写着没有证明

草稿名称为认证模式和设置字段; 它从未发明密钥、 令牌或秘密。 您会在连接器的设置页面上填写这些字段 。

回答问题,不是猜想

它所不知道的——你的账户ID,你计划暴露的两个终点中的哪个区域——作为对该计划的疑问而不是沉默的假设而回来.

发明的终点大出声失败

AI被告诉永远不要发明路径,但是没有模式是完美的. 错误的路径发布为在"动作"步骤或首次运行时失败的动作——它从来不是默默的成功.

包是普通的, 包里有东西

它生成的是普通的构建器包:相同的生成文件,相同的合同,相同的签名,在向导中可以编辑,从连接器页面中可以删除. 没有单独的"AI连接器"类型.

你的模特儿会写字

质量遵循您在设置下配置的模型→AI. 一个廉价的小型模型起草一个正确但平坦的连接器,并询问更多的问题;一个更强大的模型第一次获得更多的端点。在AI配置下修改它;其他的都不用改变。

⚠️
副驾驶只能运行此安装实际注册的动作。 如果缺少连接器构建器动作, 或者没有包含这些动作的计划 manage_connectors ——副驾驶说,而不是提供一张点击后会失败的牌.
连接器

通过聊天来销售:商业角色映射

一个可以出售的连接器——商店平台,预订系统,付款网关——宣布其OMN业务中的哪一个答案OpsIQ语法商业角色。 声明它和连接符出现在设置下→客户聊天→通过聊天自动销售; 停止声明并消失。 没有列表可注册 。

文件 : commerce_roles.json

宣言在自己的档案中保存在包根上—— 档案的存在就是索赔它不能生活于一个 connector_contract.json:文件由包装工具再生成,其计划拒绝未知的密钥,因此一个手加块会失败验证后被覆盖.

commerce_roles.json
{
  "commerce": {
    "roles": {
      "catalog_search": { "operation": "acme_search_products", "transport": "http" },
      "customer_lookup": { "operation": "acme_customer_lookup", "transport": "http" },
      "quote":          { "operation": "acme_quote_order",     "transport": "http" },
      "payment_methods": { "operation": "acme_payment_methods", "transport": "http" },
      "order_get":      { "operation": "acme_get_order",       "transport": "http" },
      "order_create":   { "operation": "acme_create_order",    "transport": "http",
                          "recovery": "acme_get_order" }
    },
    "customer_ordering": {
      "enabled": true,
      "version": 1,
      "mode": "direct_order",
      "audience": "clients_only",
      "account_flow": "existing_client",
      "payment_flow": "connector_methods",
      "identity_parameter": "external_customer_id",
      "quantity_parameter": "quantity",
      "label": "Acme Store",
      "checkout_hosts": [],

      "transaction_kind": "purchase",
      "decision_mode": "immediate",
      "payment_timing": "on_confirmation",
      "reversibility": "reversible",
      "cancellation_flow": "platform_only",
      "fulfilment_presence": "remote_delivery",
      "notify_flow": "platform_automatic",
      "customer_fields": {"name": "required", "email": "required", "address": "required", "phone": "optional"},
      "client_tools": ["catalog_search", "catalog_get", "quote"],
      "account_timing": "before_quote"
    }
  }
}

规则,以及为什么每个都存在

角色是封闭的词汇

OpsIQ从未从诉讼名称中推断出一个角色。没有宣布的角色不存在 — 声明是整个合同。

手术一定是你的行动之一

您的每个地图操作都必须存在 actions.json。一个打字机宣布一个无法运行的能力,它向客户显示为“我可以为你检查”之后,没有结果。

读出的角色从不指向破坏行动

读取角色(目录,可用性,引用,顺序查询)必须映射到操作中,不会改变您平台上的任何内容.

写角色从不映射到通用记录操作

绘图 order_create 插入: record.create, db.insert, recordCreate,任何拼写,任何分隔符——都是在结构上被拒绝的。一行直接绕过您的平台定价,股票锁定和确认邮件,生成一个您自己的系统并不完全相信的命令.

写作角色宣布恢复操作

答“ 我写过土地了吗 ” 的一等探头。 最危险的超时是您平台之后的一次可能已经创建了命令; 没有恢复探头, 唯一的选择就是重新试探失明或丢失它 。

提供商的付款角色承担了三项额外义务

直接与付款提供商交谈的软件包也必须声明 payment_profile (准确性、国家、方法和 环境 ——未申报的环境是测试整合如何获得活的薪酬), webhook_verify (供应商的真正签名计划;拒绝通用秘密比较)和 event_map (提供方事件到条形的。) 商家连接器只执行 record_payment (a) 接收已经核实的峡谷付款证据;

声明客户如何从连接的商店订购

商家连接器和付款出入口连接器是不同的合同。 已连接的商店客户端订购,选择平台可以证明的最深模式。选择在签名内包 commerce_roles.json; Store和客户端聊天在执行时重新读取它。删除一个角色或取消/取消连接符,因此使先前提出的提议无效,而不是留下僵硬的权威。

catalog_only

地图 catalog_search 或 单 catalog_get. OpsIQ可能搜索和解释产品,但它不能显示可执行命令或退货确认。每个软件包都处于这种真实的默认状态,直到它自己输入的报价和退货/订单动作通过更深的合同和“市场”认证;从不推断平台名称的交易支持。

platform_checkout

地图 quote 财务报告和已审计财务报表 platform_checkout商贸行为——不是OpsIQ核心-返回数 checkout_url, checkout_reference 和克尼特语的引文。URL必须是 HTTPS, 它的主机名必须匹配 customer_ordering.checkout_hosts 或 HTTPS 主机来源于 checkout_host_setting,引文可能仅存于15分钟。一个产品 permalink, 本地组装的推车URL或返回URL不是商家签发的离职单。

direct_order

地图 quote, order_create 财务报告和已审计财务报表 order_get,与 order_create.recovery。核心在行刑前立即刷新引文,提供一能键,并在每次未知结果后再重试后询问恢复操作。 payment_flow=opsiq_gateway,它必须另外绘制地图 record_payment 具有权威的恢复/回读操作。OpsIQ积极核查网关交易、匹配量、货币、商家和订单参考,一次写出供应商参考书,然后读回商家发票/订单。 mark_invoice_paid 状态切换因没有付款证据而被拒绝。创建动作必须引用平台本身的定价、股票和订单业务逻辑;原始数据库写入被拒绝。

身份验证,以及操作员可以改变什么

当 OpsIQ 拥有支付时,聊天客户必须联系 email_otp 在建立命令之前——OpsIQ电子邮件 a6- 数字代码和要求它。这不是一个连接器选择退出的东西;它是执行内核要求的保证底线。 order_create.

唯一例外,谁控制它

操作员只有在连接器宣布时才可接受未经验证的地址 fulfilment_presence: customer_present酒店客人必须抵达,所以错误的地址会给收据带来错误,房间仍然在那里。 remote_delivery ——运出、提供、下载——无论操作员设置什么,都需要核查,因为价值仅靠地址的优势。 minimum_assurance 或 单 reversibility: irreversible 也取消了操作员跳过它的能力.

代码持续多久

默认的30分钟,操作员可配置自5分钟至24顾客看到现场倒计时 它们的自身 timezone, not the operator's. An expired code says so plainly and offers a new one rather than reporting an invalid code — a customer typing a correct-but-old code has made no mistake, and telling them they have sends them round the same loop.

客户必须提供哪些服务:客户-外地

姓名和电子邮件总是需要的,并且首先收集。 address, phone 财务报告和已审计财务报表 company as required 或 单 optional 以适合业务:船舶包裹申报所需地址的商店;旅馆申报所需电话,因为不能打电话的客人没有预订联系人。OpsIQ拒绝放置缺少所需字段的命令。 构建者会写出正常的地图, 包括基线, 因此磁盘上的合同是明确的 。

创建账户时: 账户_ 计时

at_order (默认) 允许订单写入首次创建买方账户。 声明 before_quote 当你的平台价格每个账户,WHMCS以客户的货币计算并引用客户个人的货币OpsIQ通过您的账户创建账户 customer_create 动作,一旦知道需要的字段,请为该账户提供报价,所以确认卡上会包含您实际开出的总发票。 account_flow: connector_signup.

助手获取, 它不会读取: 客户端_ 工具

随即发布创建命令,助理从不读取被粘贴的目录,它称为三个工具—— commerce_catalog_search (空询是产品家族的概况;超出限制的结果按名称列出), commerce_catalog_get 用于一个全部项目,以及 commerce_quote,这把薄荷纸通过连接器路径一直拥有的同一墙壁将签名的确认卡服务器侧面。每个动词一个工具,你的连接器作为参数,所以一个有六个连接器的商店可以得到三个工具而不是十八个。 client_tools 限制默认值; 缺漏意味着每个映射的默认值, 以及 a catalog_only 连接器从不引用。 确认从不是一种工具: 网上的卡片按钮, 准确 CONFIRM 并且没有模特儿说花钱

你的目录应该携带什么

id, name一种客户安全 summary, a category 或产品家庭(客户的单词就是这样找到一个名字为代码的物品), currency, unit_amount_minor, available,以及 input_schema 指定一个命令需要的字段。搜索时会根据客户的名词、家庭、周期和摘要对客户的语句进行评分。

拒绝的原因,客户可以采取行动

返回( E) {"success":false,"error":"…","missing":["domain"],"retryable":true} 当一个值错误或缺失时。拒绝名称 missing 或 单 retryable 到达客户逐字记录; 赤裸的失败是一般的, 所以内部没有泄漏。

地币和紧急站

当操作员打开 Geo 货币时( Client Chat)→客户使用平台自己的FX商店阅读价格,每张面值都是自己货币的 — — 聊天文本、网络卡、频道文本卡和店面的开口通货。 您的价格从未被替换:卡片显示的是店面总数旁边的访客数字,网关处理的正是它所显示的数量。 暂停所有销售 (安排)→Commercial)是杀机开关:目录,引文和取景保持开放;建议和确认每个频道的停站.

聊天时不卖

无法联系到商人

包的封条被打破: 文件在签名后被编辑了。 重新发布包。 安装的市场副本从未编辑过; 更新它来自市场面板 。

这条店的订单现在暂停

开关了,设置→商业→暂停所有销售。

此频道尚未可用排序

频道不选中客户可以购买的下方。 服务器日志为频道取名 。

助手描述一个项目,但没有卡片

引用工具被拒绝。 每一次通话都记录为 [opsiq][commerce][client_tool] 原因: 错误的项目 ID、 项不声明的字段、 被取去的域或商家自己拒绝。 在信任助手的解说之前先读日志 。

助理说不能看产品

该页面属于另一个工作空间。 每个网站部件属于一个工作空间, 商店连接器必须在那里启用 。

罐头回答而不是答案

“告诉我更多你需要什么”意味着AI提供者自称失败;AI History显示了这一转弯下的确切错误,而工具从未被接通.

连接器编辑不显示在聊天中

工人在一分钟内就重新循环代码更改,但一次对话会重放其最后一张卡片,开始新的对话来测试.

奈及利亚游客看到美元,

检查一下地表IP数据库已配置( Client 聊天)→(Geo)和访客的货币有FX汇率;没有汇率OpsIQ显示商店价格而不是错误的号码。

你的总和是唯一能转移钱的

引用带 unit_amount_minor, quantity 财务报告和已审计财务报表 total_amount_minor,而将第三种视为可以从前两种情况下产生,这很诱人。

quantity CUSTOMER选择了这个方法——一个房间,一个许可证,一个政策。你的乘数可以成为某种东西。OpsIQ从不看:晚上、座位、计费周期、距离、体重、等级。旅馆引用一个房间,每三晚为数量。1,单位105,000总计315,000. OpsIQ单位乘以数量表示的确认卡,显示客人105,000,然后对315,000同意一个数字而接受另一个数据是合同所能做的最糟糕的事。

规则

total_amount_minor 是唯一一个数字OpsIQ显示、指示、收费和核对 unit_amount_minor 如果你的总数不是你想要的,你的引号是错误的。OpsIQ因为一个你从未同意过 接受过帮助调整的总数

这对你的引用动作意味着什么

返回全局数字。 在回答前应用自己的夜、 分级、 折扣、 税费和收费。 如果您的行不对齐—— 单位乘以某些整数永远不能等于你的总数 。OpsIQ将整件事当作一行,按其实际价格处理,而不是制造出一个调和无所事事的分解.

6个答案使这个合同适合任何行业

以上申报开始作为商店的申报:购买某事,现在支付,它是你的,你可以取消。这四个业务中每一个都是假设某些真正的业务是不会分享的。银行转移资金是无法撤销的。保险人不能说“确认”直到承保人看齐。然后是商人的发票。一个诊所向不是病人的人开具账单。这些企业要么对自己的客户不实,要么根本无法联系。

所以一个交易连接器又回答了六个问题. 每一个都默认读取严格 说什么都不是总是安全的,决不是放任自流的,因为说什么都不是在作者没有考虑这个问题时所做的.

transaction_kind

purchase, booking, subscription, bill_payment, transfer, application, top_up, renewal词汇而不是行为:它决定了客户所读的字眼。拨打电汇“订单”使助理听起来不理解其所主张的业务,也没有多少正确的管道从中恢复。 purchase.

decision_mode

immediate 或 单 deferred选择 deferred 任何涉及承销、信用评估、推荐、录取或委员会的东西。OpsIQ然后说 提交的 而不是说 确认,然后将引用的文字交给别人询问。告诉某人他们的应用在与人类坐在一起时得到了确认,这是聊天助理对受监管的企业所能做的最有害的事情,也是每个零售流的默认行为。 immediate.

payment_timing

on_confirmation, deposit_then_balance, invoice_later 或 单 no_payment。这决定是否OpsIQ打开支付页面 完全没有,因此不能从 payment_flow - 上面写着 - 说着 钱拿去,这上面写着 是否以及何时。在发票之后工作,以及不花费提交费用的申请,最后确认,而不是到达一个空或错误的网关列表。

reversibility

reversible 或 单 irreversible金融连接器说的最重要的事情。一个房间可以放出,一个包裹可以回来;完成的转移不能——没有倒数,钱在另一端,唯一的补救办法是要求陌生人归还它。 irreversible 自动强制 cancellation_flow 改为 none 并禁止任何操作员设置不检查身份, 不论这个宣言中说些什么。两个字段不同意不是运行时需要解决的状态,而是由哪个先读者解决。默认为 reversible.

cancellation_flow

none, platform_only 或 单 connector_cancel。取消角色已经存在,没有关于谁可以接触到他们的规则,两个错误的猜测在相反的方向失败:猜开而聊天消息取消付费的预订而不引用费用;猜闭而想要取消的客户被告知打电话. connector_cancel 额外需要 cancellation_quote 财务报告和已审计财务报表 order_cancel 恢复了... ...OpsIQ永远不要在说出它的成本之前取消。 none.

fulfilment_presence

customer_present 或 单 remote_delivery。一个未经核实的电子邮件地址是否花费了任何人的任何费用。酒店客人必须抵达,所以错误的地址会误导收据,房间仍然在那里;一个张贴的包裹、一个提供服务的服务器或下载链接仅凭地址的力量就可以离开。 操作员的“ skip 电子邮件验证” 设置由此可以使用旅馆的推理永远不能被运送货物的连接者继承。 remote_delivery.

minimum_assurance 财务报告和已审计财务报表 disclosure (可选)

minimum_assurance 让你要求 更多( E) 身份证明比OpsIQ要求,同样重要的是,银行在进行转让时需要升级的银行正在履行合同。设定合同也使操作者无法跳过对连接器的核实,因为商家自己的风险决定会比操作者的方便程度高。 disclosure 显示措辞 之前 确定按钮,对于费率、收费或冷却权,您必须出示;没有该按钮,受监管的企业将规定的措辞偷运入产品名称。

notify_flow

platform_automatic, platform_triggered 或 单 none。何时OpsIQ支付您自己的退票, 所以无论通常的电子邮件是不会放火的。 记录付款额标志着已经支付的订单; 它不要求任何平台告诉任何人 。 platform_triggered 需要的代码 order_notify 与恢复有关的作用,以及OpsIQ只有在付款回购后,才要求证明已记录了这笔钱。 none 做一个OpsIQ- 附加确认是强制性的,否则付费客户根本听不到任何声音。 none.

同一份合同,9个无关企业

这些都不是设计好的,每个都是诚实地为不同的行业 服务的合约OpsIQ根本不知道他们是谁

一份合同,九个行业
Hotel        booking      immediate  deposit_then_balance  reversible    -> payment page, "confirmed", identity may be waived
Online shop  purchase     immediate  on_confirmation       reversible    -> payment page, "confirmed", identity always verified
Bank         transfer     immediate  on_confirmation       IRREVERSIBLE  -> payment page, no cancel route, never waived
Insurer      application  DEFERRED   no_payment            reversible    -> no payment page, "submitted", never "confirmed"
Utility      bill_payment immediate  on_confirmation       IRREVERSIBLE  -> payment page, nothing to give back
Clinic       booking      immediate  invoice_later         reversible    -> NO payment page, billed afterwards
Tradesman    booking      immediate  invoice_later         reversible    -> NO payment page, invoiced on completion
Telecom      top_up       immediate  on_confirmation       IRREVERSIBLE  -> payment page, final once sent
University   application  DEFERRED   no_payment            reversible    -> no payment page, decision follows
向平台提供付费活动

在积极核实并承付一笔本地的Storefront付款之后,OpsIQ发件 payment.completedorder_id, payment_id/provider_ref, gateway准确 amount_minor, ISO 标准 currency,客户、行项目、频道和 paid_at商家连接器必须坚持通过下列方式提供证据: record_payment 并读回;一个主机检查出连接器会消耗自己的权威支付事件,并且不得收到重复的支付书.

AI是提议者,不是权威来源

该模型可以选择已申报的产品和数量,但不能选择操作名称、薄荷定单URL或从文本创建商号状态。客户收到精确的签名卡,必须按确认按钮。该确认与工作空间、连接器、项目、数量、引文、货币、线程和过期相接。

社交顾客保持相同的流量,没有电子邮件提示

WhatsApp使者们,Instagram, Telegram, LINE, 短消息和X 使用供应商验证的频道账户作为客户身份。该提议被签入该频道账户,并且确认仍然通过相同的新报价、股票、一能、支付和回收控制进行。一个社会客户使用在谈话中给出的准确的一次性确认行动;普通的传言,如“是”从来不是命令的权威。

顺序历史遵循精确的身份链接, 从来不用电子邮件猜测

原生命令由不透明的信道身份索引,所以AI可以回答“我的命令在哪里?”而不要求电子邮件或命令号。对于连接的存储历史,将信道身份链接到工作空间CRM/客户端记录并执行连接器中的客户端/订单查询。 客户端提供商接收存储的链接; 他们不能从显示名称或输入聊天的电子邮件中选择账户。 使用一个匹配命令, AI 直接回答; 其中多个命令汇总匹配并询问哪个匹配; 没有一条表示没有历史链接 。

使有效载荷具有普遍性:打字场和服务器拥有的身份

核心内含无WHMCS、旅馆、SaaS、商店、银行、产品、路线或供应商分行。 parameters 是客户表和 AI slot schema。预订连接器可以声明日期和来宾;计费连接器能够宣布一个周期;未来的企业连接器也可以宣布自己的安全地段。OpsIQ将原始控件进行消毒,并将所收集的值只发送到已绘制的连接器动作上。

输入的引用动作
{
  "action_id": "acme_customer_quote",
  "scope": "client",
  "is_destructive": false,
  "parameters": [
    {"name":"external_customer_id","type":"string","required":true},
    {"name":"item_id","label":"Product","type":"string","required":true},
    {"name":"quantity","label":"Quantity","type":"integer","required":true,"minimum":1},
    {"name":"cycle","label":"Billing cycle","type":"select","required":false,
     "options":[{"value":"monthly","label":"Monthly"},{"value":"annual","label":"Annual"}]}
  ]
}

用于 clients_only设置 customer_ordering.identity_parameter 到接收连接器外部客户身份的动作参数。此字段从未向客户显示,任何呼叫者提供的值都会被删除 ;OpsIQ仅从已确认的连接器链接中输入 ID。 客机检出会留空。 输入的电子邮件是已声明的来宾查询的证明, 不是登录, 也不是购买权限 。

分组域 : 已签名的客户账户和连接器配置属于集团主门户工作空间。然而,必须使用该成员网络库的秘密,为嵌入部件的确切成员网站签名身份标志。OpsIQ先验证表面,然后通过组主解决商务和关联客户的问题。从不以主键取代成员站点密钥,也从不将主密钥复制到成员站口。

连接器必须返回的光圈封口

目录
{
  "success": true,
  "data": {"items":[{
    "id":"42", "name":"Example product", "summary":"Customer-safe summary",
    "currency":"USD", "unit_amount_minor":2500, "available":true,
    "selection":{"item_id":"42"}
  }]}
}
引文为
{
  "success": true,
  "data": {
    "quote_id":"opaque", "currency":"USD",
    "unit_amount_minor":2500, "total_amount_minor":5000,
    "selection":{"item_id":"42","quantity":2},
    "expires_at":"2026-08-31T14:05:00Z"
  }
}

平台检查出回复重复了有效的条形引号并添加了 HTTPS checkout_url。核心在确认时刷新引文,并精确地比较货币、总和稳定的选择。连接器将其平台响应翻译为这些信封;核心从不翻译出卖主字段或构建商家URL.

将一个操作员所建的网关在本地 Store 和聊天中可用

单靠支付能力并不能让客户看到网关。 原生存储支付网关 。它添加了明确的版本合同、地图检查和主动付款查询,并允许列出由提供者托管的检查域。一旦连接器在商务设置下安装、启用和选择,公共商店、存储模式、客户端聊天检查和自动检查中就会出现同样的网关。没有提供商的字片是硬编码的。

原生存储网关合同
{
  "commerce": {
    "roles": {
      "checkout_create": { "operation": "acme_checkout_create", "transport": "http",
                           "recovery": "acme_payment_status" },
      "payment_status":  { "operation": "acme_payment_status", "transport": "http" },
      "payment_profile": { "operation": "acme_payment_profile", "transport": "http" },
      "webhook_verify":  { "operation": "acme_webhook_verify", "transport": "http" },
      "event_map":       { "operation": "acme_event_map", "transport": "http" },
      "payment_refund":  { "operation": "acme_refund", "transport": "http",
                           "recovery": "acme_refund_status" }
    },
    "storefront_gateway": {
      "enabled": true, "version": 1, "label": "Acme Pay",
      "checkout_hosts": ["checkout.acmepay.com", "*.acmepay.com"]
    }
  }
}
光学检查输出

检查出行动地图 checkout_url 当供养者有一份供养的时候, session_id。该数字URL必须是 HTTPS,不包含证书,并匹配一个允许的列表主机。

条形状态输出

状态动作执行新提供者API搜索和地图 paid 像个真正的布尔人, amount_minor 以整数表示, currency 用作三字母的ISO代码,以及 provider_ref。返回URL,查询字符串、客户端有效载荷或连接器提供的“确认”指示绝不是付款的真相。

任择退款合同

如果网关支持退款,则映射 payment_refund 及其回收操作。退款创建将严格返回 accepted 财务报告和已审计财务报表 completed 布尔斯加法 provider_ref; 恢复执行提供者查询和返回 status. 不采取这两项行动,OpsIQ不发布连接器退款广告。

是谁确认命令的

连接器从不写OpsIQ命令状态。OpsIQ精确比较返回的金额和货币,并记录提供者的参考;只有这样核心才能进行提供者核实的过渡。手工银行转账仍然是指定代理人唯一可以批准的流动。

在连接器构建器中,勾选 商业,绘制角色地图,并配置 已连接的商店客户端订购, 原生存储支付网关,或者两者兼而有之,当连接者真正提供两种合同时。 commerce_roles.json。出版时仍然使用正常的“市场”审查和签名程序;该合同从未绕过包的验证,也从未使连接器无法安装。 php tools/verify_commerce_contracts.php.
💡
运输 http 用于远程API或 为 bridge 用于在已部署的桥梁上进行命名操作(见下文NO-API 图案)。作用是可忽略的运输;运行时间只需要注明的运输,以便它能够对桥梁进行版本-铺设。
连接器

通过聊天出售, 无需连接器: 动作和触发器

上面的商业合同不需要一个连接器包。 如果您的平台是你自己的, 一个自定义的后台, 一个内部的API,一个没有人为它运送连接器的系统——你可以用你已经用来整合其他东西的两个工具到达同样的销售机械:自定义动作(你的HTTP端点,在动作页面上定义)和触发器(事件webhooks)。同一个合同,同一个卡,同一个身份保证,同一个支付内核,同一个收据。唯一缺少的是包,因为没有第三方代码可以签名。

如何融为一体

每个商业角色都建一个自定义动作——每个角色都是你身边一个平坦的HTTPS端点,定义在"W. AI 自动化( A)→行动 财务报告和审定财务报表URL, 认证头和参数。然后保存一个将角色映射到这些动作的宣告。从那一刻起,您的商店在聊天中出现完全像一个连接器备份的: AI 引用自 打开 引用动作,确认卡制作,客户验证其电子邮件,命令内核呼叫 打开 命令使用一能键的动作,OpsIQ通过工作空间网关收取报酬,以及 打开 记录支付动作记录,顾客经验上没有写"客户"

宣言

保存这个JSON作为工作空间设置 commerce_custom_integration (安排)→高级设置,或通过 REST 设置API。 它与一个包裹的形状相同 commerce_roles.json 商业节点,与 action 命名您的自定义动作编号 :

commerce_custom_integration
{
  "enabled": true,
  "roles": {
    "catalog_search":  { "action": "acme_catalog" },
    "quote":           { "action": "acme_quote" },
    "order_get":       { "action": "acme_order_get" },
    "customer_create": { "action": "acme_customer_create",
                         "recovery": "acme_customer_by_email" },
    "order_create":    { "action": "acme_order_create",
                         "recovery": "acme_order_by_key" },
    "record_payment":  { "action": "acme_record_payment",
                         "recovery": "acme_payment_by_key" }
  },
  "customer_ordering": {
    "enabled": true, "version": 1,
    "mode": "direct_order",
    "audience": "guests_and_clients",
    "account_flow": "connector_signup",
    "payment_flow": "opsiq_gateway",
    "label": "Acme Store",
    "identity_parameter": "client_identifier",
    "quantity_parameter": "quantity",
    "transaction_kind": "purchase",
    "fulfilment_presence": "remote_delivery",
    "notify_flow": "platform_automatic"
  }
}

最后,添加 custom_commerce 连接到在设置下允许销售的连接器→客户聊天→通过聊天出售。 重新检查录取 每隔一段时间 请求中,它拒绝以命名的理由,而不是默默地隐藏您的商店:您模式的一个角色要求将地图映射到一无所有,一个没有恢复动作的写出角色(§15.7——无法重新询问结果的写作被拒绝),此动作自您保存后被删除或被禁用.

每一行动必须做什么

返回连接器信封

响应 {"success": true, "data": { ... }} - 或 说 {"success": false, "error": "a sentence a customer may read"}。您的行动 响应成功路径 应该是用信封指着的

引文:全称,以小单位分.

返回( E) quote_id, product_name, quantity, unit_amount_minor, total_amount_minor, currency, selection, selection_summary, expires_at。上面“你的总数是唯一移动货币的数字”部分中的所有内容都逐字适用:税费和乘数进入你的总额,因为你的总数是签名、显示和收取的。

顺序创建: 尊重 idepotency 密钥

收下这个 idempotency_key,签名 total_minor 财务报告和已审计财务报表 currency,验证 customer_email。您自己引用参数。用命令存储密钥; 如果您已经为此创建了命令, 请返回该命令而不是第二个命令。 请验证钱款 — 如果您的系统价格与所签名的总价不同, 请拒绝重新计算, 而不是低价。 返回 a reference 你的平台识别。

恢复:关于一个写作的回答

order_by_key 获得一等分权密钥和答案 {"found": true, "order": {...}} 或 单 {"found": false}. 发现: 假是一个承诺——OpsIQ可能用它的力量重试写入。状态种子或最近顺序列表不是一个关于一个写入的答案。

记录付款: 自己的结算路径

在 OpsIQ 已用网关积极核实金额和货币后, 接收网关交易 ID 作为一等钥匙加您的订单参考。 将您平台本身逻辑中支付的订单标记为 : 点出您自己的电子邮件, 减少您的库存 。 返回 。 platform_notified: true 如果您的平台发邮件给客户本身。

纸牌输入来自您的动作参数

在QUOTE动作(超越身份参数)上声明的AI未收集的任何参数,都会被作为客户填充的输入——域名,日期,座位——在确认卡上给出. 标签要很好地标出;标签是客户所读取的内容.

触发器:听到自己的销售量

共有的活动总线上有两个事件起火, 所以,你的网络呼和自动化听到每一个聊天的销售,无论它在哪里执行:

commerce.order.created

订单在支付之前落在商家一方的一瞬间——参考、连接器(或 custom_commerce),金额,货币,客户电子邮件,线码.

commerce.payment.confirmed

完全一次订单, 当网关积极验证付款时。 它的运行是同一项可以防止重复的收款, 所以它不能双发您网签 。

何时毕业到连接器

自定义集成是工作空间配置: 它服务于您商店, 在您工作空间上。 您想要分配集成的时刻—— 其他工作空间, 市场, 版本、 签名、 付费安装—— 将相同的动作和声明包成连接器。 合同不会改变, 只有包装器会改变 。

连接器

连接一个没有的平台API(桥梁图案)

有很多真正的平台 船没有RESTAPI酒店CMS,旧的帐单系统,一个有声的内部工具。您仍然可以写完整OpsIQ连接器:连接器发送一个单个的 PHP 文件,操作员将该文件投放到自己的公共网络根上,而该文件是API。本页是整个图案,其中的规则使运行安全,以及每个规则背后的原因。

形状

一个正常的连接器叫别人的API。桥接器会带来自己的连接器。没有其它变化:相同的动作、上下文提供者、相同的身份合同、相同的软件包布局。

1
您写入一个 PHP 文件

It lives in your package at bridge/opsiq-<platform>-bridge.php. It talks to the platform's database directly, or boots the platform's framework, or both. It answers JSON.

2
操作员把它复制到他们的网根

旁边是平台自己的索引. php. 没有修改平台代码,没有安装插件,没有东西可以维护跨平台升级.

3
连接器面板将文件交给他们

您的设置 。json声明 Webhook_ help. slippet_template。 连接器页面使其成为可复制的文件, 并且已经替换了他们的活的设置, 所以没有手动编辑的内容 。

4
OpsIQ称之为服务器到服务器

您的客户端.php 发送请求时使用 X 中共享的密钥 。Opsiq- 布里奇 - 关键头,基地URL设置是平台站点根。

连接器构建器现在可以为您生成此选项。 请选择“ platform with noAPI" profile(或设置数据访问桥口),它释放出桥口文件,匹配面板片段和通过它读取并写入的打出动作——用于读取其.env的Laravel应用程序,用于WordPress读取 wp- config.php,或带有证书粘贴其他任何内容。桥模式将认证修正到OpsIQ桥接协议: 连接器安全生成 api_key 启用时,将其发送为 X-Opsiq-Bridge-Key,并绑定相同的已保存值 OPSIQ_BRIDGE_KEY 。只有在您的平台不是其中之一时,或者需要行为时,生成的桥才不覆盖。手写桥对向导是安全的:它只覆盖带有自己标记的桥文件。
💡
此页面上的所有内容均以 PHP 显示, 反向MySQL,因为这是参考执行,也是包装管道完全支持的唯一组合。模式本身是语言不可知和引擎不可知:见"其他语言和其他数据库中的桥",用于节点、Python、Go、Ruby、.NET和Java的闸口,用于内向查询。PostgreSQL, SQL服务器,SQLite和甲骨文,还有MongoDB等同——以及决定非PHP桥如何到达操作者的包装约束。

安全模式,为什么每个规则都存在

此文件位于一个共享密钥后面的一股公共网络。 仅此一项事实就驱动了下面的每个规则。 不要放松其中的任何一条, 以简化您的桥 。

打电话的人从不供应SQL

不是条款,不是按片段排列的命令,也不是“仅此一次”的原始查询参数。调用者会命名一个表格、一列和一个值;您的文件会构建语句。调取者可以贡献的时刻SQL文本中,一个共享的密钥变为任意数据库执行。

表格和列名根据信息验证_schema

识别符不能作为参数绑定,所以必须检查它们。读取本数据库的正本表格和列列表并拒绝任何未登录的条目。如果一个标识符不是这个方案的真正对象,那么它就根本无法到达查询 — 这才使得每个表格都能安全地曝光。

每个值都是被绑定的参数

毫无例外,包括搜索中的值。验证的标识符加上约束值是使表面总计和注入表面为零的对数。

阅读是通用的,写作是允许的

下个街区,这是规矩,人们最想跳过

密栏在读取时被编辑并拒绝写作

匹配列名: 密码, 记住_ token, 秘密, api_ key, 私钥, 盐, 符号。 在出站时将值替换为占位符 。 拒绝在路上完全写入 —— 写出原始的密码散列不是操作, 而是脚枪 。 请将操作员发送到平台的密码流 。

删除为一行, 按主键

绝对不要删除批量删除, 也不要通过过滤删除。 批量去除是数据库如何被消亡的。 如果某人真的需要一个, 他们可以在平台上完成 。

读取为行封口

用硬天花板将限制参数粘贴。 运行中的查询不能通过聊天信息丢弃数据库 。

在密钥设定前无法关闭

未配置的桥的答案403在布置之前有帮助的桥梁是帮助陌生人的桥梁。

常时密钥比较, 以页眉键

hash_equals, 永远不要; 键在 X --Opsiq-Bridge-Key,而不是查询字符串,所以它不使用访问日志,代理日志和引用页眉.

只得到一个

一种方法,一种形状,没有任何东西可以走私到尸体中。桥所做的一切都是可以被看出来是具有验证参数的GET,OpsIQ是唯一一个打电话的人。

阅读普及,写作允许列表,以及为什么

这是一条被争论的规则, 所以这里是全部的推理。 助手应该能够查看整个平台: 因此它有用, 而读数不能破坏任何东西。 写法不同。 此文件坐落在一个共享密钥后面的公网根上。 如果密钥泄露, 不受限制的写入表面会使泄露相当于数据库控制的全部—— 一个新的管理员用户, 一个空置的预定表。 允许列表意味着漏出密钥仍然无法到达操作员从未启用的表格 。

⚠️
密码OpsIQ批准卡会打开AI, 而不是密钥。 命令点击允许破坏动作是对助手的控制。 它不会控制持有桥钥的人。 这是两种不同的威胁, 而允许列表是第二个威胁的答案 。
接线员的接线手 从Botble桥
/* ── WRITE ALLOW-LIST — which tables the assistant may CHANGE here.
 *
 * READS are unrestricted: the assistant can see every table in the platform.
 * WRITES are limited to this list, because this file sits in a PUBLIC webroot
 * behind ONE shared key — an allow-list means that even a leaked key cannot
 * reach a table you never enabled (no new admin users, no emptied bookings).
 *
 * Comma-separated table names. Add tables as you need them — e.g. append
 * ',pages,posts' to let the assistant edit site content. Set it to '*' to
 * allow every table, deliberately. Empty falls back to the hotel defaults. ── */
const OPSIQ_WRITE_TABLES = 'ht_bookings,ht_booking_rooms,ht_booking_addresses,ht_rooms,ht_room_types,ht_customers,customers';

下面的检查有两个细节很容易被错误。 表格名称已经到达 RESOLVED, 上面有安装表的前缀, 而操作员会写出允许列表, 因为它们自然会输入。 比较两种方式或前缀安装时, 都不允许任何和每次写入中断。 而拒绝必须解释自己, 因为阅读它的人是聊天窗口中的管理员, 而不是一个有堆栈追踪的开发者 。

许可名单核对,从市场-连接器/botble/bridge/opsiq-波波-桥.php
/** Tables a WRITE may touch. Empty = the built-in defaults. */
$writeAllowed = static function (string $table) use ($prefix): bool {
    $raw = trim((string)(defined('OPSIQ_WRITE_TABLES') ? OPSIQ_WRITE_TABLES : ''));
    if ($raw === '') $raw = 'ht_bookings,ht_booking_rooms,ht_rooms,ht_customers,customers';
    if (trim($raw) === '*') return true;                     // explicit opt-in to everything
    $bare = ($prefix !== '' && stripos($table, $prefix) === 0) ? substr($table, strlen($prefix)) : $table;
    foreach (explode(',', $raw) as $t) {
        $t = trim($t);
        if ($t === '') continue;
        if (strcasecmp($t, $table) === 0) return true;
        if (strcasecmp($t, $bare)  === 0) return true;
        if ($prefix !== '' && strcasecmp($prefix . $t, $table) === 0) return true;
    }
    return false;
};

/** One refusal, one explanation — used by every write op. */
$requireWritable = static function (string $table) use ($writeAllowed): void {
    if ($writeAllowed($table)) return;
    opsiq_bridge_out(['success' => false, 'error' =>
        'write_not_allowed: "' . $table . '" is not in this bridge\'s write allow-list. '
        . 'Reads are unrestricted. To permit writes here, add the table to OPSIQ_WRITE_TABLES '
        . 'in opsiq-botble-bridge.php (or set it to "*" to allow every table).'], 403);
};

门全开

4次检查,按此顺序,在任何数据接触之前,复制命令和检查。

四道门的检查,按顺序
<?php
declare(strict_types=1);

/* ── EDIT THIS: a long random secret (40+ chars). Empty = bridge OFF. ── */
const OPSIQ_BRIDGE_KEY = '';

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');

function opsiq_bridge_out(array $payload, int $code = 200): void
{
    http_response_code($code);
    echo json_encode($payload, JSON_UNESCAPED_SLASHES);
    exit;
}

/* 1. Fail closed. An unconfigured bridge answers nothing to anyone. */
if (OPSIQ_BRIDGE_KEY === '' || strlen(OPSIQ_BRIDGE_KEY) < 24) {
    opsiq_bridge_out(['success' => false, 'error' => 'bridge_not_configured'], 403);
}
/* 2. One method. */
if (strtoupper((string)($_SERVER['REQUEST_METHOD'] ?? '')) !== 'GET') {
    opsiq_bridge_out(['success' => false, 'error' => 'method_not_allowed'], 405);
}
/* 3. Constant-time key comparison, key from a header (never the query string). */
$given = (string)($_SERVER['HTTP_X_OPSIQ_BRIDGE_KEY'] ?? '');
if ($given === '' || !hash_equals(OPSIQ_BRIDGE_KEY, $given)) {
    opsiq_bridge_out(['success' => false, 'error' => 'forbidden'], 403);
}
/* 4. Only now read credentials and connect. */

对照信息验证识别符_schema

将“ 助手可以到达任意的桌子” 从鲁莽变为安全。 将呼叫者的桌子名称与真正的策略相对应, 容忍一个缺失或额外的表格前缀, 然后返回无效的任何东西。 然后下游的一切都使用一个可以证明存在的名称 。

鉴定和编辑,从博特布尔桥逐字
/** Real tables in THIS database — the allow-list, straight from the DB. */
$allTables = static function () use ($pdo, $db): array {
    static $cache = null;
    if ($cache !== null) return $cache;
    $st = $pdo->prepare('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME');
    $st->execute([$db]);
    return $cache = array_map('strval', $st->fetchAll(PDO::FETCH_COLUMN));
};

/** Resolve a caller-supplied table name to a REAL one, or null. */
$resolveTable = static function (string $name) use ($allTables, $prefix): ?string {
    $name = trim($name);
    if ($name === '' || !preg_match('/^[A-Za-z0-9_]+$/', $name)) return null;
    $tables = $allTables();
    foreach ($tables as $t) if (strcasecmp($t, $name) === 0) return $t;
    /* Tolerate a missing or extra table prefix. */
    foreach ($tables as $t) {
        if (strcasecmp($t, $prefix . $name) === 0) return $t;
        if ($prefix !== '' && strcasecmp($prefix . $t, $name) === 0) return $t;
    }
    return null;
};

/** Column introspection: table => [column => true]. Cached per request. */
function opsiq_bridge_columns(PDO $pdo, string $db, string $table): array
{
    static $cache = [];
    if (isset($cache[$table])) return $cache[$table];
    $stmt = $pdo->prepare('SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?');
    $stmt->execute([$db, $table]);
    $cols = [];
    foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $c) $cols[strtolower((string)$c)] = true;
    return $cache[$table] = $cols;
}

/** Columns whose VALUES must never leave the platform. */
$secretCol = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token|secret|api_key|private_key|salt|token)($|_)/i', $c);
};
/** Columns a write may never touch — auth material. */
$writeBanned = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token)($|_)/i', $c);
};
/** Strip secret values from a row before it leaves the server. */
$redact = static function (array $row) use ($secretCol): array {
    foreach ($row as $k => $v) if ($secretCol((string)$k)) $row[$k] = '[redacted]';
    return $row;
};

读取操作和写取操作,完成

注意什么是绑定的,哪些是验证的。过滤栏会对照真实的列列表检查,然后插入为标识符;其值是约束的。限制被夹住。在离开时会修改行。更新时拒绝主键和任何认证栏,当表格有时会更新印花页。

读取任意表格——已验证的标识符、约束值、封装行
case 'query': {
    $t = $resolveTable((string)($_GET['table'] ?? ''));
    if ($t === null) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);
    $cols = opsiq_bridge_columns($pdo, $db, $t);
    if (!$cols) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);

    $sql = "SELECT * FROM `$t` WHERE 1=1";
    $args = [];

    /* Equality filter: column must be REAL, value is bound. */
    $wc = strtolower(trim((string)($_GET['where_column'] ?? '')));
    if ($wc !== '') {
        if (!isset($cols[$wc])) opsiq_bridge_out(['success' => false, 'error' => 'unknown_column: ' . $wc], 400);
        $sql .= " AND `$wc` = ?";
        $args[] = (string)($_GET['where_value'] ?? '');
    }
    /* Ordering: column validated, direction from a fixed pair. */
    $ob = strtolower(trim((string)($_GET['order_by'] ?? '')));
    if ($ob !== '' && isset($cols[$ob])) {
        $dir = strtoupper(trim((string)($_GET['order'] ?? 'DESC'))) === 'ASC' ? 'ASC' : 'DESC';
        $sql .= " ORDER BY `$ob` $dir";
    } elseif (isset($cols['id'])) {
        $sql .= " ORDER BY `id` DESC";
    }
    /* Hard row cap. */
    $lim = (int)($_GET['limit'] ?? 25);
    if ($lim < 1)   $lim = 25;
    if ($lim > 200) $lim = 200;
    $off = max(0, (int)($_GET['offset'] ?? 0));
    $sql .= " LIMIT $lim OFFSET $off";

    $st = $pdo->prepare($sql);
    $st->execute($args);
    $rows = array_map($redact, $st->fetchAll());
    opsiq_bridge_out(['success' => true, 'data' => [
        'table' => $t, 'returned' => count($rows), 'rows' => $rows,
    ]]);
}
写入一行——允许列表表,拒绝认证列,按主键单行
case 'record.update': {
    $t = $resolveTable((string)($_GET['table'] ?? ''));
    if ($t === null) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);
    $requireWritable($t);                       // the allow-list, before anything else
    $cols = opsiq_bridge_columns($pdo, $db, $t);
    $pk   = $primaryKey($t);
    $id   = (string)($_GET['id'] ?? '');
    if ($id === '') opsiq_bridge_out(['success' => false, 'error' => 'id_required'], 400);

    $set = json_decode((string)($_GET['set'] ?? ''), true);
    if (!is_array($set) || !$set) opsiq_bridge_out(['success' => false, 'error' => 'set_json_required'], 400);

    $frag = []; $args = [];
    foreach ($set as $col => $val) {
        $col = strtolower(trim((string)$col));
        if (!isset($cols[$col]))  opsiq_bridge_out(['success' => false, 'error' => 'unknown_column: ' . $col], 400);
        if ($writeBanned($col))   opsiq_bridge_out(['success' => false, 'error' => 'refused: "' . $col . '" is auth material - change it through the platform own password flow, never by direct write.'], 400);
        if ($col === $pk)         opsiq_bridge_out(['success' => false, 'error' => 'refused: the primary key cannot be rewritten.'], 400);
        if (is_array($val) || is_object($val)) $val = json_encode($val, JSON_UNESCAPED_SLASHES);
        $frag[] = "`$col` = ?";
        $args[] = ($val === null) ? null : (string)$val;
    }
    if (isset($cols['updated_at']) && !isset($set['updated_at'])) $frag[] = '`updated_at` = NOW()';

    $before = $pdo->prepare("SELECT * FROM `$t` WHERE `$pk` = ? LIMIT 1");
    $before->execute([$id]);
    $prev = $before->fetch();
    if (!$prev) opsiq_bridge_out(['success' => false, 'error' => 'not_found'], 404);

    $args[] = $id;
    $up = $pdo->prepare("UPDATE `$t` SET " . implode(', ', $frag) . " WHERE `$pk` = ? LIMIT 1");
    $up->execute($args);
    opsiq_bridge_out(['success' => true, 'data' => [
        'table' => $t, 'id' => $id, 'changed' => $up->rowCount(),
        'before' => $redact(array_intersect_key($prev, $set)),
    ]]);
}

存活的图谋差异

平台版本不同。 列会移动、 重新命名或缺失。 一个桥会假设一个方案在一个安装上有效。 反之, 内视并调整: 只选择此处存在的列, 容忍表格前缀, 并尝试引用的假拼法 。

博特布尔桥上的石马忍耐力
/* Only ever select columns that exist on THIS install. */
$pick = static function (array $cols, array $wanted, string $alias = 'b'): string {
    $out = [];
    foreach ($wanted as $c) if (isset($cols[$c])) $out[] = "`$alias`.`$c`";
    return $out ? implode(', ', $out) : "`$alias`.*";
};

/* References vary: stored with or without a leading "#", with or without an
 * operator-configured alpha prefix, or only as a numeric id. Try every
 * plausible form — the PROOF match is what actually gates disclosure, so
 * tolerant matching here is safe. */
$refCandidates = [$ref, '#' . $ref];
$digitsOnly = preg_replace('/\D+/', '', $ref);
if ($digitsOnly !== '' && $digitsOnly !== $ref) {
    $refCandidates[] = $digitsOnly;
    $refCandidates[] = '#' . $digitsOnly;
}
$refCandidates = array_values(array_unique($refCandidates));
💡
给您的桥一个只报告结构的操作性数据 — 表格解决了,主表有的栏目,以及每个数字被掩盖的最新参考的SHAPE。它像其他所有东西一样按键,它把“搜索找不到任何东西”从支持票变成了十秒的答案。永远不要让它返回真实的记录。

统一错误和计数陷阱

万事皆有形状

Success is {"success":true,"data":{...}}. Failure is {"success":false,"error":"snake_case_reason"}. Your Client.php and every action then have exactly one response shape to handle.

找不到和没有匹配的必须完全相同

在搜索表面,一个不存在的引用和其证明不匹配的引用必须产生 SAME 响应。不同的答案将您的桥变成一个神谕,确认哪些引用是真实的,这是任何患者的自由客户列表输出 。

永远不要告诉访客原因

桥可以精确地说OpsIQ游客的遭遇由OpsIQ,在一个固定的拒绝。

连接器面板中的可复制文件

操作员从不打开您的寄存器。 他们打开了连接器的面板 。OpsIQ并按副本。该副本来自设置。json,它必须与 Bridge/*.php 程序相同。

设置。json——桥接器的面板条目
{
  "settings": [
    { "key": "base_url", "label": "API base URL", "type": "text", "required": true },
    { "key": "api_key",  "label": "Bridge key",   "type": "password", "required": true,
      "autogenerate": true,
      "help": "Auto-generated the moment you enable the connector. It must match OPSIQ_BRIDGE_KEY inside the bridge file; the copyable file below already carries this value once saved." }
  ],
  "webhook_help": {
    "title": "One file, three surfaces",
    "body": "This platform has no public REST API, so this ONE file IS the API. Copy it into the site PUBLIC webroot, keeping the filename.",
    "snippet_filename": "opsiq-yourplatform-bridge.php   (drop next to the site index.php)",
    "snippet_template": "<?php\n/* ... the whole bridge file ... */\nconst OPSIQ_BRIDGE_KEY = \u0027{{setting:api_key}}\u0027;\n..."
  },
  "snippet_bindings": [
    { "assignment": "OPSIQ_BRIDGE_KEY", "setting": "api_key" }
  ]
}
{{setting:key}} carries live values

The connector panel substitutes {{setting:<key>}} in the snippet with that connector's saved value, so the copied file already contains the operator's generated bridge key and needs no hand-edit. An empty or unsaved setting leaves the token visible, so the operator can see exactly what is still missing.

片段_ 绑定活生生

明确声明每个生成的秘密任务。同步工具从已运出桥面重建面板副本,然后恢复 OPSIQ_BRIDGE_KEY = {{setting:api_key}} 。没有它,升级可以忠实地复制无密钥包文件,并默默地去掉操作员可部署的密钥占位符。连接器构建器自动为生成的桥接包发布此绑定值。

其他占位符为替换服务器侧

除了这个之外,{webhook_url}, {webhook_path}, {webhook_secret}, {site_key}, {base_url}财务报告和已审计财务报表{slug}在面板看到片段前填好

网络hook_帮助可能是一个对象或列表

列表给出了您在一个面板中的几个片段,例如桥文件以及单独的接力钩.

🚫
不要手动维护片段。 桥文件和面板副本是两个程序的副本, 它们会漂移—— 一个桥被升级, 面板复制没有, 所以任何从面板上重新安装和复制的人都会安装旧桥并默默地失去每一个新能力。 没有发现它: 符合度通过, 签名通过,测试通过 。
保持两本相同
# Regenerate every package's panel snippet from its bridge file
php tools/sync_connector_bridge_snippets.php --apply

# Show what would change, without writing
php tools/sync_connector_bridge_snippets.php

Drift is now a failing conformance check, not a support ticket: the verifier compares the two line by line (ignoring the {{setting:...}} placeholders, which are supposed to differ) and names the first line that differs. Run the sync tool as the last step before every release, right before signing.

桥应该暴露什么

形状操作和通用数据表面,一起。形状操作返回了人们实际提出的问题的整洁、目的明确的答案;通用操作覆盖了其他所有问题,因此助手永远不会被卡住。

形状读取

stats,带有过滤器的主体列表,一个具有相關行目的物件,所售物品的目录,客户搜索有历史,这些都让AI在一次呼叫中而不是5次得到很好的回答.

形状写

两到三个状态会改变那个事项——设置状态,取消。保留被接受的允许的值。

类型商业

对于一个可出售的平台,将专门设计的目录、引文、出货单/订单和付款证据业务曝光,然后将其映射到 commerce_roles.jsontransport: bridge。从不将商业地图写入通用记录. create/update surface。

普遍发现

表格(有行数)和描述(列、类型、主键,加上每个列的可读和可写标记)。这是助手如何学习一个你没有预料到的平台。

通用读写

查询、记录、 获取、 创建、 记录、 record. update、 recoord. delete。 每一份都按上表显示验证。

身份,在钥匙门前

身份探针是由行政主管的BROWSER(同源)调用,所以无法发送自定义头条。它们的认证是平台会话本身。把它们放在关键门前,远离所有记录数据,永远不要让他们返回一个秘密。请查看连接器身份页 。

诊断

op=diag, structure only, masked.

桥梁商务角色图
{
  "commerce": {
    "roles": {
      "catalog_search": {"operation":"hotel_catalog_search","transport":"bridge"},
      "quote":          {"operation":"hotel_quote","transport":"bridge"},
      "order_create":   {"operation":"hotel_order_create","transport":"bridge",
                           "recovery":"hotel_order_get"},
      "order_get":      {"operation":"hotel_order_get","transport":"bridge"},
      "record_payment": {"operation":"hotel_record_payment","transport":"bridge",
                           "recovery":"hotel_order_get"}
    },
    "customer_ordering": {
      "enabled":true, "version":1, "mode":"direct_order",
      "audience":"guests_and_clients", "account_flow":"guest_checkout",
      "payment_flow":"opsiq_gateway"
    }
  }
}
💡
警犬作用控制序列和权威;桥接操作保留了平台本身打出的有效载荷. 酒店可能需要到达,出发和来宾,WHMCS可能要求现有的客户端或连接器拥有的注册,而SaaS平台可能需要一个计费周期。Core从不硬码这些字段。桥接必须引用平台的业务服务,因此股票、税收、发票、确认邮件和钩子都运行。
⚠️
record_payment 。只接受服务器验证的提供者证据:精确的顺序、商号、数量、ISO货币、供应商参考、新核实的时间戳和一等钥匙。通过平台的支付/发票坚持它。API,然后返回权威命令或发票重回。在进行重试之前,未知结果必须先进行回收。
💡
仅读连接器不需要允许列表。 如果您的平台只回答问题, 便将一个没有写操作的桥载, 整个类写风险都消失了 。 当有人要求时添加写入 。

运送桥前的核对表

桥上没有钥匙就拒绝一切

测试它。 将常数重命名为空并确认每个操作答案403.

错误的密钥在恒定时间被拒绝

hash_equals, 并且键只从头读取 。

拒绝化妆的表格名称

而一个前缀错误的正表名仍然能解决.

密码栏从不出现在读取中

写着名字被拒绝 并附上解释

不允许写到允许列表以外的表格

带着告诉操作员如何拓宽它的信息.

面板片段匹配桥口文件

php工具/sync_connectionor_bridge_spippets. php 一步步地报告.

重新设置连接器还不够

如果您的软件包传送了桥口文件, 连接器升级操作员也必须将该文件重新调配到他们的网根上。 在面板上和您的变换GELOG中都这么说, 每一份发布都如此 。

连接器

将平台自己的框架从桥梁上推进

只有读取的桥才能说话 SQL。 CREATES 平台上事物的桥梁(订单、订票、付费发票)必须穿过平台自己的应用层,而无心地启动该层是这种模式中每一个微妙的失败都存在的地方。 下面的一切都是在现场融合中艰难地学到的,每个规则都针对一个真正的缺陷,这个缺陷在任何地方都没有产生出任何错误。

数据库中的一行不是命令

Raw INSERTs 创建阴影记录

列出现,管理员列出,并且它仍然是平台认为它创建的纪录:没有本地参考号码,没有模型钩子,没有事件,没有发票,没有客户电子邮件,也没有工作客户-facing链接. 客户引用了平台从未向找不到的员工发布的参考信息. 通过平台自己的服务创建;如果仅暴露一个支付后服务,则创建它所期望的图形,并在它定义的接合处上交接.

永远不要重用平台的编号

参考格式的两个样本使其看起来容易复制,复制时的阴影写出一个级别:平台改变其方案之日,你的记录都是错误的,没有任何信息警告你。请调用生成器(反射到一个非静态的),并读取存储值,而不是信任你发送的。

平台列保持平台含义

在您将您的东西存储在平台栏目中之前, 请找到每个阅读器。 像自由槽这样的栏目可以装入: 在引用集成上, transaction_id 结果成了客户通过电子邮件“查看你的预订”链接解决的标志: 存储在其中的一纸空文摘要悄悄地打破了每个客人链接。 将您的账簿保存在桥上自有的表格中: UNIQUE( 操作, 操作), idempotency_key)是重放的守护符,约束拒绝并行的双胞胎,恢复检查读取了与创建时相同的表格。在开始 Transaction 之前创建该表格: MySQL DDL暗中进行公开交易.

事件、听众和双电子邮件陷阱

在发送消息前先读取服务来源

如果您拨打的平台服务已经发送了事件, 自己发送了两次确认邮件并生成两张发票。 如果没有监听, 发送也没有发出任何发票。 失败也不会引起错误。 反射方法、 切开源行并读取它的实际作用: 一个基于名称的猜测, 甚至一个对机体的正则x, 在源头解决之前都错了 。

获取倾听者( ) 隐藏真相; 获取Raw聆听者( 有) 告诉

Laravel 将班级的收听者包装在封口中, 所以获取收听者的()报告[email protected]。获取 RawListers( ) 的类名。 请不要发送无法命名的听众的事件 。

是否队列不是“ 稍后运行” 的意思

使用队列=同步( 默认大量安装) , 排队的听众在您的桥接请求中运行 INLINE。 您的启动上下文是它的渲染上下文: 每一次注册或 URL 在客户的收件箱中发现您的启动地有缺陷。 请在推理前检查配置( “ 队列. default” ) , 请查看工作/ 地址 。failed_jobs 在假设有工人参与之前

守将与月台的状态重复

无条件发送的服务必须完全调用一次. 不能漂移的标记是平台自己的记录状态(仅在记录尚未确定时才调用),而不是你的平行"同意"旗帜,可以不同意它.

无头靴子不是网靴子

注册网络启动器登记的内容

Template variables, module settings, filter hooks: platform service providers often register them only on a web request. On the reference integration the email handler substitutes only REGISTERED variables: every value was set correctly and the customer's confirmation still rendered with empty name, phone and link, no error anywhere, because registration lives in a runtime registry the headless boot never filled. Find the platform's registration call (for Botble: EmailHandler::addTemplateSettings with the module's email config) and make it in your boot, exactly as the platform's own provider does.

针头URLroot, 不仅仅是路由器

在您桥上脚本中捕获的请求点, 所以路径( ) , url()和资产生成 site.com/公开/opsiq- Bridge.php/checkout/TOKEN:通过一个客户链接 JSON 端点. force RootUrl(配置 ('app) ).url'') 修正生成器;STORAGE磁盘有自有根,因此被电子邮件的标志会一直被打破直到文件系统. disks. public.url 也可以设定( 它可以懒散地解决, 所以设置在启动器上, 只有在空或脚本相对时: 操作员的 CDN) URL 这不是你的 超能力。

交出来前先交出来

平台的服务通过自己的连接读取, 无法看到您的公开交易。 在承诺之前拨打, 支付后服务找不到已完成的付款, 静悄悄地留下记录, 并仍然启动其事件, 因此客户会被电子邮件到关于一个记录的邮件中, 平台认为该记录是未兑现的 。 提交图表, 然后调用 。

诚实的规则

没有阴影倒影

如果本地路径无法到达, 在任何货币移动前以可重试错误拒绝 。 从不创建引用, 也绝不启动状态, 使半整合记录看起来完成 。 已核实的付款失败后将进行校正 。 needs_attention: 钱是真实的,国家是诚实的"支付,尚未处理"。

报告事实,不是你的申报

“服务运行”和“客户被告知”是不同的事实:参考集运了一个完整的邮件,每个字段都是空白的,而跑旗却说是真的。分别返回(处理完毕,通知未遂),保持每一次通话 platform_notified 迫使 OpsIQ 当平台未处理且从未声称已交付时,即确认退后:从服务器上无法看到收件箱。

测量,然后写

在桥上运送一个只读的能力探测器:类的存在,方法签名,你打算呼叫的方法的源片,原始的听众,队列驱动,以及(当一个问题可以通过调用无害功能来回答)活电话本身。关于一个空心电子邮件的五个理论在来源解决之前就已经与测量结果相悖了。一个探测圆需要文件副本;一个活平台的错误写会让客户付出代价。

连接器

其他语言和其他数据库的桥梁

桥口模式不是PHP模式。OpsIQ呼叫是 HTTP 端点, 因此文件可以是节点、 Python、 Go、 Ruby、. NET 或 Java, 而后面的商店可以是任意的SQL发动机或MongoDB。“PHP-形状”是包装管道,这个制约决定了您的桥梁如何到达操作员。首先读一下交付部分:这是让人惊讶的部分。

连接器实际上需要什么

这是整个合同,里面没有语言

运输

HTTPS,每个电话都收到请求 没有尸体,没有其他方法

认证

秘密在... . . 一个共同的秘密 X-Opsiq-Bridge-Key 请求头,在恒定时间进行比较。不是查询参数,不是饼干,也不是基本认证。

参数

查询字符串。 op 命名表面, do 说明行动名称,其余部分是行动的论点。

回应

JSON. {"success":true,"data":{...}} 或 单 {"success":false,"error":"snake_case_reason"}内容 - 类型应用程序/json并且没有缓冲。

状态代码

200- 成功吗?403未配置或错键,404未找到, 请检查url=值 (帮助) 。405错误的方法,400糟糕的争论,501不支持这个方案 。

就是这样

没有框架,没有运行时间,没有OpsIQ如果它能服务于这个, 它可以是一座桥梁。

交付:哪些可以生活在桥梁/,哪些不能

签名的软件包包含一个文件扩展名的固定列表,而该列表以外的一个文件则被排除在ZIP之外. 列表不包含语言的桥桥因此不能在软件包内发运——但是它也不能再在您身上消失. Scause because.268月(半天)2026文件在 bridge/ 包件会掉下去,是硬相容性故障,所以包件拒绝通过,而不是安装其中没有桥.

构建时如何处理桥/ 文件夹
bridge/bridge.php     ->  SHIPPED, and drift-checked against the panel snippet
bridge/server.js      ->  SHIPPED, and drift-checked against the panel snippet
bridge/bridge.py      ->  REFUSED at conformance: "Bridge files are packaged" FAILS
bridge/bridge.rb      ->  REFUSED at conformance
bridge/main.go        ->  REFUSED at conformance
bridge/Bridge.cs      ->  REFUSED at conformance
bridge/Bridge.java    ->  REFUSED at conformance
ưμ㼯AJavaScript——全力支持.

签名的 ZIP 中的文件船, 以及片段验证器持有您的面板复制字节- 相同, 以两者中任意一个为准。 漂移检查读取了桥/ 中的每个文件, 而不仅仅是 PHP 文件, 因此带有 Stale 面板副本的升级桥会失败 。

其他一切——只通过小组交付

面板片段是纯文本, 不知它持有什么语言, 所以可以用于任何堆栈。 将整个程序放到 Webhook_ help. spippet_ template, 以片段_ filename 命名文件, 并且不要在桥上留下副本 / —— 符合会拒绝包而不是将包空载。 直接在webhuk_ h帮助中说, 操作员复制该文件而不是从包中获取 。

如果您真的需要软件包中的其他语言

Widen PackageSigner::EXTENSIONS deliberately, then re-sign and re-seed. That is a decision about what executable code Nabtech distributes, so make it on purpose — do not discover it from a missing file.

💡
将文件命名为 webhook_help.snippet_filename 当您的包件飞出不止一座桥时, 验证员就会知道哪个桥属于面板复制品; 没有它, 模糊的配对会被报告为符合性警告, 而片段被忽略 。
⚠️
漂移检查的要点是,桥文件及其面板副本是一个程序的两个副本,并会分出。 重生而不是手版 : php tools/sync_connector_bridge_snippets.php --apply,然后重新签名。

门,有六种语言

在所有地方按相同的顺序进行相同的四张检查: 失败关闭没有密钥, 一种方法, 从头部进行恒定时间密钥比较, 然后连接。 唯一的真正的陷阱是比较, 它是一个不同的陷阱 。

⚠️
比较一下SHA256对两个密钥而不是密钥本身的文摘。这在每种语言中都是正确的,它回避了一个事实,即几个恒定时参照国要么扔出或漏出长度不匹配的长度——当缓冲器的长度不同时,节点的计时SafeEqual会提高RangeError,从而将一个错误的密钥变成一个500而不是一个403.
节点. js——大门
// Node.js — no dependencies
const http = require("http"), crypto = require("crypto"), url = require("url");

const BRIDGE_KEY = process.env.OPSIQ_BRIDGE_KEY || "";   // empty = bridge OFF

const sameKey = (a, b) => {
  const ha = crypto.createHash("sha256").update(String(a)).digest();
  const hb = crypto.createHash("sha256").update(String(b)).digest();
  return crypto.timingSafeEqual(ha, hb);                 // equal lengths, always
};
const out = (res, payload, code = 200) => {
  res.writeHead(code, { "Content-Type": "application/json; charset=utf-8",
                        "Cache-Control": "no-store" });
  res.end(JSON.stringify(payload));
};

http.createServer(async (req, res) => {
  if (BRIDGE_KEY.length < 24)         return out(res, { success: false, error: "bridge_not_configured" }, 403);
  if (req.method !== "GET")           return out(res, { success: false, error: "method_not_allowed" }, 405);
  const given = req.headers["x-opsiq-bridge-key"] || "";
  if (!given || !sameKey(BRIDGE_KEY, given))
                                      return out(res, { success: false, error: "forbidden" }, 403);

  const q = url.parse(req.url, true).query;
  // ... dispatch on q.op / q.do exactly as the PHP bridge does
}).listen(process.env.PORT || 8787);
活佛-大门
# Python — Flask
import hashlib, hmac, os
from flask import Flask, request, jsonify

app = Flask(__name__)
BRIDGE_KEY = os.environ.get("OPSIQ_BRIDGE_KEY", "")      # empty = bridge OFF

def same_key(a: str, b: str) -> bool:
    return hmac.compare_digest(
        hashlib.sha256(a.encode()).digest(),
        hashlib.sha256(b.encode()).digest(),
    )

def out(payload, code=200):
    resp = jsonify(payload)
    resp.status_code = code
    resp.headers["Cache-Control"] = "no-store"
    return resp

@app.before_request
def gate():
    if len(BRIDGE_KEY) < 24:
        return out({"success": False, "error": "bridge_not_configured"}, 403)
    if request.method != "GET":
        return out({"success": False, "error": "method_not_allowed"}, 405)
    given = request.headers.get("X-Opsiq-Bridge-Key", "")
    if not given or not same_key(BRIDGE_KEY, given):
        return out({"success": False, "error": "forbidden"}, 403)
Ruby,. NET和Java,同样的比较
// Go
func sameKey(a, b string) bool {
    ha := sha256.Sum256([]byte(a))
    hb := sha256.Sum256([]byte(b))
    return subtle.ConstantTimeCompare(ha[:], hb[:]) == 1
}

func gate(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json; charset=utf-8")
        w.Header().Set("Cache-Control", "no-store")
        key := os.Getenv("OPSIQ_BRIDGE_KEY")
        if len(key) < 24 { out(w, 403, "bridge_not_configured"); return }
        if r.Method != http.MethodGet { out(w, 405, "method_not_allowed"); return }
        given := r.Header.Get("X-Opsiq-Bridge-Key")
        if given == "" || !sameKey(key, given) { out(w, 403, "forbidden"); return }
        next(w, r)
    }
}

// Ruby
def same_key?(a, b)
  OpenSSL.secure_compare(Digest::SHA256.digest(a.to_s), Digest::SHA256.digest(b.to_s))
end

// C# / .NET
static bool SameKey(string a, string b) =>
    CryptographicOperations.FixedTimeEquals(
        SHA256.HashData(Encoding.UTF8.GetBytes(a)),
        SHA256.HashData(Encoding.UTF8.GetBytes(b)));

// Java
static boolean sameKey(String a, String b) throws Exception {
    MessageDigest d = MessageDigest.getInstance("SHA-256");
    return MessageDigest.isEqual(d.digest(a.getBytes(UTF_8)), d.digest(b.getBytes(UTF_8)));
}

验证每个数据库引擎上的标识符

安全属性不会改变: 所提供调用器的表格或列名必须在插入前与真实的计数符相核对, 每个值必须是一个绑定参数。 只有内向查询、引用字符和呼号条款不同 。

MySQL财务报告和已审计财务报表MariaDB

表格: 数据 SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?。列:对 information_schema.COLUMNSAND TABLE_NAME = ?。带有反向引用,将内部任何反向重复翻倍。 LIMIT n OFFSET m.

PostgreSQL

相同信息_schema 视图,小写名称, WHERE table_schema = $1 (通常情况) public。引用时有双引号,内部任何双引出都加倍。 LIMIT n OFFSET m。注意折叠规则:未引用的标识符被折叠到下大小写,所以在解析一个名称时要比较不敏感大小写。

SQL服务器

相同信息_ CHEMA 视图。 引用后加方括号, 将括号内任何收尾的括号翻倍 。 ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.

SQLite

表格: 数据 SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'栏: SELECT name FROM pragma_table_info(?) ——使用表值表的形式,因为赤裸的 PRAGMA table_info(x) 语句不能取一个绑定参数,请字符串插入。这里正是您试图关闭的孔。引用双引号。 LIMIT n OFFSET m.

甲骨文语

表格: 数据 SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = :owner; 列从 ALL_TAB_COLUMNS。用双引文引用,并记住一个未引用的标识符折叠到UPPER上,相反PostgreSQL。页 OFFSET :o ROWS FETCH NEXT :n ROWS ONLY 12c 和以后的电话

MongoDB

没有SQL,所以没有标识符插入和约束参数,对于同一目标来说是不同的学科。见下文。

每个引擎的内向查询
-- MySQL / MariaDB
SELECT TABLE_NAME  FROM information_schema.TABLES  WHERE TABLE_SCHEMA = ?;
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?;

-- PostgreSQL
SELECT table_name  FROM information_schema.tables  WHERE table_schema = $1;
SELECT column_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2;

-- SQL Server
SELECT TABLE_NAME  FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = @schema;
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table;

-- SQLite
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';
SELECT name FROM pragma_table_info(?);

-- Oracle
SELECT TABLE_NAME  FROM ALL_TABLES      WHERE OWNER = :owner;
SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE OWNER = :owner AND TABLE_NAME = :tbl;
💡
解析, 然后使用 RESOLVED 名称。 即使检查过它, 也不要将呼叫者的拼写传递给查询 。 查看您从计划中读取的列表中的真名, 然后插上这个字。 它不花费任何费用, 它会弥合“ 此名匹配某事” 和“ 我即将运行的名称” 之间的空格 。

MongoDB: 相同的规则,没有SQL

没有可注入的查询字符串, 所以人们假设没有什么可以保护的。 包括: 过滤文档。 通过调用程序提供JSON直接进入 find() 让一个呼叫者发送 {"$ne": null} 或 单 {"$gt": ""} 中要预留一个值,然后悄悄地选择每个文档。您自己构建过滤器。

MongoDB——收藏允许列表,由scalar强制过滤,投影为编辑功能.
// Node + the official driver
const names = (await db.listCollections({}, { nameOnly: true }).toArray()).map(c => c.name);

function resolveCollection(given) {
  if (!/^[A-Za-z0-9_.-]+$/.test(given || "")) return null;
  return names.find(n => n.toLowerCase() === String(given).toLowerCase()) || null;
}

const coll = resolveCollection(q.collection);
if (!coll) return out(res, { success: false, error: "unknown_collection" }, 404);

// Build the filter from a validated field and a SCALAR value. Never spread
// caller JSON into it: {"$ne":null} would match every document.
const filter = {};
if (q.where_field) {
  if (!/^[A-Za-z0-9_.]+$/.test(q.where_field))
    return out(res, { success: false, error: "unknown_field: " + q.where_field }, 400);
  filter[q.where_field] = String(q.where_value ?? "");   // String() is the guard
}

// Projection is the redaction allow-list: drop secrets, never return them.
const projection = { password: 0, remember_token: 0, api_key: 0, secret: 0, token: 0 };

const limit = Math.min(Math.max(parseInt(q.limit ?? "25", 10) || 25, 1), 200);
const rows  = await db.collection(coll)
                      .find(filter, { projection })
                      .limit(limit)
                      .skip(Math.max(0, parseInt(q.offset ?? "0", 10) || 0))
                      .toArray();
收藏名来自列表 Collections

解开电话的拼写,使用下定名。

将每个过滤器值强制到平面

字符串() 或数字( ) 是防止操作员注射的整个防御。 您期望一个值的文档是 与 偏移 引号等同的 NoSQL 。

投影是编辑规则

排除投影中的秘密形状字段,所以它们不会离开服务器,而不是在之后从结果中去掉.

删除以 _id 显示的单文档

删除已解决的 _id 。 绝不删除 Many, 也绝不使用受调用者影响的过滤器。

允许的写入保留列表

与SQL: 将所收集的文献命名为可以触摸的; 并用解释拒绝其余的文献。

其他语言的身份终点

身份探测器是桥的另一半,它也是HTTP。签名块在每种语言中都是相同的: Base64url 有效载荷,HMAC-SHA256那个弦,加入一个点。

不要从头写这个字。 设置、 支持门户为门户提供每个语言的准备路线( 一次性, 2分钟的符号) 。 远程站点、 您的网站、 代码、 C. 识别登录客户自动携带每个语言( 一个小时的符牌加更新处理器) 的聊天版本。 从与您堆栈匹配的花味中取出签名符 。
复用时该如何改变

Those snippets mint a PORTAL handoff token, which is deliberately stricter: it carries jti and single_use:true and lives about 120 seconds because it travels in a URL. A bridge or widget identity token carries neither of those and uses a longer exp, minutes to hours.

是什么不变

site_key, iat, exp和顶级认证的: truth, 加上一个带有ID和用户名或电子邮件的管理员或客户主体。 相同的要求, 相同的签名, 同样的秘密 。

两种符号形状都验证

由三部分组成的JWT签署了HS256号工程,两部分的基质64url有效载荷加六分子也签了字。HMAC pHP 引用 。 使用您语言库中自然存在的任意一个。 JWT 库通常是 PHP以外的较短路径。

永远不要在浏览器里薄荷

每种语言都是真的,签名客户端意味着把网站秘密传送给每个访客.

老实说,选择

平台为 PHP

用 PHP 写出桥。 它在包中飞来, 它被漂移检查, 它可以启动平台自己的框架 读取身份探测器的活会话。 没有其它东西能给你们全部三个。

月台是节点

桥船,标志和漂移检查都跟PHP一样,没有放弃任何东西。

平台是Python,Ruby,Go,. NET或Java

通过面板片段交付并在面板正文中这样表示;不要将文件留在桥上/ , 符合度会拒绝包。 连接器在其他方面是完全正常的: 动作、 上下文提供者、 身份和来宾的外观都一样, 因为没有人在乎HTTP 呼叫的答案 。

您无法在平台主机上运行进程

那么桥图案就不是合适的工具。 一个桥会从自己的主机内部到达一个平台。 如果您只能从外部到达, 您正在写一个普通的API连接器与它所暴露的表面相对。

⚠️
还有一个值得规划的制约因素:身份调查器必须读取平台的登录会话,这通常意味着在平台自己的进程内运行,或者至少是在主机上运行,并访问其会话商店。用不同语言写成的与平台不同的桥可以舒适地服务数据,并且可能仍然难以回答op=admin_identity。如果这是你的情况,那么将您语言的数据桥和身份调查机运入平台。
连接器

给助手两分之一:行动和背景

连接器中缺少的就是这个“工作但无用”的单一最常见的事物。动作让 AI DO 事物。上下文部分让它知道事物。连接器需要两者,而管理员问的大多数问题都通过上下文回答,从不通过动作回答。一个有完美动作的连接器,没有上下文提供者会诚实地报告它看不到任何东西。

两者之分

行动——AI如何行事

以行动宣布。json或按寄存器返回。该模型选择一个,填充其参数,以及OpsIQ执行它。动作是用于动词:取消此预订,打开该票,改变此状态。

背景部分——AI如何知道事情

由"背景推介"在模型运行前所集成,"本月有多少订单","谁是我最新的顾客", "我们卖什么"都通过上下文的取景来解析,从不触及一个动作.

⚠️
缺少提供者的症状: 助理回答“ 没有启用连接器提供此上下文部分 ” , 而连接器安装、 启用和通过连接测试。 无记录, 无错误。 信息意味着没有提供者要求该部分 。

通用的区块词汇

OpsIQ您的工作是决定每个人在您的平台上的意义并回答它。酒店预订就是酒店的订单; 房间就是酒店销售的东西。 地图, 不要发明。

命令/ 待决命令_ 命令

无论您平台上的交易:订单、预订、预定、工作、货运。待处理的订单是过滤到未完成的列表中的相同列表 。

客户

顾客名册

products

平台销售的商品:产品,房间,计划,服务.

账单

收入和货币形状的总数,加上按州计数。

票、服务、域、服务器、活动

当你们的平台真的拥有它们的时候,请使用这些。不要强迫绘制地图,因为未解的段落比错误的一节要好。

你月台上还有别的吗?

声明自己的。 一个提供者宣布了部分( ): ['许可证','gates'] 将这些部分合并到通用的搜索权限列表中, 因此平台特定搜索可以使用, 没有核心更改 。

一天的代价是错的

一个上下文提供者 MUSST 执行接口。 注册类型检查它, 因此仅 LookS 右侧的类被跳过 。 任何地方都没有出错 。

提供. php——合同,取自Botble参考包
use OpsIQ\Platform\ContextProviderInterface;

/* MUST implement ContextProviderInterface: ContextRegistry::collectAll()
 * type-checks it, so a provider that merely LOOKS right is skipped and every
 * section answers "No enabled connector supplied this context section" — the
 * exact symptom, with no error anywhere. */
final class ContextProvider implements ContextProviderInterface
{
    public function slug(): string  { return 'yourplatform_context'; }
    public function label(): string { return 'Your Platform (orders, customers, products)'; }
    public function priority(): int { return 30; }   // lower renders earlier

    /** ADMIN only. The guest surface has its own provider and its own rules. */
    public function surfaces(): array { return ['admin']; }

    /** The universal section names this connector can answer. */
    public function sections(): array
    {
        return ['orders', 'pending_orders', 'clients', 'products', 'billing'];
    }

    public function isAvailable(): bool
    {
        try {
            $s = \OpsIQ\Connectors\ConnectorRegistry::getSettings('yourplatform') ?: [];
            return trim((string)($s['base_url'] ?? '')) !== '' && trim((string)($s['api_key'] ?? '')) !== '';
        } catch (\Throwable $e) {
            return false;
        }
    }

    public function build(array $ctx): string
    {
        $section = strtolower(trim((string)($ctx['section'] ?? '')));
        $limit   = max(3, min(50, (int)($ctx['limit'] ?? 20)));
        $query   = trim((string)($ctx['query'] ?? ''));
        try {
            switch ($section) {
                case 'orders':
                case 'pending_orders': return $this->orders($limit, $query, $section === 'pending_orders');
                case 'clients':        return $this->customers($limit, $query);
                case 'products':       return $this->products($limit);
                case 'billing':        return $this->billing();
            }
        } catch (\Throwable $e) {
            return '';   // a provider must NEVER break prompt assembly
        }
        return '';
    }
}
连接器注册

执行上下文连接器接口,并从上下文 Providers () 返回您的提供者。 连接器类也可以直接执行上背景 Provinder 接口, 并登记为它本身 。

返回纯文本, 不JSON

构建 () 返回一个文本块, 将它缩合到提示中。 为读取器写出它: 标题, 然后每行一行 。

返回"而不是扔"

检查一下自己的例外。一个提供商被记录并跳过,但返回'是合同。

构建器无法为您写入段落( C)

生成的上下文 Provider. php ships 段落 (): 数组 { return [;] } 且向导没有字段。 用手填写它, 并记住从向导重印文件。 先复制编辑 。

⚠️
写出真实的总数, 而不是您发送的行数。 页面不是总数。 一个不说就列出二十行的提供者会让助理自信地回答“ 您有”20当平台停放时预订669。一个便宜的COUNT和一个明确的行——“文件上的TOTAL:669(本列表显示最新的20——"——是整件事,一个自信地错误的计数比不计数还要糟糕.
无法被错误计算的区域块
$lines = ['YOUR PLATFORM — ORDERS (live, newest first)'];
$lines[] = 'TOTAL orders on file: ' . (int)$total
         . ' (this list shows the newest ' . count($rows) . ' only — never count these rows to answer "how many")'
         . ' | by status: ' . $byStatus;
foreach ($rows as $r) {
    $lines[] = '#' . (int)$r['id'] . ' ' . $r['reference'] . ' | ' . $r['status']
             . ' | amount ' . $r['amount'] . ' | ' . substr((string)$r['created_at'], 0, 16);
}
$lines[] = 'Use yourplatform_get_order (order_id) for the full record.';
return implode("\n", $lines);

说出你的行为OpsIQ可以从写作中看出读取

OpsIQWORDS在动作_id中将一个动作归为一类,它刻意保守:任何无法识别的动作都会被作为写作处理,并需要一张批准卡。请将动词右转并只读出一个运行符.

1
已损坏或需要确认为胜利

如果设定了其中之一,动作总是需要批准。 诚实地宣布这些动作——这就是行政主管的批准卡的表面。

2
身份证明里写字的词就成了个字

添加,创建,开放,更新,编辑,修改,删除,删除被销毁,取消,退款,暂停,终止,激活,批准,拒绝,发送,标记,重置,捕获,无效,关闭,再开,指定,撤销,授予,设置,切换,启用,禁用,发行,生成,应用,充值,支付,提供,更新、升级,合并,移动,转移,升级,旗子,注册,同步,推出,运行,触发,起步,停止,重启等几个功能.

3
读一个字就能读出来

获取,列表,搜索,查找,查看,显示,获取,计数,查取,描述,读取,导出,预览,测试,平移,状态,汇总,细节,最近,历史,检查,日志,统计,计量,概览,收入,分解,报告,分析,平衡,使用,定额,快照,洞察,饲料,草稿,分门别类,分类,建议.

4
然后HTTP方法决定

获取,头和选择被读取。

5
不然,就是写作

不承认意味着需要批准,这是故意的。

⚠️
写字在读出单词前会选中, 因此像 get_ and_ sync_ orders 这样的混合名称被归类为 WRITE。 请选择一个动词, 先放, 并保持它干净: 列表_ orders, get_ Customer, search-booking, 取消_ bookinging, set_ord_ status 。

只有平台真的有本地状态时, 才声明本地状态_ api

The native_api capability registers a generic <slug>_api_call passthrough so the model can reach endpoints your typed actions do not cover. On a platform with no API it is worse than useless: the model keeps reaching for a tool that cannot succeed, instead of using the tools that can.

构建者从您的数据访问答案中决定

Say the platform has an API and it declares native_api and emits the passthrough. Say it has none (bridge mode, or the "Platform with no API" profile) and it declares platform_bridge instead and strips native_api, so the two can never both be true. You no longer hand-edit this.

手写包还是要对的

如果您正在自己写出该表, 请声明一个本地的_ api 或平台_ bridge。 遵守将平台_bridge视为逃生舱, 桥连接器应该有, 而构建者拒绝在某个平台上声称“ 桥” 的规格 。API连接器。

无论是哪种方式,都保持ai_api_ reference. md诚实

On a connector that declares native_api the admin brain heads that file with a line naming <slug>_api_call. Without native_api it is headed neutrally instead, so a bridge connector no longer advertises a tool it does not have. Describe your real surface — for a bridge, that is your op and do vocabulary, not a REST endpoint table.

教管家大脑如何学习你的平台

Declare ai_brain_aware and ship two Markdown files. They are read from the INSTALLED package directory (opsiq/connectors/<slug>/) for ENABLED connectors only, and injected into the admin agent's system prompt.

ai_expertise_admin.md

IS 这个平台,它的数据是如何形成的,它的对象是什么,以及那些可以让助手猜测的怪事。写给一个从未见过这个平台的胜任的同事。

ai_api_reference.md

可调用表。 对于桥接器来说,这是您的操作,并使用其参数进行词汇,而不是一个 REST 端点表。

预算

大约6,000每个连接符保留字符,以及大约24,000整个块的字符覆盖每个启用的连接符。在每条连接符上,您的文件被切换;在切换符之前要简洁。

精准支付

这些文件是助理使用您的通用表格工具与错误的段落的回答之间的区别,因为从来没有人告诉过这些工具的存在.

💡
这两个文件必须放在INSTALLED包中,而不仅仅是你的源树中。它们都是普通的包文件,所以它们被签名所覆盖,并在ZIP中被运出——这也意味着在签名打破封条后编辑一个文件。 重新签名 。
连接器

通过连接器识别身份:管理员、客户、门户

一个签约合同服务于三个表面,连接者的工作是将"谁登录在平台上"变成一个签名的代币.OpsIQ,然后在OpsIQ其形状。连接器从未认证过任何人——平台是这样做的,签名上还带有这种断言。

三层地表,一个标志

行政员——你的员工,在后端

管理主体。部件在平台的管理面板内加载,每个工作人员都匹配到自己的OpsIQ代理 。 管理部件页面上完全通过 。

客户——在客户聊天时签入的客户

客户主题。 这是让登录的客户获得他们的WALE账户而不是匿名查询: 每一个订单,全部细节, 以及任何您允许的自助行动 。

门户——与支持门户的深层链接.

同样的索赔加上jti和单人使用,a120- 第二次生命,因为信使 旅行在一个URL并且必须花费一次。不要手动翻转这个 : 设置、 支持门户每个语言都包含一个已准备好的片段, 当账户区域运行于此服务器时, 平台会为您提供薄荷 。

有效载荷合同

此处没有可选的,无论其他地方有部分例子可能表明什么。

site_key

顶级。 必须是请求的站点密钥, 或拒绝该令牌 。

iat 和 exp 数据

顶级, unix 秒。 exp必须在将来和iat之后。 未来超过一分钟的标志被拒绝 。 保持生命短促 —— 分钟到小时 。

认证: 真实

除了解说,你平台的断言是 真正的人类被记录下来了

平台

顶级, 一个短的弹片来命名源。 它让连接器的身份提供者从另一个平台上告诉自己的信物 。

管理员或客户

指定主题对象。 它必须携带非空的ID, 以及用户名或电子邮件 。 每一个管理员的访问门都匹配这些内容。 两者同时包含。

薄荷 从波特布桥上逐字
$payload = [
    'site_key'      => $cfgSiteKey,
    'iat'           => time(),
    'exp'           => time() + 6 * 3600,
    'authenticated' => true,
    'platform'      => 'yourplatform',
    /* 'admin' or 'customer' — OpsIQ stamps the matching session identity
     * from whichever key is present. */
    $opsiqSubject   => $subjectPayload,
];
$payload64     = rtrim(strtr(base64_encode(json_encode($payload, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
$identityToken = $payload64 . '.' . hash_hmac('sha256', $payload64, $cfgSecret);

两个核查员, 和他们的失败

OpsIQ有两个符号验证人,他们并不完全相同。知道这一点可以节省你一个下午的时间,因为症状看起来与原因不同。

管理员部件有自己的校验器

opsiq/embed/admin_ajax.php 携带一个接受任一位置上认证的旗帜的本地验证器。对话列表、历史和未读都经过它,所以它们认证为罚款。

共享验证器更严格

opsiq/ 包括/ 客户_ 身份_ 托肯_ 验证.php 坐落在聊天流和核心 AJAX 后API. 它在历史上需要TOP级别的旗帜.

症状

历史和对话工作。 每次聊天都回答“ 需要admin 登录 ” 。 它读取时完全像会话错误, 而不是: 符号缺少顶级旗帜 。

当前的核心作用

它现在接受顶级或主体内部的旗帜,因此合同是统一的。旧的核心只读顶级。释放出每个发行时的犬形和您的包。

正在对此进行机器检查。 您的包中任何薄荷标识符的文件都会被静态扫描到合同上, 而平台的有效载荷会拒绝与精确的文件和行保持一致。 自己运行 : php 工具/ 验证_ 身份识别_ contracts. php。

客户端聊天中已签名的客户端

有两个事情必须是真的 核心必须给被验证的客户盖上印章 你的连接器必须呈递

1
你的桥或终点会铸成客户的纪念品

与管理员的签名符相同, 并带有客户主题。 从平台的会话中读取客户。 如果您的平台将客户签入了与管理员不同的守护符, 请读取您想要的守护符并且永远不要掉回主体之间, 这就是客户如何被交给管理员标志符 。

2
核心验证和印章

在一个有效的符号上, 核心标记已验证的对象进入会话。 您的提供者读取一个已验证的身份; 它永远不会认证 。

3
提供身份的人会给你的

检测客户端( ) 返回OpsIQ形状。它必须执行OpsIQ\Platform\Identity ProviderInterface,或注册默默地跳过它——与上下文提供者相同的陷阱.

4
您的客户范围动作接受客户身份

还有OpsIQ执行前将其锁定在已核实的身份上。该模型不能提供。

身份 Provider.php — 读取已验证的身份,将其呈现于OpsIQ形状
use OpsIQ\Platform\IdentityProviderInterface;

final class IdentityProvider implements IdentityProviderInterface
{
    public function slug(): string  { return 'yourplatform_identity'; }
    public function label(): string { return 'Your Platform identity (bridge-signed identity_token)'; }
    public function priority(): int { return 25; }   // ahead of the generic session provider

    public function isAvailable(): bool
    {
        try {
            $s = \OpsIQ\Connectors\ConnectorRegistry::getSettings('yourplatform') ?: [];
            return trim((string)($s['base_url'] ?? '')) !== '';
        } catch (\Throwable $e) { return false; }
    }

    public function detectAdmin(): ?array
    {
        $row = $this->sessionRowFor('_opsiq_admin_identity');
        if (!$row || !$this->isOurs($row)) return null;
        return [
            'id'       => (int)($row['id'] ?? 0),
            'name'     => $this->displayName($row, 'Admin'),
            'email'    => (string)($row['email'] ?? ''),
            'username' => (string)($row['username'] ?? ''),
            'role'     => (string)($row['role'] ?? ''),
            'platform' => 'yourplatform',
            'source'   => 'yourplatform_identity_token',
        ];
    }

    public function detectCustomer(): ?array
    {
        $row = $this->sessionRowFor('_opsiq_customer_identity');
        if (!$row || !$this->isOurs($row)) return null;
        return [
            'id'       => (int)($row['id'] ?? 0),
            'name'     => $this->displayName($row, 'Customer'),
            'email'    => (string)($row['email'] ?? ''),
            'phone'    => (string)($row['phone'] ?? ''),
            'platform' => 'yourplatform',
            'source'   => 'yourplatform_identity_token',
        ];
    }

    /* A session identity stamped by ANOTHER platform's token must not be
     * claimed here. An empty platform is accepted because older bridges did
     * not stamp one, and the site key already scoped the token. */
    private function isOurs(array $row): bool
    {
        $p = strtolower(trim((string)($row['platform'] ?? '')));
        return $p === '' || $p === 'yourplatform' || $p === 'remote';
    }

    private function sessionRowFor(string $key): ?array
    {
        if (session_status() !== PHP_SESSION_ACTIVE) return null;
        $row = $_SESSION[$key] ?? null;
        return (is_array($row) && (int)($row['id'] ?? 0) > 0) ? $row : null;
    }
}

客户范围的行动:两个锁,都需要两个锁

模型绝不能选择它读取的哪些数据。OpsIQ执行它一边,而您的平台也必须执行它另一边。一个锁是远离泄漏的窃听器;两个锁是合同。

锁定1 — OpsIQ覆盖身份参数

在客户聊天之前OpsIQ用 VERIFIED 访问者身份替换每个身份形状的参数:客户端_id,客户端d,用户端-id,用户口号,用户行号,客户口号_id取经验证的数字ID;客户端-识别器,客户点_dentification,账户_dnition取为字符串;电子邮件,客户机_邮件,客户头_email,用户去取经核实的电子邮件。无论建议的模式被丢弃。

锁定2- 您的平台重新扫描每个查询

取出你得到的ID, 并加入到每篇书写和每篇文字的 名称中。 绝对不要相信请求中的引用。 询问他人订单的签名客户必须空出, 而不是禁止。

将参数命名为锁定1可以找到他们

称它为客户_ id, 不是 cust 或 ref. a 参数OpsIQ无法识别它不能锁定的参数。

⚠️
给注册客户表面OWN业务,与管理员业务分开,即使SQL外观类似。 有两个不同规则的表面保持诚实; 一个有旗帜的表面在编辑错误的分支时变成漏出 。

0页接线: 连接器声明的探测器

You can spare the operator all page wiring. Add an admin_identity_probe_url setting (https only) pointing at your identity endpoint. The plain admin-widget loader from Remote Sites, Codes then works with no page attributes at all: the widget discovers the endpoint through the connector, calls it with the site key and widget token, and authenticates each admin individually. A page can still override with a data-identity-endpoint attribute or window.OpsIQAdminIdentityEndpoint.

设置。json- 探测器的设定
{
  "key": "admin_identity_probe_url",
  "label": "Admin identity probe URL",
  "type": "text",
  "placeholder": "https://your-site.com/opsiq-yourplatform-bridge.php?op=admin_identity",
  "help": "Set this to your bridge admin_identity endpoint and the plain admin-widget loader works with NO page wiring: the widget probes this URL by itself, the bridge answers with the signed identity of the CURRENTLY logged-in admin, and every admin is matched to their own OpsIQ agent. Leave empty to keep the admin embed off."
}
探测器是浏览器调用的

同源, 因此它不能携带自定义头。 它的认证是平台会话。 把它放入您的桥键门的 AHEAD , 使其远离记录数据, 并且完全不返回登录访问者 。

它能回答固定的形状

{"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} — and {"success":false,"authenticated":false,"error":"..."} when nobody is signed in.

页面源代码中没有长寿的秘密

只有签名, 过期的代号。

Laravel的完全终点执行,WordPress, WHMCS, Symfony and plain PHP, 加上来之不易的 Laravel 细节和故障排除命令, 都在管理部件页面上。 它们对于一个客户主体来说是相同的代码: 更改您读取的守护符和您所签名的主题密钥 。

连接器

出版: 编辑文件夹不出版

失去下午的最常见方式是在 market_ connectioners/ 下编辑连接器,重新安装, 并找到任何变化。 安装不会读取文件夹。 它们从市场目录中提取一个签名的 ZIP 。 发布是将您更改输入 ZIP的序列 。

为什么编辑没有做什么

marketplace_connectors/<slug>/ is the SOURCE

工作的地方,没有安装

书目上有签名的ZIP

安装下载,ZIP 验证签名并解开。在重建ZIP之前,每个安装都不断获得旧的软件包。

连接器构建器在别的地方发布

It writes into /connectors/<slug>/ on this install. That is a local connector, not a marketplace release. The two paths do not overlap.

发布顺序

1
将版本跳入两个文件

设置。json和连接器_合同。json。如果弹片、版本或能力集有异议,则会比较它们,但失败。在您在场时添加一个 ChangeGELOG.md 条目——这是需要的文件。

2
重新同步桥段

php tools/sync_connector_bridge_snippets.php --apply — only relevant if your package ships bridge/*.php, and mandatory if it does. Skipping it means the panel hands operators the previous bridge.

3
重新签名每个软件包

php 工具/ resign_all_connectioners. php — 签名覆盖了文件散列,所以任何编辑都会使其无效。 在每个文件最终完成后, 签名是最后的 。

4
导出签名密钥, 然后导出种子

播种者在构建ZIP时会给每个包签名,并且运行的背景是无法从设置读取密钥——所以它必须来自环境.

5
调出桥文件,如果你运送一个

重新设置连接器更新软件包。 它不会触摸位于操作员的网络根部的复制件。 请告诉他们, 在面板和更改日志中。

整个释放,顺序
# 2 — hold the panel copy identical to the shipped bridge
php tools/sync_connector_bridge_snippets.php --apply

# 3 — re-sign (do this last, after every file is final)
php tools/resign_all_connectors.php

# 4 — the seeder reads the signing key from the ENVIRONMENT only
export OPSIQ_CONNECTOR_SIGNING_KEY="$(php -r 'require "bootstrap/init.php"; echo opsiq_setting("connector_signing_key","");')"
php saas/scripts/maint/seed_marketplace_free.php --apply --only=<slug>

# verify before and after
php tools/verify_identity_contracts.php
php vendor/bin/phpunit tests/phpunit/Unit/Connectors
⚠️
为何导出不是可选的: 签名者先在 OPSI\\ CONNECTOR_ SIGNING_ KEY 中查找密钥, 再在连接器\ signing_ key 设置为第二。 渗出器运行在 SaaS 靴子和工具/ signal_ connector.php 靴上, 因此在两种设置中都不存在读取器 — 没有环境变量, 您可以得到“ 没有可用的签名密钥” 或每个报为签名失败的套件。 只有工具/ resig_all_ conpnecorders.phps 。OpsIQ并且可以自己找到钥匙。

实际是什么船

只保存签名封面

ZIP 是从签名人自己的文件列表中构建的, 因此您包文件夹中的一个偏差文件不会被运出。 这是刻意的: 一个用于搭载客户的未签名文件 。

覆盖的扩展

费普,json,js,(笑声)css,md,txt,, (中文(中国大陆) ).html, ssh, svg, png, jpg, jipeg, gif, webp, ico, yml, yaml——递归性地,包括桥/和测试/.json本身被排除在散列之外,然后添加到ZIP中,以便安装可以验证.

其它信息均报告为未包装

种子名称是它留下的每个文件。 读取该列表。 您期望运入的文件意味着错误的扩展名或错误的位置, 而不是默默的成功 。

编辑任何被覆盖的文件断开封条

包括一个马克下发文件,重新签署那个包裹.

需要分发的包中的文件

connector.php

返回连接器界面实例 。

settings.json

通称:shot,名称,版本,express_version,相容性,能力,连接器_contract_verersion,设置.

connector_contract.json

机器可读合同,其弹壳、版本和能力设定必须与设置相同。json.

读取,发展中国家,变换组,变相组,出自:

所有三个都经过检查, 以确认存在和最小尺寸。 DEVELOPER. md 需要真实的内容, 而不是根节点 。

每一个申报能力的文件

每个能力名称它所期望的文件——上下文的Context Provider. php,身份的Cident Provider. ffp,来宾-Lookup的GuestLookop Provinder. p等——除非连接器执行内在的能力.

没有什么像证书

协和扫描了三个Markdown文件,以获取密形值和私钥,在命中失败.

船开之前先检查一下

完全匹配套件是安装运行的同一套。它对照犬科合同检查清单,该合同规定每个申报的能力都有其文件和方法、每个薄荷文件中的标识卡合同、桥接-片段匹配、客机搜索许可人卫生、动作独特性和确认安全以及包签名。

4个在每次发布前运行
# conformance for every marketplace package
php tools/test_marketplace_connector_conformance.php

# the identity-token contract, statically, with file:line on failure
php tools/verify_identity_contracts.php

# the connector unit suite
php vendor/bin/phpunit tests/phpunit/Unit/Connectors

# the release gate
php tools/release_gate_connectors.php
💡
一次失败是预期的, 而不是问题: 包签名检查报告警告时您仍在编辑中。 它会清除您重新签名的时刻。 其他的失败都是真实的 。
连接器

连接器包和生命周期参考

这是建立连接器的源级合同 OpsIQ 可以发现、配置、验证、启用、执行、测试、签名和分发。

开发者的参考文献
连接软件包一个连接器包具有必要的连接器执行并显示,有可选动作,食谱,知识,资产和签名元数据.连接软件包developerMANIFESTv1生活状况管理工作场次范围d现场工作现场connector.php连接器类/工厂所需settings.json特征和设置方案所需actions.json行动定义可选signature.json包签名元数据释放1DECLARE特性和能力2IMPLEMENT生命周期和提供者3估价测试、 签名、 软件包
一个连接器包具有必要的连接器执行并显示,有可选动作,食谱,知识,资产和签名元数据.

最小包件

connectors/example_platform/
├── connector.php          # connector implementation / entry point
├── settings.json          # manifest + configuration schema
├── actions.json           # optional action catalogue
├── README.md              # setup, scopes, webhooks and limits
├── workflow_recipes.json  # optional reusable recipes
├── knowledge.json         # optional provider knowledge
├── profile.json           # optional connector profile
├── src/                   # optional client/provider classes
├── assets/                # optional admin assets
└── signature.json         # signed release metadata

合同明细表

settings.json 使用显示版本 1。验证器需要一个 swit,名称,版本, express_version, 兼容性, 描述和能力。兼容性宣告 opsiq_min 财务报告和已审计财务报表 opsiq_max。释放状态是其中之一。 生产, β 语录, 预览 或 单 模板;能力成熟度使用L1-L6. 后遗症包可以被警告而正常化,但新包应该通过而不警告.

核心连接器接口

  • 身份和设置: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • 寿命周期: onEnable() 财务报告和已审计财务报表 onDisable()。禁用必须是无损的;数据清理是单独的蓄意操作。
  • 入境/同步: handleWebhook(), poll(), backfill()。Poll处理增量工作;回填进口历史,必须安全地重复。
  • 支助: pushReply() 平台接受回复。
  • 行动: registerActions() 供应可执行行动合同。
  • 警卫: securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

抽象基础还提供可选的块回填,客户列表,电子邮件账户发现/创建,订阅者,管理员/客户检测,帐单/context/身份提供者,响应提取,重试HTTP呼叫, JSON- 路径访问,模糊的排名和助学者。

能力和认证

支持的能力名称包括动作,触发器,上下文,身份,销售,计费, inbound_ticket, outbound_reply, sync_users, sync_departments, security_events, customer_import, security_native_block, promo_audience, promo_feed, email_mailbox, native_api, ai_brain_aware 财务报告和已审计财务报表 ai_tickets。建造者提供 API 钥匙,无记名者,基本, HMAC, OAuth 2 客户证书, OAuth 2 授权代码和自定义认证模板.

书记官处的生命周期

  1. 发现器会加载包并验证其显示.
  2. 配置每个工作空间都存储;秘密被加密.
  3. 连接测试在不启用连接器的情况下验证证书 。
  4. 启用调用 onEnable(),同步动作定义,并可以启动初始回填.
  5. 投票/webhook/订阅者执行总是带有工作空间上下文.
  6. 禁用电话 onDisable() ,并停止活动而不删除导入的数据。
  7. 清洗是单独的明确行动.

正确性规则

  • 在每个读取,写出,缓存键中使用工作空间/站点键,去发键和网通取取.
  • 进行回填,网卡摄入并写入动作自定义。在平台提供时,请记录外部的ID/事件ID。
  • 对于远程系统,使用其 API; 绝不假定其数据库表格存在于 OpsIQ 连接。
  • 返回结构化、保护客户安全的错误。 永远不要暴露秘密、原始提供者的痕迹或另一个工作空间的存在。
  • 仅声明软件包实际执行的能力。 actions.json 目录不会使动作变得可用,直到连接器安装、启用、配置及其连接有效。

测试和释放

运行 PHP 标识、 显示验证、 连接测试、 动作计划测试、 Webhook 签名/ 重播测试、工作空间同位素测试、 回填重排测试、 停用连接测试和失败/ 重复测试。 然后应该签署和验证市场包, 包括设置/ 允许/ webhuk 文档, 并声明其真实的发布状态。 连接器的图板和显示是权威的可用信号 。

连接器

连接器配方

常见接线器设置的分步配方.

食谱
连接器配方A 类 Shopify 设置食谱作为核对表:创建app,授予范围,粘贴符和测试,启用webhooks,放出测试命令.连接器配方Shopify食谱 · Shopify 使用网络呼号在其中创建自定义应用程序 Shopify 管理员授予范围:读取命令,读取客户...粘贴存储域 + 令牌,单击测试启用 Webhook 同步( 自动登记命令)设置测试顺序→载于销售额30s1STEP BY STEP复制贴子的食谱2REAL PLATFORMSShopify · WHMCS · Stripe· 英镑3实录测试顺序显示于 30s
每份食谱都是你从上到下遵循的核对表 Shopify 有实时命令的webhooks,通过测试命令验证.

食谱 : Shopify 有实时的网络呼号

假设情况:
目标:连接 Shopify 自动命令同步和 GDPR 遵守规定。
怎么办:

1. Create a custom app in Shopify admin (Settings > Apps > Develop apps). 2. Grant scopes: read_orders, read_customers, read_products, write_customers. 3. Copy the Admin API access token. 4. In OpsIQ Connectors > Shopify, enter store domain and token. 5. Click Test Connection. 6. Enable Webhook sync, OpsIQ registers order/customer webhooks automatically. 7. GDPR webhooks register automatically (data_request, customers/redact, shop/redact). 8. Verify: place a test order, check it appears in OpsIQ Sales within 30 seconds.

食谱 : WHMCS 融合

假设情况:
目标:连接 WHMCS 所以AI可以查询客户,服务,机票和发票.
怎么办:

1. In WHMCS admin, Setup > Staff Management > Manage API Credentials. Create a key. 2. In OpsIQ Connectors > WHMCS, enter URL, API identifier, and secret. 3. Click Test Connection. 4. Install the WHMCS module addon for ticket relay. 5. Verify: ask the admin AI "Find client [email protected]". WHMCS data should appear.

食谱 :Stripe支付额

假设情况:
目标:跟踪Stripe支付和让AI查查交易。
怎么办:

1. In Stripe Dashboard > Developers > API keys, create a restricted key (read: Customers, Charges, Invoices, Subscriptions). 2. In OpsIQ Connectors > Stripe, enter the restricted key. 3. Test Connection. 4. Add webhook endpoint in Stripe: copy the webhook URL shown on the connector's own settings page. It carries a per-connector token and looks like https://your-domain.com/api/connectors.php?slug=stripe&token=THE_TOKEN A URL without the token is rejected with "Missing slug or token". 5. Select events: charge.succeeded, invoice.paid, customer.subscription.updated. 6. Copy the webhook signing secret to OpsIQ. 7. Verify: make a test payment, check it in OpsIQ Sales.

食谱:谷歌商业简介

假设情况:
目标:将英镑连接起来,用于审查管理、职位和见解。
怎么办:

1. Create a Google Cloud project, enable Business Profile API. 2. Create OAuth 2.0 credentials (Web application). 3. Set redirect URI: copy it from the connector's own settings page. Google and Microsoft connectors share one slug-less callback: https://your-domain.com/connectors.php?oauth=callback Everything else uses https://your-domain.com/connectors.php?slug=<slug>&oauth=callback OAuth redirect URIs must match EXACTLY, and a URI missing oauth=callback is read as a webhook and answered with "Missing slug or token". 4. In OpsIQ, enter Client ID and Client Secret. 5. Click Authorize, sign in, grant access. 6. Select your business location. 7. Verify: reviews, posts, and insights should appear.

连接器

扩展 CRM 站点智能( S)

OpsIQ 子系统为扩展打开。连接器可以插入新的能力到 CRM 或 Site Intelligence, 没有更改到 OpsIQ 核心,通过平台能力登记册(\)OpsIQ\ 平台\ 能力注册 。 宣布能力, 实施其小方法集, 将连接器运送到 OpsIQ 发现它,并连接到UI,客户 360 时间表和安装提示 。

扩展 CRM & SI
平台能力由能力注册公司发现的左侧供餐能力巴士(CRM,站点智能,分析)上的连接器.平台能力工作空间您的连接器声明能力CRM· 付款/邮箱站点情报本地列表 ^ 等分级_数据分析网络分析 \ 报告并吞噬CapabilityRegistry发现它并电线显示 UI + 时间线( T)1DECLARE能力, 不编辑核心2PLUG INCRM SI 分析巴士3AUTO-WIRED用户界面、时间表、提示
连接器宣布能力(日历、浓缩、排名数据、分析.)和 OpsIQ 自动连接到CRM和Site Intelligence,没有核心变化.

申报能力

申报(设置.json)

添加一个 <domain>_capabilities 数组,最适合无编码/市场位置连接器。域名 : crm, site_intelligence.

代码( connectionr. php)

执行 crmCapabilities() / siCapabilities() 返回相同的描述符。

声明a CRM 日历提供者(设置)。json)

假设情况:
目标: 使日历连接器出现在CRM时间表会议小组。
怎么办:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

申报网站情报提供者(设置.json)

假设情况:
目标:将当地列名数据输入网站情报。
怎么办:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

能力公共汽车及其方法表面

crm / 日历

createEvent($settings,$params) →{成功,事件_id,html_link,meet_lin克}; listEvents; freeBusy被驱动的 OpsIQ\CRM\卡伦达尔布里奇。

圆柱/浓缩

enrich($settings,$params) →成功,成功,开动了OpsIQ\CRM\浓缩桥(在连接供应商时,公司创建上也自动运行).

crm / 符号

sendForSignature($settings,$params) →{成功,信封_id, sign_url}。 由\ 驱动 ?OpsIQ\CRM\EsignBridge(英语:SignBritch).

站点_ 智能/ 本地列表

listLocations, listReviews, getInsights. 船舶通过Google Business Profile连接器.

站点_信息/ 级别_ 数据

keywordRanks($settings,$params) →成功 由\\\驱动OpsIQ\SiteIntelligence\RankDataBridge. 船舶:塞尔帕皮连接器.

分析/ 网络分析

report($settings,$params) (同步/出厂)+ ingest($settings,$events) (进口) 由\\驱动 OpsIQ 分析 网络分析 Bridge. Google Analytics (GA4)连接器. data. API 对报表, 用于导入的测量协议。 CRM + Site Intelligence 等连接器可打开分析器( 域名) analytics / analytics_capabilities).

支付/支付_提供方

listPayments, customerPayments, createPaymentLink被驱动的OpsIQ\ payments\ pagements Bridge。 显示客户的付款CRM时间 + 发送交易的支付链接。 船舶 :Stripe付款连接器。域名 payments / payments_capabilities.

邮箱/ 电子邮件_ sync

listMessages + sendMessage被驱动的 OpsIQ\ Mailbox\Mailbock Bridge。客户的邮件 360 时间线 + 从交易发送邮件。 Ships: Gmail + Outlook/ Microsoft 365 连接器。域名 mailbox / mailbox_capabilities.

共享 OAuth 应用程序+一个方向

所有Google连接器通过\\共享一个应用程序 。OpsIQ\OAuth 共享 GoogleApp. 设定 google_oauth_client_id/_secret 一次和 Calendar, Analytics, Business Profile + Gmail 全部工作( 每个连接“ (可选) ” 字段是覆盖的) 。 它们也共享 ONE 重定向 URI, <site>/connectors.php?oauth=callback (没有每个连接器的弹出),因为Google显示没有 API a. 将重定向URIs添加到应用程序中; OpsIQ 从签名中恢复连接器 OAuth state 非ce. 登记该单项 URI 一次和每个 Google 连接器( 当前 + 未来) 授权, 不再设置控制台 。 返回 SharedGoogleApp::resolve(...)其为: redirect_uri 从你的 oauthParams(); 绝不用硬码对每个粘接器进行重定向。 微软连接器通过\\ 做同样的事情 。OpsIQ\OAuth 共享微软App( S)microsoft_oauth_*).

导入按钮是能力配置的

电话 导入 (历史倒注)和 进口客户 按钮只显示实际执行这些按钮的连接器,通过反射检测到,所以没有要声明的旗帜。 backfill() 或 单 backfillChunk() 以获取导入按钮; 覆盖 listCustomers() (返回{电子邮件,首页_名称,...}) 以赚取导入客户。 继承 AbstractConnector 不可操作,按钮仍会隐藏, 因此 UI 从未提供导入连接器无法执行 。

AI 跨公交车

客户关系管理代理商提议并预订交易信号会议(\)OpsIQ\ CRM\ 会议提案→CalendaBridge)和自动增收新账号,"AI"运行CRM环路,跨接通巴士执行.

客户端- 聊天票查询( U)fetchTicket())

两级,无核心变化

当访客在客户端聊天中引用出票号码时("T-的状态如何?000123?"), OpsIQ 分两层解决。 等级1 读取共享 OpsIQ 售票店,每个连接器 inbound_ticket 照照着它的门票,所以同步门票只为每条接通码为0的全线连接器工作. 等级2 旧票的倒数 从未被照过:核心呼叫 OPTIONAL fetchTicket() 在每一个执行它的启用连接器上。它是 duck-typed (发现者) method_exists(),喜欢 contextProviders()/audienceCatalog()),所以签名 ConnectorInterface 无需的连接器(电子邮件/聊天源,

⚠️
所有权是强制性的,你的拥有者必须强制执行。 fetchTicket() 获得在芬兰的被核查访客身份 $ctx (client_id + client_email。从该身份中解析平台客户,只查询客户的票,然后在详细记录上重新检查所有权。 null 任何错失、错配或错误,从不重复客户的数据。返回 null 轻而易举地贬低到"找不到那张票"
连接器.php,取回Ticket()合同(参考:连接器/whmcs 和连接器/天台)
<?php
// connector.php — OPTIONAL universal client-chat ticket resolver (Tier 2).
// Only add it if your platform keeps its OWN ticket store that may hold tickets
// not yet mirrored into OpsIQ. Return the normalised array below, or null.
//
// $ref      = ['mode' => 'id'|'tid', 'value' => string]  (from extract_ticket_ref)
// $ctx      = ['client_id' => int, 'client_email' => string]  (VERIFIED visitor)
// $settings = your connector settings
public function fetchTicket(array $ref, array $ctx, array $settings): ?array
{
    try {
        $email = trim((string)($ctx['client_email'] ?? ''));
        $cid   = (int)($ctx['client_id'] ?? 0);
        if ($cid <= 0 && $email === '') return null;            // no verified identity → refuse

        // 1) Resolve THIS visitor on your platform (by verified email/id).
        // 2) List ONLY their tickets and match $ref against the ticket number/id.
        // 3) Re-confirm ownership on the detail record before returning.
        //    On any miss/mismatch/error → return null (never leak).

        return [
            'tid'        => 'T-000123',     // the customer-facing reference
            'id'         => 123,            // your internal id
            'status'     => 'open',
            'subject'    => '…',
            'department' => 'Billing',     // '' if your platform has none
            'priority'   => 'high',
            'opened_at'  => '2026-06-29 10:00:00',
            'last_reply' => '2026-06-29 12:00:00',
            'message'    => 'opening message text',
            'replies'    => [               // oldest → newest; opening message may be first
                ['who' => 'You',   'date' => '…', 'message' => '…'],
                ['who' => 'Staff', 'date' => '…', 'message' => '…'],
            ],
        ];
    } catch (\Throwable $e) {
        error_log('[yourslug][fetchTicket] ' . $e->getMessage());
        return null;                                             // graceful degrade
    }
}

平台如何使用它

发现

CapabilityRegistry::providers($domain,$type) 列出已安装/启用/准备状态的提供者(基于文件系统;仅针对启用的旗帜。)

选择

CapabilityRegistry::active($domain,$type) 返回第一个已装入连接器和设置的备妥提供者。桥将使用此选项,而不是硬编码弹片。

通知待安装

当一个特性需要尚未连接的能力时,UI显示一个一击Connect/Install 提示,从不死控件.

完整导线

看见了 connectors/PLATFORM_CONNECTORS.md (CRM + 站点情报)和 connectors/CRM_CONNECTORS.md 包里有东西

连接器

客户自助查询和退款( 建立连接器供客户聊天)

签入的客户可以询问客户聊天AI关于他们的OWN账户("我的余额","我的订单", "Did support answer my ticket"),如果业务允许的话,则请求退款。所有这些都通过您的连接器声明提供动力: 不 OpsIQ 核心变化,没有平台硬编码. AI将您的外观称为本地工具(它不能发明一个),身份是锁定在被验证客户端的服务器侧面,结果会自动为AI进行裁剪.

宣布客户查询

In your actions.json,一个只读动作成为客户 呼叫所有THREE: "scope":"client", "requires_confirmation":false, "is_destructive":false使用时 "scope":"both" 当同样的搜索也被您的团队在行政AI中调用时。完整的词汇是 。 admin, client, both 财务报告和已审计财务报表 system (system 联系不到大赦国际,API仅使用 Webhook 路由 。 其它的都会被直接拒绝 : 软件包验证失败, 动作不安装 。 没有 writing 范围——为撰写助理服务 admin 行动设定。

身份规则(强制性)

从标准集中命名您的身份参数。 锁定到已验证的数字 id : client_id, clientid, customer_id, user_id, userid, account_id。锁定到该标识为字符串: client_identifier, customer_identifier, account_identifier。锁定到已核实的电子邮件 : email, client_email, customer_email, user_email. OpsIQ 锁定并自动填充来自平台验证的签名客户;AI从不看到或选择身份. 非标准名称失败关闭(拒绝,从未泄露).

何事必须只管管

任何没有被该身份所覆盖的事物:逐一取出(order_id/ticket_id 以“单”、全库列表、自由文本搜索等形式进行搜索。这些是任何平台上的跨客户泄露。请保留这些内容。 "scope":"admin".

结果塑造( 带答录键)

查找结果在到达AI前进行结构修剪: 密钥被丢出,长字符串和列表被封上,空白字段被刷出,比密钥盖保持宽的平面映射 首先带答案的密钥, 钱 (credit, balance, amount, total, due, paid),身份(email, *name, phone, company),状态(status, active, expir*, renew*),日期、计划/产品/领域/服务/订阅/订单/发票/票面字段、货币、计数和 stats/summary/totals。在剩余座位到最小值-第一键之前。实用指导:用标准词汇来命名您的字段,并返回回答客户问题的字段而不是原始字段。100-键平台堆放;词汇外命名的场来争夺所剩座位,可以从非常宽的有效载荷中修剪.

退款 \ 您的连接器提供的内容

两项原始业务,无政策:(1付款核查可按身份和交易参考书进行过滤(你的) API 必须和过滤器),例如: whmcs_get_transactions; (2退款执行行动(scope:"admin", requires_confirmation:true, is_destructive:true,从未暴露客户),例如. whmcs_refund_order。企业在设置中选择两个密钥→客户聊天;OpsIQ重新验证支付服务器侧,应用企业的政策框(上限,年龄窗口,月限),在框内发售,并备有其他所有内容的检讨票.

无代码构建器

连接器构建器的动作编辑器有相同的控制:设置"谁可以使用"给签名的客户,同时将两个字都写出收件箱,并使用标准身份参数名.

参考执行情况

客户自服务( C) 条目 connectors/whmcs/actions.json, woocommerce/actions.json, oscommerce/actions.json; 全合同于 connectors/README.md §8.1–8.2 财务报告和已审计财务报表 ConnectorInterface::registerActions().

连接器

客人查询——让访客追踪预订、发货或订货,不需签到(客人查询)

酒店,快递和许多商业平台为持有参考但无登录的客户服务:有预订确认的来宾,有追踪号码的收信人. guest_lookup 功能( 连接器合同, 模式: 生成) 让您的连接器为客户端聊天AI 中的访客服务 —— noOpsIQ核心更改, 没有平台硬编码。 您的连接器宣布什么是证明权利, 哪些字段可见 ;OpsIQ执行开关,节流阀和制服拒绝。

信托模式

参考+ 证明, 永远不识别

访客提供记录参考文献(与您申报的目录相匹配),加上您选取的证据——通常是记录上的电子邮件。您获取动作通过参考检索记录SERVER-SIDE;OpsIQ'' 生成的提供者将证明与 FETCHED 记录进行比较。 访问者的输入从不可信, 也没有建立可验证的身份: 匹配使访问者有权使用该记录的允许输入字段, 其它的则没有 。

统一拒绝( 无列举词)

未找到和校正匹配生成一个相同的答案。 明确指示AI 永远不要确认是否存在参考信息, 也永远不要发明记录细节。 尝试是每个谈话+限制费率的 。IP在你联系人被咨询之前 由核心完成

双选入, 两种默认关闭

在业务允许双开关之前,任何服务都不为来宾服务:设置中全工作空间的控制→警卫→"客户端聊天中的嘉宾记录浏览"(允许访问且始终得到密码确认,即使可选的升级取消),以及您的连接器自己的 guest_lookup_enabled 设置切换。单独安装或启用连接器不会打开来宾表面。

专注的客人表面

生成的供应商登记册 guest 上下文表面——结构上与 admin 财务报告和已审计财务报表 customer。现有的上下文提供者从未被匿名访问者咨询,而客人提供者也从未被咨询过签入者。它收到的ctx载有聊天信息、线索ID和来访者声称的(未经核实)预聊天邮件作为证明候选人——没有身份字段。

在建构器中宣告

1
定义获取动作

在动作步骤上,添加一个只读动作,通过引用返回 ONE 记录(例如. GET /bookings/{booking_number})并用别名绘制其反应字段:状态,到达,出行,房间_类型,客户_电子邮件. .

2
勾选“ 客人的检查”

能力步骤上,启用 guest_lookup。显示一个专用面板:选择取取动作,命名引用参数,给出引用模式(例如正则正文) \bBK-[0-9]{4,10}\b),命名记录("订票"),并取出证明——记录上的电子邮件(推荐)或无(仅参考,用于只身份信使追踪).

3
允许列表可见字段

准确选中客人可能看到的字段 。 其他的都是 DROPPED —— 从未编辑过 。 构建者拒绝在许可列表中设置 PII 形状字段( 电子邮件、 电话、 地址、 付款...) , 而放出门兼容套件在发布前会重新检查同样的规则, 所以手编辑的字段不能偷偷插入。 注意安装时间验证只覆盖了清单和签名, 所以在您飞船前自己运行兼容套用字段。 证明字段本身是永远无法显示的 。

4
出版和启用

构建器释放 GuestLookupProvider.php ——用口号加固执行,每套生成的包件相同——并添加 guest_lookup_enabled 切换到连接器的设置。当访客询问您的记录类型时,商业部门会手持两个开关和聊天AI。

合同规则

仅状态形状字段

想想"在公共追踪页面上信使会打印什么":状态,日期,房间或服务类别,计数. 姓名,联系方式,街道地址,支付数据和自由文本笔记在匿名聊天中没有位置——构建者和符合者都拒绝.

AI只从街区回答

生成的提供者在结束输出时会给出一个指令,只从列出的字段回答,并提供其它任何内容的出票. 许可列表中未包含的细节是"聊天时没有的"——根据设计.

后续行动继续发挥作用

提供者在同一次对话中重新从访客最近的消息中提取引用,所以"以及什么时候退账?"在不重打引用内容的情况下工作,匹配的引用和证明邮件被作为CANDIDATES在聊天线上被记住,因此后续内容不会重新询问。他们只是候选者:每转仍然重新连接记录服务器侧并重新比较证明,然后释放出一个字段.

手写软件包

市场包可以自己运出 GuestLookupProvider.php implementing ContextProviderInterfacesurfaces(): ['guest']。完全遵循生成的模板的合同——通过引用获取、校正匹配服务器侧面、统一拒绝、只允许列表输出——并声明 guest_lookup in capabilities. 遵义验证来宾表面并扫描PII的许可列表.

💡
来宾查询是聊天AI只读上下文,他们从不执行动作,从不创建身份,也从不解锁上面的客户自助服务动作路径——该路径仍然需要一个平台验证的已签入客户.
连接器

宣传对象(促进-受众)

让LIVE客户端和您平台的计费状态开展目标活动:"有未付款发票","订单待决", "订阅被取消". 任何连接器(安装前,市场,或您自己建造的)都会通过实施两个小方法加入. No. OpsIQ 核心变化,没有平台硬编码: 您的连接器作为平台出现在工作室中 目标分页中,并带有它自己降下的事实,多个连接器可以同时被启用.

宣传对象
宣传对象被证实的身份传递给一个连接者观众Flags称产生事实,驱动着目标设定规则,并带有一个失败闭塞的注释.宣传对象工作空间登录已核实身份观众旗( )您的连接器风险unpaid_invoices = 2欧盟驻科法治团未支付发票(_I) 1运动表演失败已关闭: 客户端未知或任何错误→竞选活动不公开1TWO METHODS对象 Catalog + 旗帜2LIVE STATE未付款、待付和未付款3FAIL-SAFE永远不要向错误的人展示
连线员回答登机访客的现场收费问题 录音室锁定了他们 却没关闭 所以收费提议永远不会传到错人身上

如何运作

1
宣布你的事实

在您的连接器类上执行受众Catalog( ) 。 它返回一个标签和您平台可以回答的密钥列表。 每个密钥都会在工作室中以您的平台名称下降出 。

2
回答一个客户端

Implement audienceFlags(array $identity). OpsIQ calls it at delivery time with the VERIFIED logged-in visitor identity (from the widget identity token, the same identity the client chat AI uses). Return a flat key => value map.

3
完成( E)

启用连接器。 升职工作室的目标标签会扩展“ 客户端和账单” 区域, 列出您的平台; 管理员构建规则, 如“ 未付费的发票 QQ ” 1" ;每个事实也成为个性化变量,例如: {unpaid_invoices}.

连接器. php,完整的促销服务合同
public function audienceCatalog(): array
{
    return ['label' => 'My Billing Platform', 'keys' => [
        ['key' => 'unpaid_invoices', 'label' => 'Unpaid invoices (count)', 'type' => 'number'],
        ['key' => 'pending_orders',  'label' => 'Pending orders (count)',  'type' => 'number'],
        ['key' => 'client_status',   'label' => 'Client status',           'type' => 'text'],
    ]];
}

public function audienceFlags(array $identity): array
{
    // $identity = verified token payload: ['email' => ..., 'id' => ..., 'name' => ...]
    $email = strtolower(trim((string)($identity['email'] ?? '')));
    if ($email === '') return [];
    $client = $this->api('GetClient', ['email' => $email]); // your platform call
    if (!$client) return []; // unknown client -> return [] (fails CLOSED)
    return [
        'unpaid_invoices' => (int)$client['unpaid_count'],
        'pending_orders'  => (int)$client['pending_orders'],
        'client_status'   => (string)$client['status'],
    ];
}

合同规则

广告能力

添加( E) 'promo_audience' 连接器 capabilities() 数组, 因此平台和市场将它列为可收听的( 发现也从方法存在中起作用, 但声明它是干净的信号 ) 。 预安装 connectors/whmcs 连接器是全部参考执行。

密钥命名

小写蛇小写2-60 字符, 匹配 ^ [a- z0- 9_] + $. 类型: 数字、 文本、 bul。 观众Flags( ) 返回的未声明的密钥仍然可用于规则, 但声明您支持的所有内容, 以便管理员能够看到 。

身份被验证

The $identity array comes from the signed widget identity token issued by the customer site at login, never from client-supplied fields. If your platform cannot resolve the identity, return an empty array.

失败的关闭 永远

在任何错误上( E)API 下, 客户端未找到, 超时) 返回 [] 。 缺少事实的规则使得竞选活动无法显示。 计费定向弹出绝不能到达错误的人手中 ; OpsIQ 在规则匹配者中也执行此规定.

业绩

accessed Flags () 最多每个连接器每个页面浏览一次, 并且只在一个已发布的运动实际使用您的平台规则时才被调用 。 无名访问者花费了您的零呼叫。 保持它1-2 API 电话; OpsIQ 在请求中回忆。

免费提供的运算符

Admins combine your keys with =, !=, >, >=, <, <=, contains, is set, is empty, you only supply values.

个性化符号

每个事实都比竞选副本中的变数加倍: {unpaid_invoices}, {client_status} 外加内置 {first_name} 财务报告和已审计财务报表 {client_email}. 数值在渲染前被消毒。

无编码市场连接器

自动事实

声明( A)JSON- 市场连接器获得FREE的促销:如果连接器宣布客户/用户、发票、订单或订阅资源, OpsIQ 从您已有的搜索操作中获取客户端_状态、 未付_ 发票、 金额_ 到期、 未决_ 订单、 活动_ 订阅和订阅_ 状态。 根本没有代码 。

自定义目录( 设置) 。json)

添加一个观众_能力对象_{"标签":"我的平台","钥匙": [{"键": "开_卡", "标签"; "开出手推车", “类型": “数字'}}}] , 以控制工作室倒下中出现的具体事实(和标签).

测试您的提供者

1
启用连接器

连接器 > 您的连接器> 启用。 然后打开任何活动的目标标签。 您的平台必须出现在“ 客户端和账单( 连接) ” 下 。

2
构建规则

添加: 您的平台 ^ a key +++ 1并设置“只使用Logged-in客户端”。保存并发布。

3
验证双向

登录到您的平台时, 客户端必须符合规则( 流行必须显示) , 而不是( 弹出必须隐藏) 。 登录的访客不会符合登录的规则 。

从您的代码( 海关触发器) 中启动一个活动

为什么

内置触发器(延迟,滚动,出站提示,闲置,点击,页面查看,聊天/票务活动)之外,可以在成功退站后,在废弃一车后,当SPA更改路线等时,从网站的任何地方或连接器前端点燃一个运动.

怎样

设定竞选触发器为 自定义 带有事件名称(例如: checkout_failed),然后从您的页面中调用全局钩:

网站/连接器前端 JS
// Any campaign whose Custom trigger event matches will be evaluated
// (it still respects targeting, frequency caps and audience rules).
window.OpsIQPromo && window.OpsIQPromo.fire('checkout_failed');
💡
发射事件绝不绕过目标或频率。 它只释放“何时”的信号。 竞选活动在显示前仍须通过所有规则(地球、观众、同意、盖子) 。
全套指南(设计、块块、分析、A/B、出版)在应用中帮助中心居住,地点如下: 开始→宣传工作室。这里的能力自动从连接器/或市场连接器中任意的 ENBELED 连接器上发现。没有注册。将两种方法运走,其余由工作室进行。
连接器

勘测连接器能力(合同) 2.2)

电话 survey 能力允许任何平台向Survey Studio提供经核实的客户身份适配器、受众事实、安全变量和受援者候选人。 promo_audience 并且不给调查、答复、分析或电子邮件发送的连接者所有权。

💡
执行状态。 授权完成, 今天可使用: 连接器合同 2.2, SurveyConnectorInterface,生成的专用构建器面板 SurveyProvider.php,将元数据包和兼容隔离所有船舶。消费尚未被接通: SurveyConnectorRegistry 已实施和测试,但调查运行时间尚未调用,因此提供者的健康未在行政界面中浮出水面,也没有公布的连接器软件包宣布该能力。CRM外联物资化和第一批运送的供应商绘图仍然是单独的阶段,现在根据这项合同进行构建;预计在稍后发布时将开始消耗。

供应商的责任

观众目录和事实

仅为服务器验证的、工作空间约束对象声明已输入的语句事实并解析值。典型的事实包括:命令_计数、最后_顺序_状态、取消_顺序-计数,客户_创建_at、活动_订阅_计分、过去_到期_发票_计价和开_计票等。

可变目录和值

声明客户、账户、订单、订阅和支持变量,并带有类型、敏感性和允许上下文。调查副本需要回放和输出文本。

收件人呼叫

可选列举候选人CRM以稳定的外部ID、有限定的页码、确定光标和与同意有关的元数据进行外联。调查在发送之前冻结选定的受众。

身份

仅在签名、过期、目的、连接器和工作空间验证后从调查身份网关接受身份。浏览器提供的电子邮件、身份证、标签或账单都从未具有权威性。

运行时间健康

SurveyConnectr Registry 旨在报告兼容,被封禁和无法获取的提供者,而不披露设置,路径,原始身份或例外消息,并且永远不能引用被封存的提供者. 报告表面尚未在管理员UI中被曝光:今天被封杀的提供者只是惰性.

规则失效

未声明的密钥、 错误的类型、 超大小的值、 主题不匹配、 连接器超时和未知身份被拒绝 。 需要无法获取事实的目标规则并不匹配 。 对收件人的页面进行封顶和审计 。 在公开预览或日志中从未出现过敏感值 。

建构器释放门

合同 2.2 生成的能力登记册条目、接口、勘测绘图面板 SurveyProvider.php,能力版本,README/开发商参考和符合性装置。商务、服务台、SaaS桥和本地的PHP配置图都包括它; API 连接器选择使用。静态门拒绝一个叫作促销命名空间、表格或能力的调查提供商。

💡
从 Pulation 复制的只导入: 构建者可以一次翻译相容的 Pulason 映射,保存完整的 Survey 拥有的复制和记录出处。删除或更改 Pullacy 映像时,不得改变 Surview 的行为。
连接器

答复反馈能力(合同) 2.2)

电话 reply_feedback 能力镜像一个平台的 自己每个复制的收视率 OpsIQ 顾客给内部员工回信的明星 WHMCS 客户区在SAME的答复中登陆 OpsIQ admin 线程,其芯片、代理信用、反馈页面条目和团队及性能计算等同于一个函数的评级 OpsIQ 传送门票,一个存储器,一个芯片,一个管道;连接器只翻译.

写路径

有两条入道和一条真理。OpsIQ 入口门票是本地写作,平台门票通过连接器流出,核心登陆每个活动通过 ReplyFeedback::recordMirrored(): 相同的列, 仅限员工规则, 单评- 每补读最新赢取的语义, 工作空间印章和客户之声索引门户写作用途。 连接器本身不会写回馈行 。

格式化( 四个文件, 然后重新签名)

1
connector_contract.json

添加能力. reply_feedback 条目:版本 1.0, RefaceFedbackConnector Interface,方法回放Feedback Catalog和拉回回放,意指入行_ticket.

2
settings.json

添加回复_ 反馈到能力列表。 这就是连接器发现的内容 。

3
spec.json

声明回复_ feedback. modes( poll and/或webhook)和平台的评分等级。 这是符合的门读取的 。

4
运行时类

执行接口, 列表回复( feedback in policy ()), 然后重新签名包 。

供应商的责任

目录

宣布模式,平台自身的评级等级(核心正常化为本地1-5)和任何反应符号。目录必须与Spec一致。json.

调取翻译

拖放回放后退的犬事:平台票id,平台回放id,评分,可选反应/评论,提交时间和稳定事件_id。它读取并翻译,从来不写作。

出现严重性

事件_id是稳定的,每反馈一次STATE,所以重播的事件是无操作的,并且改变评级覆盖(最晚获胜,如"传送门").

光标纪律

页面是被绑定的,具有决定性;不推进的光标会结束运行。历史回填排为滚动窗口,绝不是一出巨型拉出。

探险安全

没有配置, 请返回一个空的完整页面而不是丢出。 匹配的跑者探测器带有空参数 。

未解析

核心通过镜像标记将每个事件解决为本地回复,即票面镜已经盖有邮票(<slug>:<ticket>:reply:<reply>) 无法解决的事件会被放弃,从不猜测;反馈只附在工作人员的答复;代理信用总是来自答复中现有的作者。评级书写永远不会改变作者身份。这就是为什么能力需要 inbound_ticket 或 单 ticket_mirror.

工作实例: WHMCS

WHMCS 存储客户端区域 / reply star 收视率 tblticketreplies.rating。该数字 WHMCS 连接器宣布民意调查模式1-5规模,舰只a ticket_reply_ratings 中继命令,并翻译出每一行的编号与 whmcs:<ticket>:reply:<reply> 标记其票面镜已经印有邮票。连接器升级后,将桥面文件复制到 WHMCS 服务器,所以新命令存在。

💡
与界面,事件形状,正常化规则和相容性核对表完全开发者合同: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md 输入 OpsIQ 接受:对平台内部的答复进行评分,等待小时民意测验,并在 OpsIQ 显示芯片,反馈页面列出它,一个重放的事件不会改变任何东西。
连接器

车票合并能力( 2.4)

电话 ticket_merge 能力可以合并一张票 OpsIQ 每个连接的售票平台上都有一个合并. 被保存的站台票接收合并的出票信息,从每张合并的入票信息开始,而不是只关闭合并的站站台出票.

为什么它存在

合并到 OpsIQ 将合并票的每条信息移入保留票并取出合并票。在合同签订前 2.4 仅听到连接符 ticket.deleted 每张合并票。 WHMCS 关上那张罚单和存物 WHMCS 票房从未收到客户首次写到的内容:主体显示[MERGED],内容缺失.

核心发送

合并(每次合并)

ticket_id, ticket_number, subject and external_ref of the KEPT ticket; native_table (opsiq_tickets); site_key; sources, the merged tickets oldest first, each with ticket_id, ticket_number, subject, external_ref, client_name, client_email, created_at and messages [{reply_id, author_type, author_name, created_at, body}]; merged_by; merged_at. Messages are the customer-visible conversation, captured before the move. Internal notes are never included.

票,删除(每张合并票)

仍然开火,现在 merged_into {ticket_id, ticket_number, external_ref}核心不会把它交给一个 宣布 ticket_merge;其他消费者可以从删除中分辨出合并.

出局的网络呼号

a SaaS webhook 端点订阅入票。删除的点点也收到出票。 computingd, 所以在之前构建的集成 2.4 听到合并的声音。

你的连接器会做什么

声明

List ticket_merge in capabilities() and settings.json, and implement TicketMergeConnectorInterface::mergeTickets(array $merge, array $settings). Required on Contract 2.4 for any package that declares ticket_mirror or handles ticket.deleted; conformance fails it otherwise.

本地合并( 最多)

When the kept ticket and a merged ticket both have a copy on your platform (TicketMergeContract::twins() resolves them from external_ref), call the platform's own merge.

否则,增加一个私人便条

A merged ticket with no copy on your platform: add TicketMergeContract::transcript() to the kept platform ticket as a PRIVATE note. Never a public reply, which would email the customer their own old messages.

报告未合并的内容

返回 {ok, 模式, 合并、 注意、 未合并、 有错误}。 每一份合并的复制件都无法合并, 核心应用正常的删除处理( 关闭或删除为) mirror_deletes)到准确的这些。返回模式只有在平台没有合并和没有私人注释时不支持。一个传输或认证失败是ok=虚假的原因;它被记录在诊断中。

感谢您的切换

同一面镜设置, 大门, 您的另一个票面镜刻门合并 。

合并从您的平台开始的

Resolve the platform ids and call TicketMergeContract::applyInbound(['<prefix>'], $keptId, $mergedIds). OpsIQ merges its copies with _origin=mirror, so nothing is pushed back to you.

已发运的履约情况

WHMCS

合并Ticket(ticketid = 保留票,合并ticktids = 为合并票)时,两者均在 WHMCS; 另加文字记录。 中继器的出票机钩将合并 OpsIQ 工作人员合并时的复制件 WHMCS.

Zendesk

邮编 /api/v2/tickets/{id}/merge.json 加上笔录作为私人对保留票的评论,因为 Zendesk 关闭合并的门票而不移动其评论.

OpsIQ SaaS桥

邮编 /v1/tickets/{id}/merge 与 source_ids,它移动门户回复和附件;内部回复中附有从未在门户上的门票记录。 /manage 合并 OpsIQ 副本。

连接器构建器

ticket_merge 生成, 从未选中 : 一个生成的软件包在链接其创建的平台票( 开有链接票的. 创建的用户) 、 处理出售票。 删除或声明时会声明 ticket_mirror。在车票台阶上,下 合并,选择平台的合并动作(地图合并).target_remote_id,然后合并。source_remote_ids 或合并。source_remote_id)和私人笔记动作(图注.remote_id 和 note.body) 。 生成的合并Tickets () 都使用两者。 如果两者都不使用, 构建者警告说, 合并的票面信息不会到达平台 。

💡
全额合同: doc/contracts/CONNECTOR_CONTRACT.md,区间车票合并。接受:两张车票并入 OpsIQ 然后打开月台上保存的门票 合并后的门票的第一个信息就在那里
连接器

连接器市场

市场让你发现、安装和发布社区建造的连接器。

采购网
连接器市场社区连接卡的可搜索网格,包含分类,安装按钮和明星评分.连接器市场工作空间搜索连接器...巧妙地时间安排安装★ 4.8HubSpotCRM安装★ 4.6邮件小便电子邮件安装★ 4.7QuickBooks会计安装★ 4.5特维利奥短消息( T)安装★ 4.9标题文档安装★ 4.41DISCOVER社区连接器2绝对一击3PUBLISH签名并提交您的文件( S)
浏览群落连接器, 安装在一击中, 或签名和发布您自己的、 预安装的和市场级, 两者都可以搜索 。

查找和安装连接器

1
浏览

转到连接器 > 市场站。 搜索名称、 类别或平台 。

2
审查

请检查date=中的日期值 (帮助) 描述,支持的动作,以及收视率.

3
安装

点击安装。 连接器包下载并安装到 market_ connectioners/ 。

4
配置

在连接器中启用, 输入 API 证书和测试。

发布连接符

1
构建和测试

使用连接器构建器。 请检查所有动作是否工作 。

2
软件包

生成剖面图.json 行动。json,知识。json,以及 PHP 文件。

3
签名

Run php tools/sign_connector.php <slug> to sign ONE package (it also accepts a path). It does not boot OpsIQ, so give it the key: either --key=<secret> or the OPSIQ_CONNECTOR_SIGNING_KEY environment variable, otherwise it stops with "No signing key available". tools/resign_all_connectors.php re-signs EVERY package on the install and reads the key from settings by itself, but it can also mint a NEW install-wide signing key, so reach for it only when that is what you want.

4
提交

上传市场提交材料流程供审查。

两个连接层

连接器/ — 实际运行的

运行时发现根。这里的一切都是现场直播: 与飞船连接的连接器OpsIQ任何从市场安装的东西, 以及连接器构建器在这个安装上发布的任何信息。

市场_连接器/ — 软件包的作者

发布首方市场包的 SURCE 。 它不是一个发现根:这里没有活的,直到它被包装、签名、种子入目录和安装,然后复制件在连接器/ 中着陆。

💡
查看这两个地方。 您在 market_ connectioners/ 下编写的软件包不是运行的复制件—— 将复制件安装到连接器/ , 只有复制件在运行时被发现 。Stripe马根托大商业公司2,PrestaShop,OpenCart,Amazon SES,Postmark和Resend都是市场软件包:在期望在连接器中找到之前先安装一个.
开发者

API 和网络浏览器

密码 API 而 Webhook 构建器允许您创建自定义 API 内部的结束点和网点听众 OpsIQ 不写入原始 PHP 。

API 构建器
API 和网络浏览器构建者选择一个触发类型(输入webhook,调度,事件,手动),该类型可以反馈到可配置的动作中.API 网络hook 构建器( W)工作空间卢旺达输入网点附表(克龙)OpsIQ 事件手动行动映射到的字段→创建票/ 通知/ 呼叫 API保存结束点1特里格涅斯语Webhook 计划 活动 手册2NO RAW PHP内建于UI3行动映射字段, 然后运行
构建没有生的 PHP 的结束点: 选择触发( 输入 webhook, 调度, 事件或手动), 然后将字段映射到一个动作 。

触发器

活动

出事时跑 OpsIQ,或者当外部系统发布匹配您的 Webhook 的事件时 URL 键入事件名称,例如票.created。

时间表

使用内置间隔事件之一作为事件名称: cron. minute. cron, hourly 或 cron; daily。 动作和触发屏幕有这些按钮, 所以您不必记住它们 。

词组

当管理员用平话向 AI 询问时运行。 添加应该匹配的短语, 例如找到客户 。

输入网点

外部系统向您发送 HTTP POST OpsIQ 网点 URL 任何触发器都会听到事件起火的声音

有时只运行它:条件

事件触发器可以携带条件, 所以它只能运行于所收到数据匹配时。 不附带条件, 它每次发生火灾时都会运行 。

外地

事件数据路径。 使用一个点来表示嵌入值, 例如客户端. email 。

匹配全部或任何内容

选择每个规则是否必须匹配,还是只匹配其中之一.

文本测试

等同,不等于,包含,不包含,从开始,不是其中之一。匹配忽略了首都。

数字测试

数字作为文本的对比仍然正确。

存在测试

存在, 缺少, 空出, 不是空出 。

紧急门票的待命工程师只写页

假设情况:
事件票 创建的,有一个规则:优先等于紧急.
怎么办:

动作需要紧急门票, 其它一切则需要跳过。 您的尾部不需要过滤 。

💡
如果规则空白, 触发器会运行在每一个匹配事件上, 这与以前的条件相同。

行动

发送网页钩

将 HTTP POST 发送到外部 URL 带有自定义的有效载荷。

创建票

创建带有指定部门,主题,以及消息的后台票.

发送电子邮件

发送带有自定义模板的电子邮件 。

更新记录

更新客户、机票或CRM记录。

运行连接器动作

执行一个已注册的动作, 并使用其连接器许可和确认规则。

运行 OpsIQ 常规 API 动作

搜索完整命名的将军 API 目录. 字段,范围,权限,确认,一能和干运行支持来自活动作合同;工作流程执行在其所保存的工作空间和管理员上下文中.

发送提供者- 本地 API 请求

使用连接器原生 API 读取或确认 API 当提供方端点没有被覆盖的动作时写入动作。 证书仍然保存在连接器内, 并且只接受相对提供方路径 。

动作触发构建器( T), /api/v1.php, OpenAPI和Postman使用相同的ActionContactRegistry,因此一个可选择的动作不能从运行时间文档中漂移.
开发者

触发烹饪本

常用自动化的可被使用触发-动作配方.

如何运作
触发烹饪本一个食谱流:一个上行时间. down webhook通过一个出品过滤器,然后粉丝出厂制作紧急票并通知Slack.uptime.down监视器网点如果脚印filter创建紧急票通知 Slack #ops (帮助)
触发烹饪本

自动创建监视的票

假设情况:
监测系统在服务器下架时发送POST.
怎么办:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Slack关于大订单的通知

假设情况:
Slack每次客户发出订单时都会发出信息$100.
怎么办:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

每周文摘电子邮件

假设情况:
每周一早上9点给管理层的邮件摘要
怎么办:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

高额的破门票

假设情况:
如果一张罚单没有回信的话 24 几个小时后,分配到团队领导。
怎么办:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

开发者

建立你的第一次行动

这种走行道从头开始产生简单的连接器动作.

行动建设
采取行动动作定义表单: 名称查找命令, 请求到 /orders/{id},输入的 id 参数,和通过 200 测试。新行动工作空间新行动名称lookup_order请求GET/orders/{id}参数id \ 字符串200 已找到命令1DEFINE名称、方法、终点2PARAMS输入3科技现场直播 200 结果
从零开始构建一个动作。 命名它, 设置方法和终点, 声明输入的参数, 并测试它为活 200.

两种行动

在开始前, 请决定您需要哪个。 两者都是在同一屏幕中配置的 。

调用外部 API

动作向您的平台发送 HTTP 请求。 当 OpsIQ 需要伸出援手 做点什么在你身边

运行连接符动作

动作运行一个已安装的连接器已经提供的东西。 当工作已经可用时选择它, 您只想触发它。 从列表中选择连接器动作, 所以没有线条可连接 。

第二个选项是您如何重新使用连接器已经可以做的、 不再构建任何功能的功能 : 读取一个票线, 查找客户, 导入联系人等。 从下拉中选择连接器动作, 您就可以完成 。
1
规划行动

示例:"Lookup_products",按产品名称,回价,股票,和描述来查找.

2
在行动中定义。json

添加动作定义 :

行动。json- 真正的显出外形
{
  "actions": [
    {
      "action_id": "lookup_product",
      "label": "Look up a product",
      "category": "Catalogue",
      "description": "Find a product by name and return price, stock and description.",
      "scope": "admin",
      "requires_confirmation": false,
      "is_destructive": false,
      "delivery_type": "http",
      "http_method": "GET",
      "http_url": "/api/products/search",
      "parameters": [
        { "name": "name", "type": "string", "required": true, "in": "query",
          "description": "Product name to search for" }
      ],
      "returns": [
        { "alias": "id",          "path": "data.id",             "type": "string" },
        { "alias": "name",        "path": "data.name",           "type": "string" },
        { "alias": "price",       "path": "data.price",          "type": "number" },
        { "alias": "stock",       "path": "data.stock_quantity", "type": "number" }
      ]
    }
  ]
}
⚠️
3 个动作完全无法注册 。 动作_ id 是 要求的, 必须是 QUIRED2改为:100小写字母、数字和下划线的字符 – 没有一个条目会被直接拒绝 。 列表是带有“ 动作” 列表的对象, 而不是由动作名称键入的映射。 而响应映射则是带有 DOTTED 路径( data. id) 的“回路”, 而不是 JSONPath (. data: id ) —— 在注册处任何地方都没有“ 反应- 映射”、“ 方法”、“ 终点” 或“ 参数” 密钥。
3
使用干燥设备测试

在连接器构建器审查步骤中, 按 Dry 运行。 它会对照您的软件包运行完整符合性核对表, 并在您提供资质时进行真正的连接测试。 它不使用样本数据 。

4
校验AI 使用

问管理员AI:"找出产品Widget Pro". AI应该找到并执行动作.

⚠️
将动作添加到动作中。json不创建 AJAX 路由, 所以没有可再生成的。 连接符动作被同步到OpsIQ当连接器被启用或其设置被保存时:重新保存连接器并出现新的动作. sweets/gen_route_registry.php覆盖了管理员AJAX发送,对连接器动作没有影响.
开发者

入境事件终点

输入端点接受签名 JSON 从另一个系统,并把它变成可输入时间、评分和工作流程的可复制的联系活动。

产品屏幕
入境终点每个入境来源都有自己的 URL、秘密、绘图和最近的活动结果。入境终点工作空间来源5ACCEPTED12.4kREJECTED18现场工作现场计费平台订阅活动健康,我们不爱产品应用注册和使用事件健康,我们不爱事件编号provider_event_id脚踏车签署X-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL 和秘密的,我们没有2MAP PAYLOAD电子邮件、事件和ID3实录HMAC 然后摄入
每个入境来源都有自己的 URL、秘密、绘图和最近的活动结果。

每个发送系统创建一个源 。OpsIQ 生成一个 URL 密钥和秘密 发送 JSON 与 Content-Type: application/json 并用HMAC-SHA256 签署确切的生体:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

地图 JSON 联系电子邮件、事件名称和可选事件 ID 的路径。 事件 id 是首选的调试密钥。 接受的活动会进入联系时间线, 并会影响铅分、 片段、 生命周期规则和工作流程 。

在解析商业数据之前拒绝无效的签名。 旋转一个密钥, 将两侧更新到控制窗口中; 不登录密钥 。

开发者

外出网络浏览操作

出站的Webhook管理创建签名订阅,测试终点并监测同步交付和重试健康.

产品屏幕
出局的网络呼号出道的网页列出了HTTPS端点,事件订阅,送货健康以及一击签名测试.出局的网络呼号工作空间ENDPOINTS7SUCCESS99.2%复试4现场工作现场CRM镜像联系* 和交易。健康,我们不爱辅助巴士票,*和聊天。 *健康,我们不爱数据仓库*重试试验交付已签名的样本有效载荷准备1SUBSCRIBEHTTPS URL 和事件2AUTHENTICATEHMAC 签名3OBSERVE交付铁路和复线
出道的网页列出了HTTPS端点,事件订阅,送货健康以及一击签名测试.

全管理员创建了HTTPS端点,选择了特定事件或通配符,安全地存储了这个秘密并发送了测试. OpsIQ 以 HMAC-SHA256 标记原始有效载荷:

X-OpsIQ-Signature: sha256=<hex hmac>

解析或动作前验证签名。 交付是同步的, 在大约之后自动重试 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours使用最近的交付铁路检查状态、响应代码和尝试计数。

您的接收器必须是一元化的, 因为任何同步系统都可以重播。 只有在持久接受后才能返回 2xx 响应 。

开发者

Webhook

Webhooks 允许外部系统通知 OpsIQ 当事物降临的时候,OpsIQ 当内部发生事(外延)时,通知外部系统。

Webhook
出局的网络呼号出局的webhoks屏幕:一个端点表,上面有名称,订阅事件,最近的发送状态点,以及一个Send-test按钮.出局的网络呼号工作空间终点+保存终点名称事件发 展Slack# 售货警报器https://hooks.slack.com/…crm. deal.won, order (说到点子上)测试CRM镜像https://api.acme.com/hook联系人*,票. created测试扎皮尔https://hooks.zapier.com/…chat.started测试1ENDPOINTS名字,事件, URL2SIGNEDHMAC + 自动重审3SEND TEST核查交货情况
真正的出站-webhooks屏幕:每个端点都有其事件,最近的交付健康,以及一次点击的Send测试,签名和再试.

出局的网络呼号

签署

转到设置 > Webhooks。 添加一个结束点 URL 并选择要接收的事件。

活动

订阅特定事件或 ["*"] 用于安装的完整列表如下,以及 webhooks.events.list 返回为JSON.

重试

以指数回放重试失败的交付。 之后 15 连续的失败,端点是自动失效.

签名

每一份都签了名 X-OpsIQ-Signature carries v2=<hex>,而签名的字符串是 version.timestamp.delivery_id.body ——不是仅身是躯体。总是精确地验证并重建弦。请参见下面的例子。

SSF 保护

OpsIQ will not send to private/internal IPs (127.x, 10.x, 172.16.x, 192.168.x, 169.254.169.254).

自动发送

Webhooks 是通过任务队列发送的,而不是屏蔽 OpsIQ 操作。

稳定事件标识

每个事件都有独特的事件_id,在重复时保持不变以进行分解.

每一次送货都会有结果

X-OpsIQ-Event

例如事件名称 ticket.created.

X-OpsIQ-Delivery

交付的ID,在复读时保持不变——用它来忽略重复.

X-OpsIQ-Timestamp

签字时Unix秒,拒绝超过5分钟的

X-OpsIQ-Signature

签字日期为 v2=<hex>。在 =:左侧是版本,右侧是您比较的值.

X-OpsIQ-Signature-Version

目前采用的计划 v2。从头读取而不是硬编码,如果添加了v3,你的代码会继续工作.

⚠️
签名字符串是 version.timestamp.delivery_id.body仅将尸体抓起是核查失败的最常见原因——每一个真正的交付都被拒绝,终点看起来也断了。

核查交付情况

PHP —— 校验一个OpsIQ网点
<?php
// Read the raw body BEFORE any framework parses it — the signature covers
// the exact bytes we sent, so a re-encoded array will not match.
$raw      = file_get_contents("php://input");
$sigHeader= $_SERVER["HTTP_X_OPSIQ_SIGNATURE"] ?? "";   // "v2=<hex>"
$ts       = (string)($_SERVER["HTTP_X_OPSIQ_TIMESTAMP"] ?? "");
$delivery = (string)($_SERVER["HTTP_X_OPSIQ_DELIVERY"] ?? "");
$secret   = "your endpoint signing secret";   // shown once when you add the endpoint

// 1. Refuse a stale delivery. This is what stops a captured request being replayed.
if ($ts === "" || abs(time() - (int)$ts) > 300) {
    http_response_code(401);
    exit(json_encode(["error" => "Stale delivery"]));
}

// 2. The header names its own version: "v2=<hex>".
[$version, $received] = array_pad(explode("=", $sigHeader, 2), 2, "");

// 3. Rebuild exactly what OpsIQ signed.
$canonical = $version . "." . $ts . "." . $delivery . "." . $raw;
$expected  = hash_hmac("sha256", $canonical, $secret);

// 4. Constant-time compare, so a timing attack cannot reveal the secret.
if ($received === "" || !hash_equals($expected, $received)) {
    http_response_code(401);
    exit(json_encode(["error" => "Invalid signature"]));
}

// 5. Accept. Deliveries retry, so treat a delivery id you have already
//    processed as a success and do the work only once.
$event = json_decode($raw, true);
// ... your handling ...

http_response_code(200);
echo json_encode(["received" => true]);
节点.js-验证一个OpsIQ网点
const crypto = require("crypto");

// express.raw gives you the exact bytes OpsIQ signed. express.json() does not.
app.post("/opsiq-webhook", express.raw({ type: "application/json" }), (req, res) => {
  const raw      = req.body;                                  // Buffer
  const sig      = req.headers["x-opsiq-signature"]  || "";   // "v2=<hex>"
  const ts       = req.headers["x-opsiq-timestamp"]  || "";
  const delivery = req.headers["x-opsiq-delivery"]   || "";
  const secret   = process.env.OPSIQ_WEBHOOK_SECRET;

  // 1. Reject stale deliveries (replay protection).
  if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) {
    return res.status(401).json({ error: "Stale delivery" });
  }

  // 2. Split "v2=<hex>" into its version and its value.
  const [version, received] = sig.split("=", 2);

  // 3. Rebuild what OpsIQ signed: version.timestamp.delivery_id.body
  const canonical = Buffer.concat([
    Buffer.from(`${version}.${ts}.${delivery}.`),
    raw,
  ]);
  const expected = crypto.createHmac("sha256", secret).update(canonical).digest("hex");

  // 4. Constant-time compare. Lengths must match first or timingSafeEqual throws.
  const a = Buffer.from(expected), b = Buffer.from(received || "");
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).json({ error: "Invalid signature" });
  }

  // 5. Accept, and make the work idempotent on the delivery id.
  const event = JSON.parse(raw.toString("utf8"));
  res.json({ received: true });
});

安装时可以发送的每个事件

从运行的构造中生成,所以总是与您所打开的版本相匹配.

52 events can be delivered to a webhook endpoint on this install. Subscribe with ["*"] for all of them, or name the ones you want. The General API action webhooks.events.list 返回此列表为JSON,所以你的代码 从来不用硬编码。

分析 (1)

analytics.anomaly

Fired by PHASE_ANOMALY_ALERTS when a daily KPI (sessions, pageviews, conversions, revenue) deviates from its same-weekday 4-week baseline beyond the configured threshold. Payload: day (required), title, site_key, anomalies.

商业 (2)

commerce.order.created

Fired the moment a chat-confirmed order lands on the merchant platform (connector or custom-actions integration) - before payment. Subscribe to sync carts, reserve stock, or notify fulfilment systems. Payload: reference (required), connector, amount_minor, currency, customer_email, thread_id, occurred_at.

commerce.payment.confirmed

Fired exactly once per order when the gateway actively verifies the payment (amount and currency exact). This is the settlement signal - it rides the same claim that prevents duplicate receipts, so it can never double-fire. Payload: reference (required), connector, occurred_at.

联系人 (6)

contact.conversion

Fired by OpsIQ.

contact.erased

Fired by OpsIQ.

contact.lifecycle_changed

Fired by OpsIQ.

contact.status_changed

Fired by OpsIQ.

contact.tag_added

Fired by OpsIQ.

opsiq.contact.upsert

Fired by OpsIQ.

conversation (5)

conversation.assigned

Fired when a conversation is assigned to an agent or unassigned. Payload: thread_id (required), site_key, assigned_admin_id, by_admin_id, occurred_at.

conversation.created

Fired when a new Client Chat conversation (thread) is opened. Payload: thread_id (required), site_key, channel, client_email, client_name, visitor_id, created_at.

conversation.message.created

Fired when a visible message is written to a conversation by the visitor, an agent, the AI or the system. Internal notes do not fire. Payload: thread_id (required), message_id (required), site_key, sender_type, admin_id, message, has_attachment, created_at.

conversation.rated

Fired when the visitor rates a conversation (1-5 stars). Payload: thread_id (required), site_key, stars, comment, trigger, admin_id, occurred_at.

conversation.resolved

Fired when an agent resolves a conversation and hands it back to the AI. Payload: thread_id (required), site_key, by_admin_id, occurred_at.

缩写 (6)

crm.company.created

Fired when a CRM company/account is created. Payload: company_id (required), name.

crm.deal.created

Fired when a CRM deal/opportunity is created (by an order, the capture agent, or a human). Payload: deal_id (required), title, amount, currency, scope.

crm.deal.lost

Fired when a deal is moved to a Lost stage (closed-lost). Payload: deal_id (required), stage, amount.

crm.deal.stage_changed

Fired when a deal moves to a different pipeline stage. Payload: deal_id (required), stage, amount.

crm.deal.won

Fired when a deal is moved to a Won stage (closed-won). Payload: deal_id (required), stage, amount.

crm.task.created

Fired when a CRM task is created (incl. AI-suggested next-step / renewal tasks). Payload: task_id (required), title.

电子邮件 (2)

email.bounced

Fired by OpsIQ.

email.replied

Fired by OpsIQ.

feedback (13)

feedback.analysis.completed

Fired when a Voice-of-Customer analysis run completes. Payload: analysis_run_id (required), workspace_key, sample_count, model_version.

feedback.detractor.detected

Fired when a newly indexed response meets its metric-specific detractor rule. Payload: feedback_item_id (required), workspace_key, source_kind, metric_kind, classification.

feedback.follow_up.completed

Fired when a Feedback follow-up is completed. Payload: feedback_item_id (required), workspace_key, actor_admin_id, outcome_code.

feedback.item.assigned

Fired when Feedback ownership changes. Payload: feedback_item_id (required), workspace_key, assignee_admin_id, team_id, actor_admin_id.

feedback.item.indexed

Fired when a source record is added to or refreshed in the canonical Feedback index. Payload: feedback_item_id (required), source_kind, source_id, workspace_key, metric_kind, classification.

feedback.item.redacted

Fired when source deletion or redaction removes Feedback content from the index. Payload: feedback_item_id (required), workspace_key, source_kind.

feedback.item.status_changed

Fired when the Feedback workflow state changes. Payload: feedback_item_id (required), workspace_key, state, actor_admin_id.

feedback.item.tagged

Fired when a tag is added to or removed from Feedback. Payload: feedback_item_id (required), workspace_key, tag, operation.

feedback.item.updated

Fired when a canonical Feedback item changes. Payload: feedback_item_id (required), workspace_key, change.

feedback.source.failed

Fired when a Feedback source replay or incremental index operation fails. Payload: workspace_key, source_kind (required), error_code, checkpoint.

feedback.source.lagging

Fired when a Feedback source checkpoint is behind its expected freshness window. Payload: workspace_key, source_kind (required), lag_seconds, last_success_at.

feedback.theme.detected

Fired when a canonical topic or theme signal is attached to Feedback. Payload: feedback_item_id (required), workspace_key, theme_key, confidence.

feedback.urgent.detected

Fired when an urgent Feedback signal is detected. Payload: feedback_item_id (required), workspace_key, source_kind, signal_key.

invoice (3)

invoice.created

Fired when an invoice is generated. Payload: invoice_id (required), customer_id, customer_email, amount, currency, due_date, items.

invoice.overdue

Fired when an invoice passes its due date unpaid. Payload: invoice_id (required), customer_id, customer_email, amount, currency, days_overdue.

invoice.paid

Fired when an invoice is paid in full. Payload: invoice_id (required), customer_id, customer_email, amount, currency, paid_at.

order (1)

order.created

Fired when a new order is placed. Payload: order_id (required), customer_id, customer_email, amount, currency, items, status, source.

支付 (3)

payment.completed

Fired when a payment succeeds. Payload: order_id (required), payment_id, provider_ref, customer_id, customer_email, amount, amount_minor, currency, gateway, invoice_id, items, paid_at.

payment.failed

Fired when a payment attempt fails. Payload: order_id, customer_id, customer_email, amount, currency, gateway, reason.

payment.refunded

Fired when a refund is issued. Payload: order_id, refund_id, customer_id, customer_email, amount, currency, reason.

安保服务 (1)

security.alert

Fired by PHASE_SECURITY_ALERTS when a security rule trips: failed-login wave, new automatic IP blocks, or a tamper-evidence (audit/consent hash chain) verification failure. Payload: rule (required), title, site_key, count, blocks, errors.

subscription (3)

subscription.cancelled

Fired when a subscription is cancelled. Payload: subscription_id (required), plan_name, customer_id, customer_email, cancel_reason, cancelled_at, ends_at.

subscription.created

Fired when a subscription is started. Payload: subscription_id (required), plan_id, plan_name, customer_id, customer_email, amount, currency, interval, trial_ends_at, next_billing_at.

subscription.renewed

Fired when a subscription renews successfully. Payload: subscription_id (required), plan_name, customer_id, customer_email, amount, currency, next_billing_at.

票价 (5)

ticket.closed

Fired when a ticket is closed or resolved. Payload: ticket_id (required), resolution, closed_by_type, closed_by_id.

ticket.created

Fired when a new support ticket is opened. Payload: ticket_id (required), ticket_number, subject, department_id, department_name, customer_id, customer_email, priority, message, author_type, author_id, author_name.

ticket.merged

Fired when one or more tickets are merged into another ticket. Payload: ticket_id (required), ticket_number, subject, external_ref, native_table, site_key, sources, merged_by, merged_at.

ticket.renumbered

Fired when a connector mirror adopts the remote platform's ticket number for an OpsIQ ticket. Payload: ticket_id (required), old_number (required), ticket_number (required), connector, external_ref.

ticket.replied

Fired when a reply is posted to a ticket. Payload: ticket_id (required), reply_id, author_type, author_id, author_name, message.

user (1)

user.registered

Fired when a new user/customer account is created. Payload: user_id (required), email, firstname, lastname, company, country, source.

我怎么测试本地的网路攻击?+

使用 ngrok 来曝光您的本地服务器。 设置您的 ngrok 的 webhook 端点 URL.

如果我的终点暂时下线呢?+

OpsIQ 以指数回转重试。 如果您的端点在重试窗口中恢复, 则不会丢失事件 。

开发者

API 密钥

API 密钥认证请求到 OpsIQ 净 值 API。每个密钥都有范围权限。

API 密钥
API 密钥密码 API 密钥屏幕:一个带有访问级别和范围芯片的出问题面板,旁边是带有撤销按钮的现有被遮盖的密钥列表.API 密钥工作空间发出密钥访问仅读限制范围contacts.readtickets.readevents.write问题密钥钥匙扎皮尔融合opq_••••4f2a撤销移动应用程序opq_••••91c7撤销分析导出opq_••••2db0撤销1SCOPED仅读或限制2PER-ACTION选择精确的瞄准镜3REVOCABLE随时旋转
真实的 API 密钥屏幕:通过选择精确的瞄准镜,发出有范围、只读或受限制的密钥,并随时撤销任何密钥。

创建一个 API 键

1
转到设置 > API 密钥

导航到 API 关键管理。

2
单击创建密钥

给它一个描述性的名字。

3
选择范围

仅提供它需要的钥匙。 范围会在每个区域中读写对, 因此可以给出一个报告集成, 而不是其他内容 。

可用范围

选最窄的一套来做这个工作 admin 满足下面的每一个范围, 所以只有在你真正需要广泛访问时才使用它。

读取/ 写出

联系人、公司、交易、活动、分部、外联、转换、生命周期和CRM网友们。

票. 读取/出票. write

列出并读取出票及其信件;回复,更新,打开并运行批量队列操作.

对话. read/ conversation. write 中

读取活话对话与消息历史;发送消息,指定并更改状态.

kb. read / kb: write (中文(简体) ).

知识基础条目.

聊天. read/ change. write 中 了 :

已保存的回复模板 。

connectors.read

看看安装了哪些连接器,它们能做什么,测试它们的资质.

automations.read

看看你的行动,触发器和他们的运行历史。

departments.read

各部门可办理线路.

notifications.read

通知一个指定的操作员。

analytics.read

报告各节, CSV 出口和计划报告定义。

site_intelligence.read

监测地点及其SEO报告。

files.read

已签名的附件下载链接 。

status.write

状态页组件和事件。

写作

AI作词助推:草稿,总结,翻译,重写,作曲,分析.

管理员

包括少数因任何狭义范围而故意无法达到的敏感动作:去除接触,改变隐私设置,并读取访问日志.

💡
使用您的密钥调用元. 动作以查看它可以在您的安装上运行的动作。 这总是比从列表中工作更可靠 。

访问级别

全部( A)

键可以调用它的范围允许的任何东西。

仅读

无论范围如何,每张字都被拒绝。报告、仪表板和任何不该改变数据的东西最安全的选择。

限制

您列出密钥可能要使用的确切动作。 其它任何动作都会被拒绝, 即使在允许的范围内 。

4
复制密钥

显示一次,开始是“ opq_” , 安全存储 。

🚫
永远不分享 API 公共代码中的密钥, 客户端 JavaScript,或版本控制。使用环境变量。
开发者

连接您的网站

密码 OpsIQ 部件是 JavaScript 片段您会添加到您的网站中,用于跟踪,AI聊天,票款创建,以及客户身份识别.

如何运作
连接您的网站左侧的一行脚本标签,右侧的网页有: OpsIQ 在角落里出现聊天泡沫。<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
连接您的网站

基本安装

基本部件片断
<script src="https://your-opsiq-domain.com/widget.php"
  data-site-key="site_abc123"
  async></script>

Paste before the closing </body> tag. The script loads asynchronously and does not block page rendering.

配置属性

data-site-key

需要。 您的站点密钥来自连接站点 。

data-mode

可选的,“聊天”(默认),“tickets”,或“兼有”

data-position

选取"从下到右"(默认)或"从后到左".

data-color

可选的,主色六分法

data-greeting

随你便,初问候信

data-language

可选的UI语言:"en","es", "fr", “de",“pt",相接"ar"等.

data-identity-token

可选 服务器生成的签名身份符

SPA 支持

手动 SPA 路径跟踪
// Manually notify OpsIQ of a route change (for custom routers)
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["pageview", {
  url: window.location.href,
  title: document.title,
}]);

社区支助规则

部件的 CSP 规则
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
部件会拖累我的网站吗?+

号为下 15 KB gziped, 页面内容后加载自动加载 。

我能定制一下外表吗?+

主色调使用数据颜色。 联系人支持 CSS 覆盖选项 。

开发者

部件安装食谱

平台专用安装指南.

如何运作
部件安装食谱平台安装卡片 WordPress, Shopify 财务报告和已审计财务报表 Google Tag Manager,每个都说在哪里添加部件。WP 计划WordPress安装插件, 输入保存您的网站密钥。商店Shopify粘贴片段到主题。/body.GTM 游戏机标签管理器自定义 HTML 标记,所有页面。
安装食谱

WordPress

假设情况:
添加到 a 所有页面 WordPress 网站。
怎么办:

Option 1: Edit theme footer.php, paste snippet before </body>. Option 2: Use "Insert Headers and Footers" plugin > Scripts in Footer. Option 3: Use a child theme footer.php to survive theme updates.

Shopify

假设情况:
添加到您的文件夹中 Shopify 存储。
怎么办:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

反应 / Next. js

假设情况:
添加到 React 或 Next. js app 中 。
怎么办:

In Next.js, use next/script in app/layout.tsx: import Script from "next/script"; <Script src="https://your-opsiq.com/widget.php" data-site-key="site_abc" strategy="lazyOnload" />

WHMCS

假设情况:
添加到您的文件夹中 WHMCS 客户端区域。
怎么办:

设置 > 一般设置 > 其他 > 全球脚本内容。 粘贴片段。 或者编辑您的模板脚本. tpl 。

Google Tag Manager

假设情况:
通过GTM添加.
怎么办:

创建自定义 HTML 标签,粘贴片段。触发器:所有页面。发布。

开发者

后端的管理员部件( 一个合同, 任意平台)

内嵌OpsIQ管理员助理 — 管理员聊天、 票箱和AI Writing — 在您的 OWN 平台的管理员面板内, 因此您的团队从不离开工具。 如访客身份和门户SSO,这是一个通用合同 执行在~15您平台服务器代码的行—— 相同的模式Zendesk,对接和对话的用途SSO。没有每个平台的插件等待:任何可以计算一个HMAC今天可以做到这一点。

步骤1——嵌入线.

远程站点→您的网站→代码,复制加载器行并添加到您的管理员面板的页面(脚本包括,布局模板,或只包含管理员的自定义-JS框)中:

单行嵌入
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>

步骤2- 告诉OpsIQ被登录者(服务器签名)

只有您的应用程序知道哪个管理员是签名的——这不是一个缺点,而是安全模式。 您的服务器从自己的会话中生成一个短命的签名符, 和访问者身份符号完全一样, 用同一个网站的网络库秘密签名:

PHP —— 签名从您的会话中获取管理员身份
<?php
$secret  = "opsiq_whsec_your_site_secret";   // Remote Sites → Codes
$payload = json_encode([
    "site_key"      => "SITE_KEY",
    "iat"           => time(),
    "exp"           => time() + 6 * 3600,
    "authenticated" => true,          // REQUIRED, top level — see note below
    "platform"      => "your-platform",
    "admin"    => [
        "id"            => (string)$admin->id,      // from YOUR session
        "name"          => $admin->name,
        "username"      => $admin->username,
        "email"         => $admin->email,
        "role"          => $admin->role,
        "authenticated" => true,
    ],
]);
$payload64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
$identityToken = $payload64 . "." . hash_hmac("sha256", $payload64, $secret);
// Put $identityToken into the embed line (identity_token=…), or expose it as
// window.OpsIQAdminIdentityToken before the loader script.
自动获得每个管理员的接入

每个登入您的平台的管理员都会被逐个匹配:OpsIQ'每个管理员的访问闸门解决了符号的用户名+电子邮件对一个OpsIQ代理(Team page;当平台电子邮件不同时使用代理的"匹配邮件"列表)并应用该代理的工作空间,部门和收件箱权限. 新工作人员 = 添加代理在OpsIQ;没有嵌入式更改。

角色随身而去

平台发送的任意角色串都会显示在OpsIQ归属的一方;授权总是来自OpsIQ代理记录,从不 从声称的角色。

为什么不读我们的登录饼干?

浏览器从不将您的管理员饼干发送到另一个来源 —— 没有供应商能够“ 仅检测” 您的登录跨域。 每个严肃的产品都会用同样的方式解决: 您的服务器担保, 签名。 这是整个合同 。

自己网站没有共享模式

关闭 OpsIQ 主机没有未签名或共享的登录模式: 装入器在签名的管理员令牌到达之前会一直隐藏。 代码加载器中的值=... 值是一个部件密钥, 它只能识别站点; 它永远不能在其中签名 。

电话 authenticated 旗帜——放在TOP一级

这面旗帜是您服务器的断言 一个人类真的登录,和OpsIQ没有它,就拒绝任何纪念物。 "authenticated" => true beside site_key/iat/exp,不仅在内部 admin 对象。当前OpsIQ接受其中任一位置, 但旧版本只读取顶级 —— 而失败是欺骗: 对话列表、历史和未读 都认证精细, 而每次聊天都转接答案 "需要登录admin" (需要登录),它看起来像会话错误,而不是。如果看到分出部分,请先检查这面旗帜。

脚踏实地卫生

只在服务器上签名, 绝不在浏览器中签名JavaScript缩短时间(分钟至小时);OpsIQ拒绝已过期和未来日期的代号,签名将代号绑定在您的站点密钥上 。

参考执行情况

密码WHMCS模块自动从WHMCSadmin会话; Botble Hotel 连接器的桥接文件是用 Laravel 会话( op=admin_ identity) 来完成的。 这两个会话都只是他们的站台方言中的这个契约 — 复制到最接近您堆栈的读取 。

0页接线(连接器- 声明探测器)

当你的OpsIQ连接器将您的身份端点存储于其中 admin_identity_probe_url 设置, PLAIN 加载器行是您需要的所有管理页面:部件从连接器中发现探测器,用您的站点密钥+部件令牌调用它,并自动认证每个管理者。该页面仍可用一个 data-identity-endpoint 属性或 window.OpsIQAdminIdentityEndpoint.

💡
签名的秘密已经为你填了 在远程站点中, 您的站点、 代码、 选项 3,在工作人员中签名,每个示例都已经包含着这个网站自己的秘密,所以代码是粘贴的:没有什么可以复制或配置的。本页面上的例子显示 opsiq_whsec_YOUR_SITE_SECRET 每一个例子都寻找 OPSIQ_SITE_SECRET 服务器上首先使用(或您框架的自身设置, 在其注释中命名) , 并使用设定时的设置, 这样您可以随时将密钥移出文件, 例如在不编辑代码的情况下旋转它。 无论是哪种方式, 文件只在您的服务器上运行: 从不粘贴到网页或浏览器中 。 JavaScript,并且从不把它 在一个公共存储器, 因为任何人持有这个秘密 可以签进 作为任何你的客户或工作人员。 WHMCS 财务报告和已审计财务报表 Botble 不需要这些: WHMCS 钩子来了 隐藏的秘密,和 Botble 连接器面板将它填入桥中.

完整代码, 平台按平台

每个示例只打印一名签约工作人员的行政聊天标签,并添加签名的代号,并回答部件的刷新(?opsiq_identity_refresh=1&role=admin{"success":true,"identity_token":"…"} 或 为 401。远程站点、您的站点,代码、选项 3,在你的员工中签名 打印同样的代码 与您的网站密钥 和填写的秘密。

⚠️
管理符是两部分的形式: base64url(活口),一个点,然后是十六进制 HMAC-SHA256,该基数64url文本。它不是一个JWT, JWT 被拒绝。管理对象需要 ID 和电子邮件,并且解密必须在其中。 24 小时。

WHMCS

Nothing to add: the WHMCS hook in Option 1 already signs your logged-in staff into Admin Chat and refreshes the token. Do not paste the Option 3 loader as well.
1

Install the Option 1 hook as includes/hooks/opsiq_tracker.php.

2

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

includes/hooks/opsiq_tracker.php
/* WHMCS: no extra code. Option 1 (the All-in-One WHMCS Hook) signs the logged-in
 * admin into Admin Chat on every admin page and answers ?opsiq_identity_refresh=1&role=admin. */

Botble (connector bridge)

Nothing to add: the Botble bridge signs your logged-in admins. Copy the bridge from the Botble connector panel (it arrives with OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET filled in), then put its one admin_embed line in Botble's admin Custom JS.
1

In Botble admin → Custom JS, add: <script async src="https://YOUR-BOTBLE-SITE/opsiq-botble-bridge.php?op=admin_embed"></script>

2

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

public/opsiq-botble-bridge.php
<!-- Botble admin → Custom JS. The bridge signs the logged-in admin; nothing secret is in the page. -->
<script async src="https://YOUR-BOTBLE-SITE/opsiq-botble-bridge.php?op=admin_embed"></script>

PHP (no dependencies)

1

Save as opsiq-admin-chat.php. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

At the very top of every ADMIN page, before any output: require 'opsiq-admin-chat.php'; opsiq_admin_chat_refresh(); and before </body>: <?= opsiq_admin_chat_tag() ?> (it replaces the Option 3 loader).

3

Replace opsiq_admin_chat_user() with your signed-in staff member. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq-admin-chat.php
<?php
/* opsiq-admin-chat.php — sign your logged-in staff into OpsIQ Admin Chat. */

// WHO IS SIGNED IN AS STAFF — replace the body. Return null for anyone who is not staff.
function opsiq_admin_chat_user(): ?array
{
    $u = $_SESSION['admin'] ?? null;    // e.g. ['id' => 3, 'email' => '…', 'username' => '…', 'name' => '…', 'role' => 'Owner']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
}

// The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT.
function opsiq_admin_chat_token(array $u): string
{
    $secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
    if ($secret === '') return '';                           // fail closed: no Admin Chat
    $now = time();
    $payload = rtrim(strtr(base64_encode(json_encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,                      // at most 24 hours
        'authenticated' => true,
        'platform'      => 'php',
        'admin'         => [
            'id'       => (string) $u['id'],                 // REQUIRED
            'email'    => (string) $u['email'],              // REQUIRED
            'username' => (string) ($u['username'] ?? ''),
            'name'     => (string) ($u['name'] ?? ''),
            'role'     => (string) ($u['role'] ?? ''),
        ],
    ], JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
    return $payload . '.' . hash_hmac('sha256', $payload, $secret);
}

// Call at the top of every admin page, before any output.
function opsiq_admin_chat_refresh(): void
{
    if (empty($_GET['opsiq_identity_refresh'])) return;
    header('Content-Type: application/json; charset=utf-8');
    header('Cache-Control: no-store');
    $u = opsiq_admin_chat_user();
    $t = $u ? opsiq_admin_chat_token($u) : '';
    if ($t === '') { http_response_code(401); echo json_encode(['success' => false, 'login_required' => true]); exit; }
    echo json_encode(['success' => true, 'role' => 'admin', 'identity_token' => $t]);
    exit;
}

// Print before </body> on admin pages. Prints nothing for anyone who is not staff.
function opsiq_admin_chat_tag(): string
{
    $u = opsiq_admin_chat_user();
    $t = $u ? opsiq_admin_chat_token($u) : '';
    if ($t === '') return '';
    $src = 'https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t);
    return '<script async src="' . htmlspecialchars($src, ENT_QUOTES) . '" data-opsiq-widget="admin-chat"></script>';
}

Laravel

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Save the class as app/Support/OpsiqAdminChat.php; adjust isStaff() to your admin guard or role. Add the refresh middleware from the bottom of the code to your admin routes.

3

In your admin Blade layout before </body>: {!! \App\Support\OpsiqAdminChat::tag() !!}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

app/Support/OpsiqAdminChat.php
<?php
// app/Support/OpsiqAdminChat.php — no packages needed.
namespace App\Support;

final class OpsiqAdminChat
{
    /** WHO IS STAFF — adjust to your admin guard, role or gate. */
    private static function staff()
    {
        $user = auth('web')->user();                    // or auth('admin')->user()
        return ($user && $user->can('access-admin')) ? $user : null;
    }

    /** The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT. */
    public static function token(): string
    {
        $user = self::staff();
        $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
        if (!$user || $secret === '') return '';
        $now = time();
        $payload = rtrim(strtr(base64_encode(json_encode([
            'site_key'      => 'YOUR_SITE_KEY',
            'iat'           => $now,
            'exp'           => $now + 3600,
            'authenticated' => true,
            'platform'      => 'laravel',
            'admin'         => [
                'id'       => (string) $user->id,           // REQUIRED
                'email'    => (string) $user->email,        // REQUIRED
                'username' => (string) ($user->username ?? $user->email),
                'name'     => (string) $user->name,
                'role'     => 'Admin',
            ],
        ], JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
        return $payload . '.' . hash_hmac('sha256', $payload, $secret);
    }

    /** For the admin Blade layout, before </body>. Prints nothing for non-staff. */
    public static function tag(): string
    {
        $t = self::token();
        if ($t === '') return '';
        return '<script async src="' . e('https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t)) . '" data-opsiq-widget="admin-chat"></script>';
    }
}

/* Refresh — Admin Chat asks ?opsiq_identity_refresh=1&role=admin on the admin page it is on.
 * app/Http/Middleware/OpsiqAdminChatRefresh.php, added to your admin route group:
 *
 *   public function handle($request, \Closure $next) {
 *       if (!$request->query('opsiq_identity_refresh')) return $next($request);
 *       $t = \App\Support\OpsiqAdminChat::token();
 *       return $t === ''
 *           ? response()->json(['success' => false, 'login_required' => true], 401)->header('Cache-Control', 'no-store')
 *           : response()->json(['success' => true, 'role' => 'admin', 'identity_token' => $t])->header('Cache-Control', 'no-store');
 *   }
 */

WordPress / WooCommerce

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste into your theme's functions.php or a small plugin. It shows Admin Chat inside wp-admin to users who can manage_options; change the capability to suit your team.

3

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

functions.php
/* functions.php or a small plugin — OpsIQ Admin Chat inside wp-admin. */

if (!defined('OPSIQ_SITE_SECRET')) define('OPSIQ_SITE_SECRET', 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; wp-config.php wins when set

function opsiq_admin_chat_token(): string {
    if (!is_user_logged_in() || !current_user_can('manage_options')) return '';     // who counts as staff
    if (!defined('OPSIQ_SITE_SECRET') || OPSIQ_SITE_SECRET === '') return '';
    $u   = wp_get_current_user();
    $now = time();
    // The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT.
    $payload = rtrim(strtr(base64_encode(wp_json_encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,
        'authenticated' => true,
        'platform'      => 'wordpress',
        'admin'         => [
            'id'       => (string) $u->ID,                   // REQUIRED
            'email'    => (string) $u->user_email,           // REQUIRED
            'username' => (string) $u->user_login,
            'name'     => (string) $u->display_name,
            'role'     => (string) (reset($u->roles) ?: 'administrator'),
        ],
    ])), '+/', '-_'), '=');
    return $payload . '.' . hash_hmac('sha256', $payload, OPSIQ_SITE_SECRET);
}

// Refresh: Admin Chat asks ?opsiq_identity_refresh=1&role=admin on the admin page it is on.
add_action('admin_init', function () {
    if (empty($_GET['opsiq_identity_refresh'])) return;
    nocache_headers();
    $t = opsiq_admin_chat_token();
    if ($t === '') wp_send_json(['success' => false, 'login_required' => true], 401);
    wp_send_json(['success' => true, 'role' => 'admin', 'identity_token' => $t]);
});

// The loader, on every wp-admin page, for staff only.
add_action('admin_footer', function () {
    $t = opsiq_admin_chat_token();
    if ($t === '') return;
    echo '<script async src="' . esc_url('https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t)) . '" data-opsiq-widget="admin-chat"></script>';
});

Node.js / Express

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

adminRouter.use(opsiqAdminChat) on your ADMIN routes, after your session middleware; adjust isStaff(). It answers the refresh and sets res.locals.opsiqAdminChatTag.

3

Print res.locals.opsiqAdminChatTag (unescaped) before </body> in your admin layout. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq-admin-chat.js
// opsiq-admin-chat.js — no packages needed.
const crypto = require("crypto");

const isStaff = (user) => !!(user && user.isAdmin);        // WHO IS STAFF — adjust

// The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
function opsiqAdminChatToken(user) {
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!isStaff(user) || !secret) return "";
  const now = Math.floor(Date.now() / 1000);
  const payload = Buffer.from(JSON.stringify({
    site_key: "YOUR_SITE_KEY",
    iat: now,
    exp: now + 3600,                                        // at most 24 hours
    authenticated: true,
    platform: "node",
    admin: { id: String(user.id), email: user.email, username: user.username || user.email, name: user.name || "", role: user.role || "Admin" },  // id + email REQUIRED
  })).toString("base64url");
  return payload + "." + crypto.createHmac("sha256", secret).update(payload).digest("hex");
}

// adminRouter.use(opsiqAdminChat)
function opsiqAdminChat(req, res, next) {
  const token = opsiqAdminChatToken(req.user);
  if (req.query.opsiq_identity_refresh) {
    res.set("Cache-Control", "no-store");
    return token
      ? res.json({ success: true, role: "admin", identity_token: token })
      : res.status(401).json({ success: false, login_required: true });
  }
  res.locals.opsiqAdminChatTag = token
    ? '<script async src="' + ("https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + encodeURIComponent(token)).replace(/"/g, """) + '" data-opsiq-widget="admin-chat"></script>'
    : "";
  next();
}

module.exports = { opsiqAdminChat };

Python (Flask)

1

No packages beyond Flask and flask-login. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Call init_opsiq_admin_chat(app) where you create the app, and adjust is_staff().

3

In your admin base template before </body>: {{ opsiq_admin_chat_tag }}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.py
# opsiq_admin_chat.py — Flask + flask-login, no other packages.
import base64, hashlib, hmac, json, os, time, urllib.parse
from flask import request, jsonify
from flask_login import current_user
from markupsafe import Markup, escape

def is_staff(user):                                           # WHO IS STAFF — adjust
    return user.is_authenticated and getattr(user, "is_admin", False)

def opsiq_admin_chat_token():
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret or not is_staff(current_user):
        return ""
    now = int(time.time())
    # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    payload = base64.urlsafe_b64encode(json.dumps({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "python",
        "admin": {"id": str(current_user.id), "email": current_user.email,           # REQUIRED
                  "username": getattr(current_user, "username", current_user.email),
                  "name": getattr(current_user, "name", ""), "role": "Admin"},
    }, separators=(",", ":")).encode()).decode().rstrip("=")
    return payload + "." + hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()

def init_opsiq_admin_chat(app):
    @app.before_request
    def _opsiq_admin_refresh():
        if request.args.get("opsiq_identity_refresh"):
            t = opsiq_admin_chat_token()
            if t:
                resp = jsonify({"success": True, "role": "admin", "identity_token": t})
            else:
                resp = jsonify({"success": False, "login_required": True})
                resp.status_code = 401
            resp.headers["Cache-Control"] = "no-store"
            return resp

    @app.context_processor
    def _opsiq_admin_tag():
        t = opsiq_admin_chat_token()
        if not t:
            return {"opsiq_admin_chat_tag": ""}
        src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + urllib.parse.quote(t, safe="")
        return {"opsiq_admin_chat_tag": Markup('<script async src="%s" data-opsiq-widget="admin-chat"></script>' % escape(src))}

Django

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Add "yourapp.opsiq_admin_chat.OpsiqAdminChatMiddleware" to MIDDLEWARE (after AuthenticationMiddleware) and "yourapp.opsiq_admin_chat.opsiq_admin_chat" to TEMPLATES context_processors. Staff = user.is_staff.

3

In your admin base template before </body>: {{ opsiq_admin_chat_tag }}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.py
# yourapp/opsiq_admin_chat.py — no packages needed.
import base64, hashlib, hmac, json, time, urllib.parse
from django.conf import settings
from django.http import JsonResponse
from django.utils.html import format_html

def opsiq_admin_chat_token(user):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret or not user.is_authenticated or not user.is_staff:
        return ""
    now = int(time.time())
    # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    payload = base64.urlsafe_b64encode(json.dumps({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "django",
        "admin": {"id": str(user.pk), "email": user.email, "username": user.get_username(),   # id + email REQUIRED
                  "name": user.get_full_name(), "role": "Superuser" if user.is_superuser else "Staff"},
    }, separators=(",", ":")).encode()).decode().rstrip("=")
    return payload + "." + hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()

class OpsiqAdminChatMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        if request.GET.get("opsiq_identity_refresh"):
            t = opsiq_admin_chat_token(request.user)
            resp = (JsonResponse({"success": True, "role": "admin", "identity_token": t}) if t
                    else JsonResponse({"success": False, "login_required": True}, status=401))
            resp["Cache-Control"] = "no-store"
            return resp
        return self.get_response(request)

def opsiq_admin_chat(request):
    t = opsiq_admin_chat_token(request.user)
    if not t:
        return {"opsiq_admin_chat_tag": ""}
    src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + urllib.parse.quote(t, safe="")
    return {"opsiq_admin_chat_tag": format_html('<script async src="{}" data-opsiq-widget="admin-chat"></script>', src)}

.NET / C#

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

In Program.cs after app.UseAuthentication(): app.Use(OpsiqAdminChat.Refresh); staff = users in the "Admin" role (adjust).

3

In your admin layout before </body>: @Html.Raw(OpsiqAdminChat.Tag(Context)). Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

OpsiqAdminChat.cs
// OpsiqAdminChat.cs — no packages needed.
using System.Net;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

public static class OpsiqAdminChat
{
    // The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    public static string Token(HttpContext ctx)
    {
        var secret = ctx.RequestServices.GetRequiredService<IConfiguration>()["OpsIQ:SiteSecret"];
        if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
        if (string.IsNullOrEmpty(secret) || !ctx.User.IsInRole("Admin")) return "";      // WHO IS STAFF — adjust
        var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        var json = JsonSerializer.Serialize(new Dictionary<string, object> {
            ["site_key"] = "YOUR_SITE_KEY", ["iat"] = now, ["exp"] = now + 3600,
            ["authenticated"] = true, ["platform"] = "dotnet",
            ["admin"] = new Dictionary<string, string> {
                ["id"] = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "",      // REQUIRED
                ["email"] = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "",            // REQUIRED
                ["username"] = ctx.User.Identity?.Name ?? "", ["name"] = ctx.User.Identity?.Name ?? "", ["role"] = "Admin" },
        });
        var payload = Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+', '-').Replace('/', '_');
        using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
        return payload + "." + Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(payload))).ToLowerInvariant();
    }

    // app.Use(OpsiqAdminChat.Refresh)
    public static async Task Refresh(HttpContext ctx, Func<Task> next)
    {
        if (string.IsNullOrEmpty(ctx.Request.Query["opsiq_identity_refresh"])) { await next(); return; }
        ctx.Response.Headers["Cache-Control"] = "no-store";
        var t = Token(ctx);
        if (t == "") { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsJsonAsync(new { success = false, login_required = true }); return; }
        await ctx.Response.WriteAsJsonAsync(new { success = true, role = "admin", identity_token = t });
    }

    public static string Tag(HttpContext ctx)
    {
        var t = Token(ctx);
        if (t == "") return "";
        return "<script async src=\"" + WebUtility.HtmlEncode("https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + Uri.EscapeDataString(t)) + "\" data-opsiq-widget=\"admin-chat\"></script>";
    }
}

Ruby on Rails

1

No gems needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

include OpsiqAdminChat in your admin base controller; adjust opsiq_staff.

3

In your admin layout before </body>: <%= opsiq_admin_chat_tag %>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

app/controllers/concerns/opsiq_admin_chat.rb
# app/controllers/concerns/opsiq_admin_chat.rb — no gems needed.
require "base64"
require "cgi"
require "json"
require "openssl"

module OpsiqAdminChat
  extend ActiveSupport::Concern

  included do
    before_action :opsiq_admin_identity_refresh
    helper_method :opsiq_admin_chat_tag
  end

  private

  def opsiq_staff                                        # WHO IS STAFF — adjust
    current_user if respond_to?(:current_user, true) && current_user&.try(:admin?)
  end

  # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
  def opsiq_admin_chat_token
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    staff = opsiq_staff
    return "" if secret.blank? || staff.nil?
    now = Time.now.to_i
    payload = Base64.urlsafe_encode64({
      site_key: "YOUR_SITE_KEY", iat: now, exp: now + 3600,
      authenticated: true, platform: "rails",
      admin: { id: staff.id.to_s, email: staff.email,              # REQUIRED
               username: staff.try(:username).to_s, name: staff.try(:name).to_s, role: "Admin" }
    }.to_json, padding: false)
    payload + "." + OpenSSL::HMAC.hexdigest("SHA256", secret, payload)
  end

  def opsiq_admin_identity_refresh
    return unless params[:opsiq_identity_refresh].present?
    response.headers["Cache-Control"] = "no-store"
    t = opsiq_admin_chat_token
    return render(json: { success: false, login_required: true }, status: :unauthorized) if t.blank?
    render json: { success: true, role: "admin", identity_token: t }
  end

  def opsiq_admin_chat_tag
    t = opsiq_admin_chat_token
    return "" if t.blank?
    helpers.tag.script(nil, async: true, src: "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=#{CGI.escape(t)}", data: { opsiq_widget: "admin-chat" })
  end
end

Java (Spring Boot)

1

No libraries needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace staff() with your admin lookup. The filter answers the refresh; @ControllerAdvice exposes opsiqAdminChatTag to views.

3

Admin Thymeleaf layout before </body>: <th:block th:utext="${opsiqAdminChatTag}"/>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

OpsiqAdminChat.java
// OpsiqAdminChat.java — no libraries needed.
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.util.HtmlUtils;

@Component
@ControllerAdvice
public class OpsiqAdminChat implements Filter {
    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS STAFF — replace: id, email, username, name, role. Null for anyone else. */
    private Map<String, String> staff(HttpServletRequest req) {
        if (req.getUserPrincipal() == null || !req.isUserInRole("ADMIN")) return null;
        String n = req.getUserPrincipal().getName();
        return Map.of("id", n, "email", n, "username", n, "name", n, "role", "Admin");
    }

    // The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    String token(HttpServletRequest req) {
        Map<String, String> u = staff(req);
        if (u == null || secret.isEmpty()) return "";
        try {
            long now = System.currentTimeMillis() / 1000;
            Map<String, Object> claims = new LinkedHashMap<>();
            claims.put("site_key", "YOUR_SITE_KEY"); claims.put("iat", now); claims.put("exp", now + 3600);
            claims.put("authenticated", true); claims.put("platform", "java"); claims.put("admin", u);   // id + email REQUIRED
            String payload = Base64.getUrlEncoder().withoutPadding().encodeToString(new ObjectMapper().writeValueAsBytes(claims));
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            return payload + "." + HexFormat.of().formatHex(mac.doFinal(payload.getBytes(StandardCharsets.UTF_8)));
        } catch (Exception e) { return ""; }
    }

    @Override // Admin Chat refreshing on the admin page it is on
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getParameter("opsiq_identity_refresh") == null) { chain.doFilter(request, response); return; }
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Cache-Control", "no-store");
        res.setContentType("application/json");
        String t = token(req);
        if (t.isEmpty()) { res.setStatus(401); res.getWriter().write("{\"success\":false,\"login_required\":true}"); return; }
        res.getWriter().write("{\"success\":true,\"role\":\"admin\",\"identity_token\":\"" + t + "\"}");
    }

    @ModelAttribute("opsiqAdminChatTag")
    public String tag(HttpServletRequest req) {
        String t = token(req);
        if (t.isEmpty()) return "";
        String src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + URLEncoder.encode(t, StandardCharsets.UTF_8);
        return "<script async src=\"" + HtmlUtils.htmlEscape(src) + "\" data-opsiq-widget=\"admin-chat\"></script>";
    }
}

Go

1

No modules needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace staff() with your session lookup and wrap your admin router: OpsiqAdminChatRefresh(adminMux).

3

Pass OpsiqAdminChatTag(r) to your admin layout and print it before </body>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.go
// opsiq_admin_chat.go — standard library only.
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
    "encoding/hex"
    "encoding/json"
    "html"
    "html/template"
    "net/http"
    "net/url"
    "os"
    "time"
)

type OpsiqStaff struct{ ID, Email, Username, Name, Role string }

// WHO IS STAFF — replace with your session lookup. Return nil for anyone who is not staff.
func staff(r *http.Request) *OpsiqStaff { return nil }

// The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
func opsiqAdminChatToken(r *http.Request) string {
    u, secret := staff(r), os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if u == nil || secret == "" {
        return ""
    }
    now := time.Now().Unix()
    body, _ := json.Marshal(map[string]any{
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": true, "platform": "go",
        "admin": map[string]string{"id": u.ID, "email": u.Email, "username": u.Username, "name": u.Name, "role": u.Role}, // id + email REQUIRED
    })
    payload := base64.RawURLEncoding.EncodeToString(body)
    mac := hmac.New(sha256.New, []byte(secret))
    mac.Write([]byte(payload))
    return payload + "." + hex.EncodeToString(mac.Sum(nil))
}

// OpsiqAdminChatRefresh answers Admin Chat's ?opsiq_identity_refresh=1&role=admin.
func OpsiqAdminChatRefresh(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Query().Get("opsiq_identity_refresh") == "" {
            next.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Cache-Control", "no-store")
        w.Header().Set("Content-Type", "application/json")
        if t := opsiqAdminChatToken(r); t != "" {
            json.NewEncoder(w).Encode(map[string]any{"success": true, "role": "admin", "identity_token": t})
            return
        }
        w.WriteHeader(http.StatusUnauthorized)
        json.NewEncoder(w).Encode(map[string]any{"success": false, "login_required": true})
    })
}

// OpsiqAdminChatTag prints the loader for staff only.
func OpsiqAdminChatTag(r *http.Request) template.HTML {
    t := opsiqAdminChatToken(r)
    if t == "" {
        return ""
    }
    src := "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + url.QueryEscape(t)
    return template.HTML(`<script async src="` + html.EscapeString(src) + `" data-opsiq-widget="admin-chat"></script>`)
}

执行Laravel上的身份终点(硬本笔记)

如果你的平台是Laravel(Botble,Bagisto,自定义应用程序),而你的端点是一个独立的文件,它将脚踏出框架来读取已登录的管理员,那么三个细节会节省你的时间——每个都在其学习前产生了真正的生产失败:

在拖带前绑住请求

您的服务提供商可能会解决 request 装入容器时,Laravel的生命周期将捕获的请求绑在内部 Kernel::handle() ——照亮该顺序: $app->instance('request', Request::capture()) 之前,我们 $kernel->bootstrap(),或者你得到的,我给你 "目标类[请求]不存在".

会话- cookie 前缀是HMAC- 键入

现代 Laravel 前缀 cookie 值,带有HMAC与应用程序关键部分一起计算CookieValuePrefix)——平地. sha1(name."v2") 永远无法匹配。 CookieValuePrefix::validate($name, $decrypted, $keys),具有结构倒置(40十六进制字符+ | 现职40。告诉:一个会话比40字符( R)81= 前缀仍然附着)和一个只装入的会话 _token 里面有,我写了

登录地址

认证章是 login_<guard>_<sha1(guard class)> 默认的网络守护: 'login_web_' . sha1(Illuminate\Auth\SessionGuard::class)扫描任意 login_* 数字键作为自定义后卫的倒数.

调试像桥一样

船舶 a debug=1 模式中命名失败的 STEP 和例外——一个盲目的全集使现场部署无法诊断。Botble桥(来自 v1)0.7)是参考: 内核/宾德/bootstrap/decrypt/session/auth/db的步标.

Laravel · complete identity endpoint (copy, set the two constants, done)
<?php
/* identity endpoint · LARAVEL (Botble, Bagisto, any Laravel admin)
 * Drop this in your PUBLIC web root, e.g. /opsiq-identity.php
 * Answers: {"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} */
define("OPSIQ_SITE_KEY", "SITE_KEY");
define("OPSIQ_SITE_SECRET", "opsiq_whsec_your_site_secret");   // Remote Sites → Codes

header("Content-Type: application/json");
$step = "boot";
try {
    require __DIR__ . "/../vendor/autoload.php";
    $app = require_once __DIR__ . "/../bootstrap/app.php";

    $step = "bind";
    // ORDER MATTERS: bind the request BEFORE bootstrapping, or providers that
    // resolve "request" during boot throw "Target class [request] does not exist".
    $request = Illuminate\Http\Request::capture();
    $app->instance("request", $request);

    $step = "bootstrap";
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    $kernel->bootstrap();

    $step = "session";
    $app["session"]->driver()->setId($request->cookie(config("session.cookie")));
    $app["session"]->driver()->start();

    $step = "auth";
    $user = auth()->guard("web")->user();   // use YOUR admin guard name
    if (!$user) {
        echo json_encode(["success" => false, "authenticated" => false, "error" => "no admin session"]);
        exit;
    }

    $step = "sign";
    $admin = [
        "id"            => (string)$user->id,
        "name"          => (string)($user->name ?? $user->username),
        "username"      => (string)($user->username ?? $user->email),
        "email"         => (string)$user->email,
        "role"          => (string)optional($user->roles->first())->name,
        "authenticated" => true,
    ];
    $payload = json_encode([
        "site_key"      => OPSIQ_SITE_KEY,
        "iat"           => time(),
        "exp"           => time() + 6 * 3600,
        "authenticated" => true,          // TOP LEVEL — required
        "platform"      => "laravel",
        "admin"         => $admin,
    ], JSON_UNESCAPED_SLASHES);
    $p64   = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
    $token = $p64 . "." . hash_hmac("sha256", $p64, OPSIQ_SITE_SECRET);

    echo json_encode(["success" => true, "authenticated" => true,
                      "admin" => $admin, "identity_token" => $token]);
} catch (\Throwable $e) {
    // debug=1 names the failing STEP — never ship a blind catch-all
    $err = ($_GET["debug"] ?? "") === "1"
        ? get_class($e) . " at [" . $step . "]: " . $e->getMessage()
        : "identity unavailable";
    echo json_encode(["success" => false, "authenticated" => false, "error" => $err]);
}

其他堆栈的同一个端点

只有“谁登录?” 的行更改—— 签名块在任何地方都是一样的。 在服务器上签名, 永远不要输入JavaScript.

WordPress · WHMCS · Symfony ^平面 PHP — 互换查询, 保留签名符
<?php
/* The ONE helper every platform shares. Keep it verbatim. */
function opsiq_identity_token(array $admin, string $siteKey, string $secret, string $platform): string {
    $payload = json_encode([
        "site_key"      => $siteKey,
        "iat"           => time(),
        "exp"           => time() + 6 * 3600,
        "authenticated" => true,          // TOP LEVEL — OpsIQ refuses the token without it
        "platform"      => $platform,
        "admin"         => $admin + ["authenticated" => true],
    ], JSON_UNESCAPED_SLASHES);
    $p64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
    return $p64 . "." . hash_hmac("sha256", $p64, $secret);
}

/* ── WORDPRESS ─────────────────────────────────────────────────────────── */
require_once ABSPATH . "wp-load.php";
if (!current_user_can("manage_options")) { /* not an admin → refuse */ }
$u = wp_get_current_user();
$admin = ["id" => (string)$u->ID, "name" => $u->display_name,
          "username" => $u->user_login, "email" => $u->user_email,
          "role" => implode(",", $u->roles)];

/* ── WHMCS (inside an addon/hook, admin area) ──────────────────────────── */
$aid = (int)($_SESSION["adminid"] ?? 0);
if ($aid <= 0) { /* not an admin → refuse */ }
$row = Capsule::table("tbladmins")->where("id", $aid)->first();
$admin = ["id" => (string)$row->id, "name" => trim($row->firstname . " " . $row->lastname),
          "username" => $row->username, "email" => $row->email, "role" => "administrator"];

/* ── SYMFONY ───────────────────────────────────────────────────────────── */
$u = $security->getUser();                    // Symfony\Bundle\SecurityBundle\Security
if (!$u) { /* not an admin → refuse */ }
$admin = ["id" => (string)$u->getId(), "name" => $u->getName(),
          "username" => $u->getUserIdentifier(), "email" => $u->getEmail(),
          "role" => implode(",", $u->getRoles())];

/* ── PLAIN PHP / your own app ──────────────────────────────────────────── */
session_start();
if (empty($_SESSION["admin_id"])) { /* not an admin → refuse */ }
$admin = ["id" => (string)$_SESSION["admin_id"], "name" => $_SESSION["admin_name"] ?? "",
          "username" => $_SESSION["admin_username"] ?? "", "email" => $_SESSION["admin_email"] ?? "",
          "role" => $_SESSION["admin_role"] ?? ""];

/* ── then, on EVERY stack ──────────────────────────────────────────────── */
$token = opsiq_identity_token($admin, "SITE_KEY", "opsiq_whsec_your_site_secret", "wordpress");
echo json_encode(["success" => true, "authenticated" => true,
                  "admin" => $admin, "identity_token" => $token]);

如果它不起作用——按此顺序诊断

部件从不出现,控制台说 "需要签名管理员身份证明"

您的终点返回到没有 identity_token打开终点URL直接在登录的管理员浏览器中使用 &debug=1 ——你会看到失败的一步。在拉拉维尔,这几乎总是上面的要求绑定或饼干前缀的项目。

历史和对话都有效 但每个聊天转弯都说 "需要登录admin" (需要登录)

经典分拆, 您的符号缺少了 TOP - 水平 authenticated 旗帜 —— 部件本身的端点接受符号, 聊天流后面的共享验证符拒绝它。 添加 "authenticated" => true beside exp.

"不提供在OpsIQ" (HTTP语)401)

The token verified, but its username + email match no OpsIQ agent. Add the agent in OpsIQ → Team, or add the platform email to that agent's match-emails list when it differs from their OpsIQ email.

什么都行,你这帮混蛋403s从浏览器中选择, 但工作与卷曲

CORS 预飞正在拒绝您请求的其中一个标题。 您的端点必须回答 。 OPTIONS 并回放请求的来源,或者简单地避免自定义头条——部件只需要饼干.

昨天工作,今天失败了

检查 exp: 指使符按设计是短寿命的。 部件自动重检, 所以通常意味着结束点停止看到会话—— 应用键旋转、 会话驱动器改变或 cookie- domain 改变 。

💡
管理员部件会隐藏到身份解析为止, 每一次聊天/inbox/data呼叫都是针对匹配的服务器端执行OpsIQ代理, 无论页面上声称什么。 符牌解锁了用户界面; 权限总是来自OpsIQ.
开发者

访客身份

身份将匿名访客与已知客户联系起来。OpsIQ 链接浏览历史、聊天和客户简介的门票。

如何运作
访客身份一个流程:用户登录到您的网站,您会签发一个签名的身份代号,以及 OpsIQ 将它们的会话,聊天和门票统一为一个剖面图.用户日志在访问您的网站签名的符号身份(_tken (HMAC)一张简介sessions+ 聊天+ 车票
访客身份

身份分为两个层次,每个层面都足够

职等1- 一个没有签名的提示

你告诉部件 谁是来访者与平地JavaScript对象。它会填充访问者日志上的电子邮件和客户身份标识,所以您的仪表板显示已签名的流量和会话合并。这是一个HINT:任何人都可以在浏览器中编辑它,所以OpsIQ从不发布数据 说明它的强度。

职等2- 签名的身份证

您的服务器用网站隐藏的秘密 签了一个短命的代号。OpsIQ验证签名, 然后只将当事人视为一个被证明的客户。 这是在客户聊天和连接器查询中解锁账户答案的关卡。 用它来做任何陌生人不能看到的东西 。

⚠️
职等1是显示的方便。关卡2认证。如果一个问题只能为真实账户持有人解答,则需要级别2.
💡
您不需要写关卡 2 手动: 远程站点 → 您的网站 → 代码 → C. 签名客户生成签名代码和PHP的刷新处理器, WordPress拉拉维尔, Node.js, Python, Django,.NET, Rails, Java and Go. 互联网档案馆的存檔,存档日期2013-12-21 WHMCS 钩子和 Botble 连接器桥已经签了客户名。 身份显示客户是谁; 他们的订单或订票通过连接器到达聊天( 仅在平台没有时才有桥文件 ) API).

职等1——未签名的提示

在部件脚本之前设定对象, 或者在您的应用程序知道签名人后调用( ) 。 两种表格都读取; 使用与您的页面相匹配的任意名称 。

JavaScript支持的两种表格
<!-- Form A: set the global before the loader -->
<script>
  window.OpsIQClient = {
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  };
</script>
<script async src="https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY"></script>

<!-- Form B: identify later, e.g. after a client-side login -->
<script>
  window.opsiq.identify({
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  });
</script>
⚠️
Only these forms are read: the window.OpsIQClient global, window.opsiqConfig.user, and window.opsiq.identify(). There is no OpsIQ.push(['identify', ...]) queue and no OpsIQClientSignature global — if you find either in an old note, it does nothing.

职等2——服务器签名的身份代号

与管理部件完全相同的合同,有一个 customer 主题而不是一个 admin 一,在服务器上签名,然后传递给部件。有两个细节决定它是否被验证,两者都容易出错:

密码HMAC覆盖 BASE64URL 字符串,而不是JSON

签名 $payload64,没有 $payload。签名原始的 JSON 生成一个看起来正确的符号,每次以签名不匹配的方式被拒绝。

基质64url, 未添加

翻译 +/ 改为 -_ 脱去 = 平地基64在今天幸存下来;基地基 64url是合同,也是每个OpsIQ验证器和参考连接器发出.

认证为 TOP 级别

边上 site_key, iat 财务报告和已审计财务报表 exp你断言一个真正的人类 被登录,和OpsIQ没有它,就拒绝代币。

客户. id是强制的

仅携带电子邮件的符号被验证为签名, 然后默默地丢弃。 总是发送一个 ID 。

保持删除短句

分钟到小时。 符号是会话断言, 不是存储的证书 。

PHP - 签署客户身份标志( 此确切代码验证)
<?php
/* Server-signed customer identity. Runnable as-is: set the two constants. */
$siteKey = "YOUR_SITE_KEY";                        // Remote Sites -> Codes
$secret  = "opsiq_whsec_your_site_secret";         // Remote Sites -> Codes

$payload = json_encode([
    "site_key"      => $siteKey,
    "iat"           => time(),
    "exp"           => time() + 3600,
    "authenticated" => true,                       // TOP LEVEL - required
    "platform"      => "your-platform",
    "customer"      => [
        "id"            => (string)$user->id,      // REQUIRED
        "email"         => (string)$user->email,   // REQUIRED
        "name"          => (string)$user->name,
        "plan"          => (string)($user->plan ?? ""),
        "authenticated" => true,
    ],
], JSON_UNESCAPED_SLASHES);

/* base64url(payload) . "." . hex HMAC-SHA256 OF THAT STRING. */
$payload64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
$token     = $payload64 . "." . hash_hmac("sha256", $payload64, $secret);

/* Hand it to the widget either way: */
printf(
    '<script async src="https://YOUR-OPSIQ/widget.php?site_key=%s&identity_token=%s"></script>',
    rawurlencode($siteKey),
    rawurlencode($token)
);
// or, if the loader is already on the page:
// echo '<script>window.opsiqConfig = window.opsiqConfig || {}; '
//    . 'window.opsiqConfig.identityToken = ' . json_encode($token) . ';</script>';
🚫
只在服务器上签名。 在浏览器中刻出一个符号JavaScript意思是把网站秘密传送给每个访客,他们让任何人有能力冒充任何客户.

同一个合同,三个表面

客户在您的网站上聊天

客户主体,通过为 identity_token 。可选:有片段 A 和连接器的聊天已经验证客户本身(有证据的预订或订购号码,或订单前的电子邮件编码)。远程网站、代码、 C 生成代码,用于自动识别已登录在您网站上的客户。

后端内部的管理员聊天

管理员,转给opsiq/embed/admin_widget.php。 相同的符号, 不同的主题密钥。 请参看“ 后端的 Admin 部件 ” 。

支持门户深层链接

更严格的变式:相同的索赔加上jti和单-使用:ret,以及a120- 第二次生命,因为信使 旅行在一个URL设置、 支持 Portal 有您语言的准备片段, 当您的账户区域运行于此服务器时, 平台会为您薄荷它 。

如果有人来清理饼干呢?+

他们成为匿名 直到他们再次被确认。OpsIQ将新的匿名记录与客户简介链接,当提示或符号到达时。

为什么我的证物要核实访客的日志 而不是账户问题?+

这是等级1/ 职等2拆分。未签名的提示会填入访问者日志,其他则不填入。账户答案需要经过验证的签名。

开发者

门户登录:每个平台的代码

将一个已经签入您的应用程序的客户直接送到您的支持门户, 并签名, 没有第二个密码。 此页面解释交接工作如何进行, 每个平台的每个请求、 设置和完整路径。 设置、 支持门户打印相同的代码, 包含您自己的门户地址和工作空间密钥 。

如何运作

1
客户端点击您的应用程序中的支持

例如,链接点位于您服务器上的一条小路由 /support-portal. 从未在已经包含一个符号的链接中:一个页面中的符号会通过页面来源,浏览器历史和指针头泄露出.

2
路由检查谁签入

其内容是客户自会话。未签名的访客将先发送到您的登录,然后返回路线。

3
路由标志为一次性代号

一个标准的 HS256 JWT 与这个工作空间的签名密钥签约, 只有您的服务器持有该密钥 。 它在之后过期 。 120 秒,并可以使用一次。

4
路线重定向到门户

在门户网页上,当门户要求一个时,客户就来自这个网页(例如:opsiq_portal_return, 仅接受在您的门户网站地址内),否则,该门户网站将包含“参考政策”:不引用和“缓存控制”:无存储。

5
门户核查客户并签名于

检查签名、 工作空间密钥、 过期和一次性的 ID。 客户端通过电子邮件找到或创建, 并且其现有请求都符合 。

代号,按索赔要求

site_key

您的工作空间密钥。 即使签名正确, 给另一个工作空间的令牌也会被拒绝 。

iat/ exp 数据

已发行并过期, 以秒计。 传送门标志存在 120 秒:它只需要在一次转动中活过一次。

认证: 真实

你的应用程序声明,它真的签了这个人。

jti + 数据 single_use: 真实

随机的ID和一次性的旗帜。 无法两次使用相同的链接 。

平台

客户的免费标签(php, wordpress, whmcs.),在客户简介中显示.

客户名和客户名

两者都需要。 ID 是您的应用程序的客户身份; 电子邮件是门户网站如何找到客户并匹配其请求的 。

客户名/ external_id

可选显示名称和 ID OpsIQ 存储在您的平台上。

设置

1
复制路线

设置、 支持门户、 无法连接的应用程序 。 选择您的应用程序运行在什么上; 列表下面的代码有您输入的门户地址和工作空间密钥, 并带有该平台的编号注释 。

2
密码里已经写着秘密了

复制的路由包含此工作空间的签名密钥, 因此它的工作方式是粘贴的。 要将其保存在文件之外, 请设定 OPSIQ_SITE_SECRET 服务器上的(或您框架的设置) : 该值首先被使用。 永远不要将路由放入页面中 , JavaScript,移动应用程序或公共寄存器:任何持有该秘密的人都可以作为任何客户签名.

3
将您的支持按钮链接到路径

举例来说, https://your-app.com/support-portal.

4
使用您的应用程序在按钮中创建门户的签名

门户网站工作室 登录页面 使用我的网站登录页面 您的登录页面 URL: 设置到同一路径。 opsiq_portal_return 自己和路线 使顾客回到那页,签到。

5
可选: 到处签字

设置、 支持门户、 随地签名: 您的应用程序的注册 URL,所以从门户上签字 也从你的应用程序中签字给客户。

6
测试

在同一设置页面生成一个签名的测试链接, 单独检查门户侧面, 然后打开您的路由, 而同时签名到您的应用程序 。

WHMCS 不需要代码: WHMCS 远程网站的钩子已经将客户端签入了门户,并带回了他们登入的一页.
💡
签名的秘密已经为你填了 在设置、 支持门户、 无连接的签名 来自您的应用程序中, 每个实例都已经包含此站点的自有秘密, 因此代码以粘贴的方式工作: 没有可以复制或配置的 。 本页面显示的例子 。 opsiq_whsec_YOUR_SITE_SECRET 每一个例子都寻找 OPSIQ_SITE_SECRET 服务器上首先使用(或您框架的自身设置, 在其注释中命名) , 并使用设定时的设置, 这样您可以随时将密钥移出文件, 例如在不编辑代码的情况下旋转它。 无论是哪种方式, 文件只在您的服务器上运行: 从不粘贴到网页或浏览器中 。 JavaScript,并且从不把它 在一个公共存储器, 因为任何人持有这个秘密 可以签进 作为任何你的客户或工作人员。 WHMCS 财务报告和已审计财务报表 Botble 不需要这些: WHMCS 钩子来了 隐藏的秘密,和 Botble 连接器面板将它填入桥中.

完整路线,按月台分列

OpsIQ server (self-hosted)

1

For a self-hosted OpsIQ: the route runs on your own OpsIQ server, so there is no secret to copy. OpsIQ reads this workspace's signing secret itself.

2

Save it as a page on that server, e.g. support-portal.php, and point your "Support" link at it.

3

Replace the body of $currentUser so it returns your signed-in customer (id, email, name), or null for a guest, and /login with your login page.

OpsIQ server (self-hosted)
/* OpsIQ server (self-hosted) — save as e.g. support-portal.php on your OpsIQ
 * server and link your "Support" button to it. OpsIQ reads the workspace's
 * signing secret itself, so there is nothing secret to copy. */

if (!function_exists('opsiq_portal_signed_url_for_site')) {
    require_once '/path/to/opsiq/opsiq/opsiq.portal_identity.php';
}

// 1. WHO IS SIGNED IN — replace the body. Return null for a guest.
$currentUser = static function (): ?array {
    $u = $_SESSION['user'] ?? null;
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
};
$user = $currentUser();
if (!$user) {
    header('Location: /login?return=' . urlencode($_SERVER['REQUEST_URI'] ?? '/'), true, 302);
    exit;
}

// 2. WHERE TO LAND — the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

// 3. MINT a one-time link (120 s) for this workspace.
$url = opsiq_portal_signed_url_for_site($target, 'YOUR_SITE_KEY', [
    'id'    => $user['id'],        // REQUIRED
    'email' => $user['email'],     // REQUIRED
    'name'  => $user['name'] ?? '',
], 120);
if (!$url) {
    http_response_code(503);       // fail closed: never send a customer to a guessed address
    exit('Support portal is not configured yet.');
}

header('Referrer-Policy: no-referrer');   // the token is in the URL
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

PHP (no dependencies)

1

Save the snippet as a page in your app, e.g. support-portal.php.

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (hosting panel, .env or SetEnv) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace the body of $currentUser with your app's signed-in customer, and /login with your login page.

PHP (no dependencies)
/* support-portal.php — a redirect route in your own app.
 * Mint at CLICK time: a token baked into an href leaks through page source,
 * browser history and the Referer header. */

// 1. WHO IS SIGNED IN — replace the body with your app's own session. Return null for a guest.
$currentUser = static function (): ?array {
    $u = $_SESSION['user'] ?? null;            // e.g. ['id' => 7, 'email' => '…', 'name' => '…']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
};
$user = $currentUser();
if (!$user) {                                  // a guest: sign in first, then come back here
    header('Location: /login?return=' . urlencode($_SERVER['REQUEST_URI'] ?? '/'), true, 302);
    exit;
}

// 2. THE SECRET — server-side only. Fail closed without it.
$secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
if ($secret === '') { http_response_code(503); exit('Support portal is not configured.'); }

// 3. WHERE TO LAND — the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

// 4. MINT the token (standard HS256 JWT).
$b64 = static function ($v) {
    return rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
};
$now = time();
$signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
    'site_key'      => 'YOUR_SITE_KEY',
    'iat'           => $now,
    'exp'           => $now + 120,                // URL-borne tokens live ~2 minutes
    'authenticated' => true,
    'jti'           => bin2hex(random_bytes(16)),
    'single_use'    => true,                      // one-time link; replay is refused
    'platform'      => 'php',
    'customer'      => [
        'id'          => $user['id'],             // REQUIRED
        'email'       => $user['email'],          // REQUIRED
        'name'        => $user['name'] ?? '',
        'external_id' => (string) $user['id'],
    ],
]);
$token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

// 5. GO. The default is https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
$url = $target . (strpos($target, '?') === false ? '?' : '&')
     . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
header('Referrer-Policy: no-referrer');       // the token is in the URL
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

Laravel

1

Run: composer require firebase/php-jwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the route into routes/web.php. The auth middleware sends guests to your login and back.

Laravel
/* routes/web.php — composer require firebase/php-jwt
 * Link customers to  route('support.portal') */

Route::get('/support-portal', function (\Illuminate\Http\Request $request) {
    $user   = $request->user();                                   // guaranteed by ->middleware('auth')
    $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
    abort_if($secret === '', 503, 'Support portal is not configured.');   // fail closed

    // Where to land: the portal page they came from, only if it is on the portal.
    $portal = 'https://YOUR-OPSIQ/portal/your-workspace';
    $back   = preg_replace('/#.*$/', '', (string) $request->query('opsiq_portal_return', ''));
    $target = ($back === $portal || str_starts_with($back, $portal . '/') || str_starts_with($back, $portal . '?'))
        ? $back : $portal;

    $now   = time();
    $token = \Firebase\JWT\JWT::encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 120,
        'authenticated' => true,
        'jti'           => bin2hex(random_bytes(16)),
        'single_use'    => true,
        'platform'      => 'laravel',
        'customer'      => [
            'id'          => $user->id,          // REQUIRED
            'email'       => $user->email,       // REQUIRED
            'name'        => $user->name,
            'external_id' => (string) $user->id,
        ],
    ], $secret, 'HS256');

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    $url = $target . (str_contains($target, '?') ? '&' : '?')
         . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);

    return redirect()->away($url)
        ->header('Referrer-Policy', 'no-referrer')
        ->header('Cache-Control', 'no-store');
})->middleware('auth')->name('support.portal');

WordPress

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php, above "That's all, stop editing", instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste the snippet into your theme's functions.php, or a small plugin (Code Snippets works).

3

Create an empty page with the slug support-portal and link your "Support" menu item to it. Guests are sent to wp-login and back.

WordPress
/* functions.php, or a small plugin. Create an empty page with the slug
 * "support-portal" and link customers to it. */

add_action('template_redirect', function () {
    if (!is_page('support-portal')) return;
    if (!is_user_logged_in()) { auth_redirect(); }                 // login, then back here

    $secret = defined('OPSIQ_SITE_SECRET') ? OPSIQ_SITE_SECRET : 'opsiq_whsec_YOUR_SITE_SECRET';   // this site's secret; wp-config.php wins when set
    if ($secret === '') wp_die('Support portal is not configured.', '', ['response' => 503]);   // fail closed

    // Where to land: the portal page they came from, only if it is on the portal.
    $portal = 'https://YOUR-OPSIQ/portal/your-workspace';
    $back   = preg_replace('/#.*$/', '', isset($_GET['opsiq_portal_return']) ? wp_unslash((string) $_GET['opsiq_portal_return']) : '');
    $target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
        ? $back : $portal;

    $user = wp_get_current_user();
    $b64  = static function ($v) {
        return rtrim(strtr(base64_encode(wp_json_encode($v)), '+/', '-_'), '=');
    };
    $now     = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 120,
        'authenticated' => true,
        'jti'           => bin2hex(random_bytes(16)),
        'single_use'    => true,
        'platform'      => 'wordpress',
        'customer'      => [
            'id'          => $user->ID,              // REQUIRED
            'email'       => $user->user_email,      // REQUIRED
            'name'        => $user->display_name,
            'external_id' => (string) $user->ID,
        ],
    ]);
    $token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    $url = $target . (strpos($target, '?') === false ? '?' : '&')
         . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
    nocache_headers();
    header('Cache-Control: no-store');
    header('Referrer-Policy: no-referrer');
    wp_redirect($url, 302);                                       // wp_redirect, not wp_safe_redirect: the portal is another host
    exit;
});

WHMCS

Already using the OpsIQ WHMCS hook from Sites (includes/hooks/opsiq_tracker.php)? It already signs your customers into the portal and brings them back to the page they were on, so you do not need this snippet. Just set Portal Studio → Sign-in page → Your login page URL to your WHMCS client area login. Use the code below only if you are not installing that hook.
1

Save part 1 as opsiq_support.php in your WHMCS root (next to clientarea.php).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the hook, set $opsiq_site_secret = '…'; in configuration.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Save part 2 as includes/hooks/opsiq_support_link.php to add Support to the client-area menu.

WHMCS
/* Two files you own — no OpsIQ module, nothing to keep updated.
 *
 * 1) Save this part as  opsiq_support.php  in your WHMCS root. */

require __DIR__ . '/init.php';

$ca = new WHMCS\ClientArea();
$ca->initPage();
$ca->requireLogin();                                         // login, then back here

$secret = '';
if (is_file(__DIR__ . '/configuration.php')) {
    include __DIR__ . '/configuration.php';                  // defines $opsiq_site_secret
    $secret = isset($opsiq_site_secret) ? (string) $opsiq_site_secret : 'opsiq_whsec_YOUR_SITE_SECRET';   // this site's secret; configuration.php wins when set
}
if ($secret === '') { http_response_code(503); exit('Support portal is not configured.'); }   // fail closed

// Where to land: the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

$uid    = (int) $ca->getUserID();
$client = localAPI('GetClientsDetails', ['clientid' => $uid]);

$b64 = static function ($v) {
    return rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
};
$now     = time();
$signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
    'site_key'      => 'YOUR_SITE_KEY',
    'iat'           => $now,
    'exp'           => $now + 120,
    'authenticated' => true,
    'jti'           => bin2hex(random_bytes(16)),
    'single_use'    => true,
    'platform'      => 'whmcs',
    'customer'      => [
        'id'          => $uid,                       // REQUIRED
        'email'       => $client['email'] ?? '',     // REQUIRED
        'name'        => trim(($client['firstname'] ?? '') . ' ' . ($client['lastname'] ?? '')),
        'external_id' => (string) $uid,
    ],
]);
$token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

// Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
$url = $target . (strpos($target, '?') === false ? '?' : '&')
     . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
header('Referrer-Policy: no-referrer');
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

/* 2) And this part as  includes/hooks/opsiq_support_link.php  to put a
 *    Support entry in the client-area navbar:
 *
 *    add_hook('ClientAreaPrimaryNavbar', 1, function ($navbar) {
 *        $navbar->addChild('opsiqSupport', [
 *            'label' => 'Support',
 *            'uri'   => 'opsiq_support.php',
 *            'order' => 60,
 *        ]);
 *    });
 */

Node.js / Express

1

Run: npm i jsonwebtoken

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (.env with dotenv, or your host's settings) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the route after your session / passport setup. Change /login if your login page lives elsewhere.

Node.js / Express
// npm i jsonwebtoken
const jwt = require("jsonwebtoken");
const crypto = require("crypto");

const PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";
const onPortal = (u) => u === PORTAL || u.startsWith(PORTAL + "/") || u.startsWith(PORTAL + "?");

app.get("/support-portal", (req, res) => {
  const user = req.user;                                  // set by your session / passport
  if (!user) return res.redirect("/login?next=" + encodeURIComponent(req.originalUrl));

  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!secret) return res.status(503).send("Support portal is not configured.");   // fail closed

  // Where to land: the portal page they came from, only if it is on the portal.
  const back = String(req.query.opsiq_portal_return || "").replace(/#.*$/, "");
  const target = onPortal(back) ? back : PORTAL;

  const token = jwt.sign({
    site_key: "YOUR_SITE_KEY",
    authenticated: true,
    jti: crypto.randomBytes(16).toString("hex"),
    single_use: true,                                     // one-time link
    platform: "node",
    customer: {
      id: user.id,                                        // REQUIRED
      email: user.email,                                  // REQUIRED
      name: user.name,
      external_id: String(user.id),
    },
  }, secret, { algorithm: "HS256", expiresIn: 120 });     // sets iat + exp

  // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
  const url = target + (target.includes("?") ? "&" : "?")
    + "site_key=" + encodeURIComponent("YOUR_SITE_KEY") + "&identity_token=" + encodeURIComponent(token);
  res.set("Referrer-Policy", "no-referrer").set("Cache-Control", "no-store").redirect(302, url);
});

Node.js (no dependencies)

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your app's signed-in customer, then call supportPortal(req, res) for GET /support-portal in your server.

Node.js (no dependencies)
// No packages needed — Node's own crypto is enough.
const crypto = require("crypto");

const PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";
const b64 = (obj) => Buffer.from(JSON.stringify(obj)).toString("base64url");

// 1. WHO IS SIGNED IN — replace with your app's session lookup. Return null for a guest.
function currentUser(req) {
  return req.user || null;                                // { id, email, name }
}

// GET /support-portal
function supportPortal(req, res) {
  const here = new URL(req.url, "http://local");
  const user = currentUser(req);
  if (!user) {                                            // a guest: sign in first, then come back
    res.writeHead(302, { Location: "/login?next=" + encodeURIComponent(req.url) });
    return res.end();
  }
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!secret) { res.writeHead(503); return res.end("Support portal is not configured."); }

  // Where to land: the portal page they came from, only if it is on the portal.
  const back = (here.searchParams.get("opsiq_portal_return") || "").replace(/#.*$/, "");
  const target = (back === PORTAL || back.startsWith(PORTAL + "/") || back.startsWith(PORTAL + "?")) ? back : PORTAL;

  const now = Math.floor(Date.now() / 1000);
  const signing = b64({ alg: "HS256", typ: "JWT" }) + "." + b64({
    site_key: "YOUR_SITE_KEY",
    iat: now,
    exp: now + 120,
    authenticated: true,
    jti: crypto.randomBytes(16).toString("hex"),
    single_use: true,
    platform: "node",
    customer: { id: user.id, email: user.email, name: user.name, external_id: String(user.id) },
  });
  const token = signing + "." + crypto.createHmac("sha256", secret).update(signing).digest("base64url");

  // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
  const url = target + (target.includes("?") ? "&" : "?")
    + "site_key=" + encodeURIComponent("YOUR_SITE_KEY") + "&identity_token=" + encodeURIComponent(token);
  res.writeHead(302, { Location: url, "Referrer-Policy": "no-referrer", "Cache-Control": "no-store" });
  res.end();
}

Python (Flask / FastAPI)

1

Run: pip install pyjwt (the Flask example also uses flask-login).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste into the module that creates your app. @login_required sends guests to your login view and back.

Python (Flask / FastAPI)
# pip install pyjwt flask-login
import os, secrets, time, urllib.parse
import jwt
from flask import request, redirect, abort
from flask_login import login_required, current_user

PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

def portal_link(user, back=""):
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret:
        abort(503, "Support portal is not configured.")     # fail closed
    back = back.split("#", 1)[0]
    target = back if (back == PORTAL or back.startswith(PORTAL + "/") or back.startswith(PORTAL + "?")) else PORTAL
    now = int(time.time())
    token = jwt.encode({
        "site_key": "YOUR_SITE_KEY",
        "iat": now,
        "exp": now + 120,                                   # URL-borne: ~2 minutes
        "authenticated": True,
        "jti": secrets.token_hex(16),
        "single_use": True,                                 # one-time link
        "platform": "python",
        "customer": {
            "id": user.id,                                  # REQUIRED
            "email": user.email,                            # REQUIRED
            "name": getattr(user, "name", ""),
            "external_id": str(user.id),
        },
    }, secret, algorithm="HS256")
    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    return (target + ("&" if "?" in target else "?")
            + "site_key=" + urllib.parse.quote("YOUR_SITE_KEY", safe="")
            + "&identity_token=" + urllib.parse.quote(token, safe=""))

@app.route("/support-portal")
@login_required
def support_portal():
    resp = redirect(portal_link(current_user, request.args.get("opsiq_portal_return", "")), code=302)
    resp.headers["Referrer-Policy"] = "no-referrer"
    resp.headers["Cache-Control"] = "no-store"
    return resp

Django

1

Run: pip install pyjwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the view into views.py and add path("support-portal/", views.support_portal) to urls.py. @login_required sends guests to LOGIN_URL and back.

Django
# pip install pyjwt   —   urls.py: path("support-portal/", views.support_portal)
import secrets, time, urllib.parse
import jwt
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect

PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

@login_required
def support_portal(request):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret:                                       # fail closed
        return HttpResponse("Support portal is not configured.", status=503)

    # Where to land: the portal page they came from, only if it is on the portal.
    back = request.GET.get("opsiq_portal_return", "").split("#", 1)[0]
    target = back if (back == PORTAL or back.startswith(PORTAL + "/") or back.startswith(PORTAL + "?")) else PORTAL

    now = int(time.time())
    token = jwt.encode({
        "site_key": "YOUR_SITE_KEY",
        "iat": now,
        "exp": now + 120,
        "authenticated": True,
        "jti": secrets.token_hex(16),
        "single_use": True,
        "platform": "django",
        "customer": {
            "id": request.user.pk,                        # REQUIRED
            "email": request.user.email,                  # REQUIRED
            "name": request.user.get_full_name(),
            "external_id": str(request.user.pk),
        },
    }, secret, algorithm="HS256")

    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    url = (target + ("&" if "?" in target else "?")
           + "site_key=" + urllib.parse.quote("YOUR_SITE_KEY", safe="")
           + "&identity_token=" + urllib.parse.quote(token, safe=""))
    resp = HttpResponseRedirect(url)
    resp["Referrer-Policy"] = "no-referrer"
    resp["Cache-Control"] = "no-store"
    return resp

.NET / C#

1

Run: dotnet add package System.IdentityModel.Tokens.Jwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste into Program.cs after app.UseAuthentication(). RequireAuthorization() sends guests to your login and back.

.NET / C#
// dotnet add package System.IdentityModel.Tokens.Jwt   —   Program.cs
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

const string Portal = "https://YOUR-OPSIQ/portal/your-workspace";

app.MapGet("/support-portal", (HttpContext ctx, IConfiguration cfg) =>
{
    var secret = cfg["OpsIQ:SiteSecret"];
    if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
    if (string.IsNullOrEmpty(secret))                     // fail closed
        return Results.StatusCode(503);

    var id    = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "";   // REQUIRED
    var email = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "";            // REQUIRED
    var name  = ctx.User.Identity?.Name ?? "";

    // Where to land: the portal page they came from, only if it is on the portal.
    var back = (ctx.Request.Query["opsiq_portal_return"].ToString()).Split('#')[0];
    var target = (back == Portal || back.StartsWith(Portal + "/") || back.StartsWith(Portal + "?")) ? back : Portal;

    var key   = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var now   = DateTimeOffset.UtcNow;
    var payload = new JwtPayload
    {
        { "site_key",      "YOUR_SITE_KEY" },
        { "iat",           now.ToUnixTimeSeconds() },
        { "exp",           now.AddSeconds(120).ToUnixTimeSeconds() },
        { "authenticated", true },
        { "jti",           Guid.NewGuid().ToString("N") },
        { "single_use",    true },
        { "platform",      "dotnet" },
        { "customer", new Dictionary<string, object>
            { { "id", id }, { "email", email }, { "name", name }, { "external_id", id } } },
    };
    var token = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(new JwtHeader(creds), payload));

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    var url = target + (target.Contains('?') ? "&" : "?")
        + "site_key=" + Uri.EscapeDataString("YOUR_SITE_KEY") + "&identity_token=" + Uri.EscapeDataString(token);
    ctx.Response.Headers["Referrer-Policy"] = "no-referrer";
    ctx.Response.Headers["Cache-Control"] = "no-store";
    return Results.Redirect(url);
}).RequireAuthorization();

Ruby on Rails

1

Add gem "jwt" to the Gemfile and run bundle install.

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (or Rails credentials) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Save as app/controllers/support_controller.rb and add get "/support-portal", to: "support#portal" to routes.rb. Devise's authenticate_user! sends guests to login and back.

Ruby on Rails
# Gemfile: gem "jwt"   —   routes.rb: get "/support-portal", to: "support#portal"
require "jwt"
require "securerandom"
require "cgi"

class SupportController < ApplicationController
  before_action :authenticate_user!                      # login, then back here

  PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

  def portal
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    return head :service_unavailable if secret.blank?    # fail closed

    # Where to land: the portal page they came from, only if it is on the portal.
    back = params[:opsiq_portal_return].to_s.split("#").first.to_s
    target = (back == PORTAL || back.start_with?(PORTAL + "/", PORTAL + "?")) ? back : PORTAL

    now = Time.now.to_i
    token = JWT.encode({
      site_key:      "YOUR_SITE_KEY",
      iat:           now,
      exp:           now + 120,
      authenticated: true,
      jti:           SecureRandom.hex(16),
      single_use:    true,
      platform:      "rails",
      customer: {
        id:          current_user.id,                    # REQUIRED
        email:       current_user.email,                 # REQUIRED
        name:        current_user.try(:name).to_s,
        external_id: current_user.id.to_s
      }
    }, secret, "HS256")

    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    url = target + (target.include?("?") ? "&" : "?") +
          "site_key=#{CGI.escape("YOUR_SITE_KEY")}&identity_token=#{CGI.escape(token)}"
    response.headers["Referrer-Policy"] = "no-referrer"
    response.headers["Cache-Control"] = "no-store"
    redirect_to url, allow_other_host: true
  end
end

Java (Spring Boot)

1

Add io.jsonwebtoken:jjwt-api, jjwt-impl and jjwt-jackson (0.12+).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret in application.properties (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace currentUser() with your user lookup. With Spring Security the route must be authenticated so guests go to login and back.

Java (Spring Boot)
// io.jsonwebtoken:jjwt-api / jjwt-impl / jjwt-jackson (0.12+)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.time.Instant;
import java.util.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.view.RedirectView;

@Controller
public class SupportPortalController {
    private static final String PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";

    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS SIGNED IN — replace with your own lookup: id, email, name. */
    private Map<String, Object> currentUser(Principal principal) {
        return Map.of("id", principal.getName(), "email", principal.getName(), "name", principal.getName());
    }

    @GetMapping("/support-portal")
    public RedirectView supportPortal(Principal principal, HttpServletResponse response,
                                      @RequestParam(name = "opsiq_portal_return", defaultValue = "") String back) {
        if (principal == null) return new RedirectView("/login");               // login, then back here
        if (secret.isEmpty()) throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE);   // fail closed

        // Where to land: the portal page they came from, only if it is on the portal.
        back = back.split("#", 2)[0];
        String target = (back.equals(PORTAL) || back.startsWith(PORTAL + "/") || back.startsWith(PORTAL + "?")) ? back : PORTAL;

        Map<String, Object> user = currentUser(principal);
        Map<String, Object> customer = Map.of(
            "id",          user.get("id"),                 // REQUIRED
            "email",       user.get("email"),              // REQUIRED
            "name",        user.get("name"),
            "external_id", String.valueOf(user.get("id")));

        Instant now = Instant.now();
        String token = Jwts.builder()
            .claim("site_key", "YOUR_SITE_KEY")
            .claim("authenticated", true)
            .claim("single_use", true)                     // one-time link
            .claim("platform", "java")
            .claim("customer", customer)
            .id(UUID.randomUUID().toString())              // jti
            .issuedAt(Date.from(now))
            .expiration(Date.from(now.plusSeconds(120)))
            .signWith(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)), Jwts.SIG.HS256)
            .compact();

        // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
        String url = target + (target.contains("?") ? "&" : "?")
            + "site_key=" + URLEncoder.encode("YOUR_SITE_KEY", StandardCharsets.UTF_8)
            + "&identity_token=" + URLEncoder.encode(token, StandardCharsets.UTF_8);
        response.setHeader("Referrer-Policy", "no-referrer");
        response.setHeader("Cache-Control", "no-store");
        return new RedirectView(url);
    }
}

Go

1

Run: go get github.com/golang-jwt/jwt/v5

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace currentUser() with your session lookup and register http.HandleFunc("/support-portal", supportPortal).

Go
// go get github.com/golang-jwt/jwt/v5
package main

import (
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "net/http"
    "net/url"
    "os"
    "strings"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

const portal = "https://YOUR-OPSIQ/portal/your-workspace"

type User struct{ ID, Email, Name string }

// WHO IS SIGNED IN — replace with your session lookup. Return nil for a guest.
func currentUser(r *http.Request) *User { return nil }

func supportPortal(w http.ResponseWriter, r *http.Request) {
    user := currentUser(r)
    if user == nil { // login, then back here
        http.Redirect(w, r, "/login?next="+url.QueryEscape(r.URL.RequestURI()), http.StatusFound)
        return
    }
    secret := os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if secret == "" { // fail closed
        http.Error(w, "Support portal is not configured.", http.StatusServiceUnavailable)
        return
    }

    // Where to land: the portal page they came from, only if it is on the portal.
    back := strings.SplitN(r.URL.Query().Get("opsiq_portal_return"), "#", 2)[0]
    target := portal
    if back == portal || strings.HasPrefix(back, portal+"/") || strings.HasPrefix(back, portal+"?") {
        target = back
    }

    jti := make([]byte, 16)
    rand.Read(jti)
    now := time.Now().Unix()
    token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "site_key":      "YOUR_SITE_KEY",
        "iat":           now,
        "exp":           now + 120,
        "authenticated": true,
        "jti":           hex.EncodeToString(jti),
        "single_use":    true,
        "platform":      "go",
        "customer": map[string]any{
            "id":          user.ID,    // REQUIRED
            "email":       user.Email, // REQUIRED
            "name":        user.Name,
            "external_id": fmt.Sprint(user.ID),
        },
    }).SignedString([]byte(secret))
    if err != nil {
        http.Error(w, "sign failed", http.StatusInternalServerError)
        return
    }

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    sep := "?"
    if strings.Contains(target, "?") {
        sep = "&"
    }
    w.Header().Set("Referrer-Policy", "no-referrer")
    w.Header().Set("Cache-Control", "no-store")
    http.Redirect(w, r, target+sep+"site_key="+url.QueryEscape("YOUR_SITE_KEY")+"&identity_token="+url.QueryEscape(token), http.StatusFound)
}

当事情不对劲时

门户打开,但签了字

密钥或工作空间密钥不匹配此工作空间, 符号比 120 秒( 请检查服务器时钟) , 或打开了两次相同的链接。 生成一个签名的测试链接: 如果成功, 请将您符号的主张与示例进行比较 。

它总是降落在传送门的家

返回地址不在您的门户网站地址内, 因此被故意忽略了。 将其与门户网站比较 URL 在设置中显示 。

来宾不会用登录方式, 反而会错误

替换 /login 在路径中,请使用您真实的登录页面,并确保您的登录返回给定的地址。

只对一些顾客有用

客户电子邮件或客户身份证明对他们来说是空的,两者都需要.

开发者

客户聊天: 识别登录客户

选择性。 大多数网站不需要这个 : 使用普通聊天片段和一个连接器, 聊天会验证客户本身, 并附有预订或订单号, 加上检查的证明和在订单前用电子邮件发送的代码 。 如果您想要一个已经自动登录到您的网站的客户, 并且有他们的全部账户, 请添加此内容 。 WHMCS 已经通过它的钩子。远程站点、您的站点和代码、 C 打印出相同的代码,并填入您的网站密钥。

如何运作

1
您的页面打印聊天标签

对于一个签到的客户来说,部件 URL 携带( R)identity_token=... 在您的服务器上签名; 对于一个客人来说, 这是普通的标签。 页面中没有任何秘密: 只有一个过期的符号 。

2
聊天验证了信物

签名、 工作空间密钥和过期。 每次聊天请求中客户都会知道, 您的连接器可以回答他们自己的订单、 预订或发票 。

3
聊天时间还没到就很清新

它称它为 页面,它与它上opsiq_identity_refresh=1& role=客户。 您的代码回答 { “ 成功” : true,identity_token""...") 顾客被签入,或者 401 与{"成功":虚假,"login_required当它们不是时,所以在打印出任何内容之前,更新的处理器必须运行。

和传送门的标志有什么不同

终身

1小时(实例=iat +) 3600) 而不是(a) 120 秒,因为它比每个聊天请求都多,而不是一个方向。

没有Jti或 single_use

每条消息都使用相同的同义符,直到刷新替换它.

一样的,其他的

site_key, iat, exp, 认证: 真实、 平台和客户, 并带有所需的身份和电子邮件。 同样的秘密, 相同的签名 。

💡
身份证明说客户是WHO,他们的订单,预订或发票通过连接器到达聊天:一个呼叫平台的 API,或者,当您的平台没有 API,一个连接器加上其桥口文件(连接器构建器会制作一个).
💡
签名的秘密已经为你填了 在远程网站,你的站点,代码,C,每个实例都已经包含这个站点自己的秘密,所以代码以粘贴的方式工作:没有可以复制或配置的代码。本页面显示中的例子 opsiq_whsec_YOUR_SITE_SECRET 每一个例子都寻找 OPSIQ_SITE_SECRET 服务器上首先使用(或您框架的自身设置, 在其注释中命名) , 并使用设定时的设置, 这样您可以随时将密钥移出文件, 例如在不编辑代码的情况下旋转它。 无论是哪种方式, 文件只在您的服务器上运行: 从不粘贴到网页或浏览器中 。 JavaScript,并且从不把它 在一个公共存储器, 因为任何人持有这个秘密 可以签进 作为任何你的客户或工作人员。 WHMCS 财务报告和已审计财务报表 Botble 不需要这些: WHMCS 钩子来了 隐藏的秘密,和 Botble 连接器面板将它填入桥中.

完整代码, 平台按平台

WHMCS

Nothing to add: the WHMCS hook in Option 1 already signs your signed-in clients into the chat, refreshes the token on long visits, and signs staff into Admin Chat. No connector is needed for this.
1

Install the Option 1 hook as includes/hooks/opsiq_tracker.php. Do not also paste the plain chat tag.

2

Optional: add the WHMCS connector under Connectors if you also want the chat to answer about invoices, services and tickets. Identity works without it.

includes/hooks/opsiq_tracker.php
/* WHMCS: no extra code. Option 1 (the All-in-One WHMCS Hook) signs the signed-in
 * client into Client Chat, answers ?opsiq_identity_refresh=1 and signs staff into
 * Admin Chat. No connector is needed for identity. */

Botble (connector bridge)

Nothing to add for bookings: the Botble connector takes bookings as a guest checkout and finds existing bookings by booking number and proof, so guests do not need to sign in. Admins are signed in through the bridge (op=admin_embed).
1

Install the Botble connector under Connectors, copy its bridge file from the connector panel and upload it to public/. The panel fills in OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET for you.

2

Botble has no API, so the bridge file is how the chat reads rooms and takes bookings. To also recognise a guest who is already signed in on the hotel site, use the Laravel option with your customer guard.

public/opsiq-botble-bridge.php
/* Botble: no extra code for bookings.
 * The connector books as a guest checkout and finds bookings by booking number + proof.
 * In public/opsiq-botble-bridge.php fill OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET.
 * Admins: op=admin_embed */

PHP (no dependencies)

1

Save as opsiq-chat.php. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

At the very top of every page (or your front controller), before any output: require 'opsiq-chat.php'; opsiq_chat_refresh();

3

Just before </body> on every page: <?= opsiq_chat_tag() ?> — it replaces the plain chat tag. Replace opsiq_chat_user() with your signed-in customer.

opsiq-chat.php
<?php
/* opsiq-chat.php — signed-in customers for OpsIQ Client Chat. */

// WHO IS SIGNED IN — replace the body with your app's session. Return null for a guest.
function opsiq_chat_user(): ?array
{
    $u = $_SESSION['user'] ?? null;               // e.g. ['id' => 7, 'email' => '…', 'name' => '…']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
}

function opsiq_chat_token(array $u): string
{
    $secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
    if ($secret === '') return '';                           // fail closed: plain chat, no identity
    $b64 = static fn($v) => rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
    $now = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,                      // the widget refreshes before this
        'authenticated' => true,
        'platform'      => 'php',
        'customer'      => [
            'id'          => $u['id'],                       // REQUIRED
            'email'       => $u['email'],                    // REQUIRED
            'name'        => $u['name'] ?? '',
            'external_id' => (string) $u['id'],
        ],
    ]);
    return $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');
}

// Call at the top of every page, before any output.
function opsiq_chat_refresh(): void
{
    if (empty($_GET['opsiq_identity_refresh'])) return;
    header('Content-Type: application/json; charset=utf-8');
    header('Cache-Control: no-store');
    $u = opsiq_chat_user();
    $t = $u ? opsiq_chat_token($u) : '';
    if ($t === '') { http_response_code(401); echo json_encode(['success' => false, 'login_required' => true]); exit; }
    echo json_encode(['success' => true, 'role' => 'customer', 'identity_token' => $t]);
    exit;
}

// Print before </body> on every page, instead of the plain chat tag.
function opsiq_chat_tag(): string
{
    $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
    $u = opsiq_chat_user();
    $t = $u ? opsiq_chat_token($u) : '';
    if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
    return '<script async src="' . htmlspecialchars($src, ENT_QUOTES) . '" data-opsiq-widget="client-chat"></script>';
}

Laravel

1

Run: composer require firebase/php-jwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Save the class as app/Support/OpsiqChat.php, and add the small OpsiqChatRefresh middleware from the bottom of the code to the web group, so the widget can refresh its token on any page.

3

In your main Blade layout, just before </body>: {!! \App\Support\OpsiqChat::tag() !!}

app/Support/OpsiqChat.php
<?php
// app/Support/OpsiqChat.php — composer require firebase/php-jwt
namespace App\Support;

use Firebase\JWT\JWT;

final class OpsiqChat
{
    public static function token(): string
    {
        $user = auth()->user();
        $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
        if (!$user || $secret === '') return '';                 // guest, or not configured
        $now = time();
        return JWT::encode([
            'site_key'      => 'YOUR_SITE_KEY',
            'iat'           => $now,
            'exp'           => $now + 3600,
            'authenticated' => true,
            'platform'      => 'laravel',
            'customer'      => [
                'id'          => $user->id,                      // REQUIRED
                'email'       => $user->email,                   // REQUIRED
                'name'        => $user->name,
                'external_id' => (string) $user->id,
            ],
        ], $secret, 'HS256');
    }

    /** For Blade: {!! \App\Support\OpsiqChat::tag() !!} before </body>. */
    public static function tag(): string
    {
        $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
        $t = self::token();
        if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
        return '<script async src="' . e($src) . '" data-opsiq-widget="client-chat"></script>';
    }
}

/* Refresh: the widget asks ?opsiq_identity_refresh=1 on the page it is on.
 * Laravel 11+ — bootstrap/app.php:
 *
 *   ->withMiddleware(function ($middleware) {
 *       $middleware->web(append: \App\Http\Middleware\OpsiqChatRefresh::class);
 *   })
 *
 * app/Http/Middleware/OpsiqChatRefresh.php:
 *
 *   public function handle($request, \Closure $next) {
 *       if (!$request->query('opsiq_identity_refresh')) return $next($request);
 *       $t = \App\Support\OpsiqChat::token();
 *       return $t === ''
 *           ? response()->json(['success' => false, 'login_required' => true], 401)->header('Cache-Control', 'no-store')
 *           : response()->json(['success' => true, 'role' => 'customer', 'identity_token' => $t])->header('Cache-Control', 'no-store');
 *   }
 */

WordPress / WooCommerce

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste into your theme's functions.php or a small plugin. It prints the chat itself, so remove the plain chat tag if you added one.

3

For WooCommerce orders in the chat, add the WooCommerce connector under Connectors.

functions.php
/* functions.php or a small plugin — OpsIQ Client Chat with signed-in customers. */

if (!defined('OPSIQ_SITE_SECRET')) define('OPSIQ_SITE_SECRET', 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; wp-config.php wins when set

function opsiq_chat_token(): string {
    if (!is_user_logged_in() || !defined('OPSIQ_SITE_SECRET') || OPSIQ_SITE_SECRET === '') return '';
    $u   = wp_get_current_user();
    $b64 = static fn($v) => rtrim(strtr(base64_encode(wp_json_encode($v)), '+/', '-_'), '=');
    $now = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,
        'authenticated' => true,
        'platform'      => 'wordpress',
        'customer'      => [
            'id'          => $u->ID,                     // REQUIRED
            'email'       => $u->user_email,             // REQUIRED
            'name'        => $u->display_name,
            'external_id' => (string) $u->ID,
        ],
    ]);
    return $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, OPSIQ_SITE_SECRET, true)), '+/', '-_'), '=');
}

// Refresh: the widget asks ?opsiq_identity_refresh=1 on the page it is on.
add_action('init', function () {
    if (empty($_GET['opsiq_identity_refresh'])) return;
    nocache_headers();
    $t = opsiq_chat_token();
    if ($t === '') wp_send_json(['success' => false, 'login_required' => true], 401);
    wp_send_json(['success' => true, 'role' => 'customer', 'identity_token' => $t]);
});

// The chat tag, on every front-end page.
add_action('wp_footer', function () {
    $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
    $t = opsiq_chat_token();
    if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
    echo '<script async src="' . esc_url($src) . '" data-opsiq-widget="client-chat"></script>';
});

Node.js / Express

1

Run: npm i jsonwebtoken. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

app.use(opsiqChat) after your session / passport middleware. It answers the refresh and sets res.locals.opsiqChatTag.

3

Print res.locals.opsiqChatTag (unescaped) just before </body> in your layout, instead of the plain chat tag.

opsiq-chat.js
// opsiq-chat.js — npm i jsonwebtoken
const jwt = require("jsonwebtoken");

function opsiqChatToken(user) {
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!user || !secret) return "";
  return jwt.sign({
    site_key: "YOUR_SITE_KEY",
    authenticated: true,
    platform: "node",
    customer: { id: user.id, email: user.email, name: user.name, external_id: String(user.id) },  // id + email REQUIRED
  }, secret, { algorithm: "HS256", expiresIn: 3600 });     // sets iat + exp
}

// app.use(opsiqChat) — after your session / passport middleware.
function opsiqChat(req, res, next) {
  const token = opsiqChatToken(req.user);
  if (req.query.opsiq_identity_refresh) {                  // the widget refreshing on this page
    res.set("Cache-Control", "no-store");
    return token
      ? res.json({ success: true, role: "customer", identity_token: token })
      : res.status(401).json({ success: false, login_required: true });
  }
  const src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (token ? "&identity_token=" + encodeURIComponent(token) : "");
  res.locals.opsiqChatTag = '<script async src="' + src.replace(/"/g, """) + '" data-opsiq-widget="client-chat"></script>';
  next();
}

module.exports = { opsiqChat };

Python (Flask)

1

Run: pip install pyjwt flask-login. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Call init_opsiq_chat(app) where you create the app. It answers the refresh and gives templates opsiq_chat_tag.

3

In your base template, just before </body>: {{ opsiq_chat_tag }}

opsiq_chat.py
# opsiq_chat.py — pip install pyjwt flask-login
import os, time, urllib.parse
import jwt
from flask import request, jsonify
from flask_login import current_user
from markupsafe import Markup, escape

def opsiq_chat_token():
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret or not current_user.is_authenticated:
        return ""
    now = int(time.time())
    return jwt.encode({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "python",
        "customer": {"id": current_user.id, "email": current_user.email,       # REQUIRED
                     "name": getattr(current_user, "name", ""), "external_id": str(current_user.id)},
    }, secret, algorithm="HS256")

def init_opsiq_chat(app):
    @app.before_request
    def _opsiq_refresh():
        if request.args.get("opsiq_identity_refresh"):
            t = opsiq_chat_token()
            resp = jsonify({"success": True, "role": "customer", "identity_token": t}) if t \
                else (jsonify({"success": False, "login_required": True}), 401)
            if isinstance(resp, tuple):
                resp[0].headers["Cache-Control"] = "no-store"
            else:
                resp.headers["Cache-Control"] = "no-store"
            return resp

    @app.context_processor
    def _opsiq_tag():
        t = opsiq_chat_token()
        src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + ("&identity_token=" + urllib.parse.quote(t, safe="") if t else "")
        return {"opsiq_chat_tag": Markup('<script async src="%s" data-opsiq-widget="client-chat"></script>' % escape(src))}

Django

1

Run: pip install pyjwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Add "yourapp.opsiq_chat.OpsiqChatMiddleware" to MIDDLEWARE (after AuthenticationMiddleware) and "yourapp.opsiq_chat.opsiq_chat" to TEMPLATES context_processors.

3

In your base template, just before </body>: {{ opsiq_chat_tag }}

opsiq_chat.py
# yourapp/opsiq_chat.py — pip install pyjwt
import time, urllib.parse
import jwt
from django.conf import settings
from django.http import JsonResponse
from django.utils.html import format_html

def opsiq_chat_token(user):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret or not user.is_authenticated:
        return ""
    now = int(time.time())
    return jwt.encode({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "django",
        "customer": {"id": user.pk, "email": user.email,             # REQUIRED
                     "name": user.get_full_name(), "external_id": str(user.pk)},
    }, secret, algorithm="HS256")

class OpsiqChatMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        if request.GET.get("opsiq_identity_refresh"):
            t = opsiq_chat_token(request.user)
            resp = (JsonResponse({"success": True, "role": "customer", "identity_token": t}) if t
                    else JsonResponse({"success": False, "login_required": True}, status=401))
            resp["Cache-Control"] = "no-store"
            return resp
        return self.get_response(request)

def opsiq_chat(request):
    t = opsiq_chat_token(request.user)
    src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + ("&identity_token=" + urllib.parse.quote(t, safe="") if t else "")
    return {"opsiq_chat_tag": format_html('<script async src="{}" data-opsiq-widget="client-chat"></script>', src)}

.NET / C#

1

Run: dotnet add package System.IdentityModel.Tokens.Jwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

In Program.cs, after app.UseAuthentication(): app.Use(OpsiqChat.Refresh);

3

In _Layout.cshtml before </body>: @Html.Raw(OpsiqChat.Tag(Context))

OpsiqChat.cs
// OpsiqChat.cs — dotnet add package System.IdentityModel.Tokens.Jwt
using System.IdentityModel.Tokens.Jwt;
using System.Net;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public static class OpsiqChat
{
    public static string Token(HttpContext ctx)
    {
        var secret = ctx.RequestServices.GetRequiredService<IConfiguration>()["OpsIQ:SiteSecret"];
        if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
        if (string.IsNullOrEmpty(secret) || ctx.User.Identity?.IsAuthenticated != true) return "";
        var id = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "";      // REQUIRED
        var email = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "";            // REQUIRED
        var creds = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)), SecurityAlgorithms.HmacSha256);
        var now = DateTimeOffset.UtcNow;
        var payload = new JwtPayload {
            { "site_key", "YOUR_SITE_KEY" }, { "iat", now.ToUnixTimeSeconds() }, { "exp", now.AddSeconds(3600).ToUnixTimeSeconds() },
            { "authenticated", true }, { "platform", "dotnet" },
            { "customer", new Dictionary<string, object> { { "id", id }, { "email", email }, { "name", ctx.User.Identity?.Name ?? "" }, { "external_id", id } } },
        };
        return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(new JwtHeader(creds), payload));
    }

    // app.Use(OpsiqChat.Refresh) — the widget refreshing on the page it is on.
    public static async Task Refresh(HttpContext ctx, Func<Task> next)
    {
        if (string.IsNullOrEmpty(ctx.Request.Query["opsiq_identity_refresh"])) { await next(); return; }
        ctx.Response.Headers["Cache-Control"] = "no-store";
        var t = Token(ctx);
        if (t == "") { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsJsonAsync(new { success = false, login_required = true }); return; }
        await ctx.Response.WriteAsJsonAsync(new { success = true, role = "customer", identity_token = t });
    }

    public static string Tag(HttpContext ctx)
    {
        var t = Token(ctx);
        var src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t != "" ? "&identity_token=" + Uri.EscapeDataString(t) : "");
        return "<script async src=\"" + WebUtility.HtmlEncode(src) + "\" data-opsiq-widget=\"client-chat\"></script>";
    }
}

Ruby on Rails

1

Add gem "jwt" and run bundle install. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

include OpsiqChat in ApplicationController.

3

In app/views/layouts/application.html.erb before </body>: <%= opsiq_chat_tag %>

app/controllers/concerns/opsiq_chat.rb
# app/controllers/concerns/opsiq_chat.rb — Gemfile: gem "jwt"
require "jwt"
require "cgi"

module OpsiqChat
  extend ActiveSupport::Concern

  included do
    before_action :opsiq_identity_refresh
    helper_method :opsiq_chat_tag
  end

  private

  def opsiq_chat_token
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    return "" if secret.blank? || !respond_to?(:current_user, true) || current_user.nil?
    now = Time.now.to_i
    JWT.encode({
      site_key: "YOUR_SITE_KEY", iat: now, exp: now + 3600,
      authenticated: true, platform: "rails",
      customer: { id: current_user.id, email: current_user.email,          # REQUIRED
                  name: current_user.try(:name).to_s, external_id: current_user.id.to_s }
    }, secret, "HS256")
  end

  def opsiq_identity_refresh
    return unless params[:opsiq_identity_refresh].present?
    response.headers["Cache-Control"] = "no-store"
    t = opsiq_chat_token
    return render(json: { success: false, login_required: true }, status: :unauthorized) if t.blank?
    render json: { success: true, role: "customer", identity_token: t }
  end

  def opsiq_chat_tag
    t = opsiq_chat_token
    src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t.present? ? "&identity_token=#{CGI.escape(t)}" : "")
    helpers.tag.script(nil, async: true, src: src, data: { opsiq_widget: "client-chat" })
  end
end

Java (Spring Boot)

1

Add io.jsonwebtoken:jjwt-api, jjwt-impl and jjwt-jackson (0.12+). This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your user lookup. The filter answers the refresh on every page; @ControllerAdvice exposes opsiqChatTag to views.

3

Thymeleaf layout before </body>: <th:block th:utext="${opsiqChatTag}"/>

OpsiqChat.java
// OpsiqChat.java — io.jsonwebtoken:jjwt-api / jjwt-impl / jjwt-jackson (0.12+)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.time.Instant;
import java.util.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.util.HtmlUtils;

@Component
@ControllerAdvice
public class OpsiqChat implements Filter {
    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS SIGNED IN — replace with your lookup: id, email, name. Null for a guest. */
    private Map<String, Object> currentUser(Principal p) {
        return p == null ? null : Map.of("id", p.getName(), "email", p.getName(), "name", p.getName());
    }

    String token(HttpServletRequest req) {
        Map<String, Object> u = currentUser(req.getUserPrincipal());
        if (u == null || secret.isEmpty()) return "";
        Instant now = Instant.now();
        return Jwts.builder()
            .claim("site_key", "YOUR_SITE_KEY").claim("authenticated", true).claim("platform", "java")
            .claim("customer", Map.of("id", u.get("id"), "email", u.get("email"), "name", u.get("name"),
                                      "external_id", String.valueOf(u.get("id"))))          // id + email REQUIRED
            .issuedAt(Date.from(now)).expiration(Date.from(now.plusSeconds(3600)))
            .signWith(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)), Jwts.SIG.HS256)
            .compact();
    }

    @Override // the widget refreshing on the page it is on
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getParameter("opsiq_identity_refresh") == null) { chain.doFilter(request, response); return; }
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Cache-Control", "no-store");
        res.setContentType("application/json");
        String t = token(req);
        if (t.isEmpty()) { res.setStatus(401); res.getWriter().write("{\"success\":false,\"login_required\":true}"); return; }
        res.getWriter().write("{\"success\":true,\"role\":\"customer\",\"identity_token\":\"" + t + "\"}");
    }

    @ModelAttribute("opsiqChatTag")
    public String tag(HttpServletRequest req) {
        String t = token(req);
        String src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t.isEmpty() ? "" : "&identity_token=" + URLEncoder.encode(t, StandardCharsets.UTF_8));
        return "<script async src=\"" + HtmlUtils.htmlEscape(src) + "\" data-opsiq-widget=\"client-chat\"></script>";
    }
}

Go

1

Run: go get github.com/golang-jwt/jwt/v5. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your session lookup, and wrap your router: http.ListenAndServe(addr, OpsiqChatRefresh(mux)).

3

Pass OpsiqChatTag(r) to your layout template and print it before </body>.

opsiq_chat.go
// opsiq_chat.go — go get github.com/golang-jwt/jwt/v5
package main

import (
    "encoding/json"
    "fmt"
    "html"
    "html/template"
    "net/http"
    "net/url"
    "os"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

type OpsiqUser struct{ ID, Email, Name string }

// WHO IS SIGNED IN — replace with your session lookup. Return nil for a guest.
func currentUser(r *http.Request) *OpsiqUser { return nil }

func opsiqChatToken(r *http.Request) string {
    u, secret := currentUser(r), os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if u == nil || secret == "" {
        return ""
    }
    now := time.Now().Unix()
    t, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": true, "platform": "go",
        "customer": map[string]any{"id": u.ID, "email": u.Email, "name": u.Name, "external_id": fmt.Sprint(u.ID)}, // id + email REQUIRED
    }).SignedString([]byte(secret))
    if err != nil {
        return ""
    }
    return t
}

// OpsiqChatRefresh answers the widget's ?opsiq_identity_refresh=1 on any page.
func OpsiqChatRefresh(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Query().Get("opsiq_identity_refresh") == "" {
            next.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Cache-Control", "no-store")
        w.Header().Set("Content-Type", "application/json")
        if t := opsiqChatToken(r); t != "" {
            json.NewEncoder(w).Encode(map[string]any{"success": true, "role": "customer", "identity_token": t})
            return
        }
        w.WriteHeader(http.StatusUnauthorized)
        json.NewEncoder(w).Encode(map[string]any{"success": false, "login_required": true})
    })
}

// OpsiqChatTag is printed before </body> in your layout.
func OpsiqChatTag(r *http.Request) template.HTML {
    src := "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY"
    if t := opsiqChatToken(r); t != "" {
        src += "&identity_token=" + url.QueryEscape(t)
    }
    return template.HTML(`<script async src="` + html.EscapeString(src) + `" data-opsiq-widget="client-chat"></script>`)
}

当事情不对劲时

聊天把登录的顾客当成客人

标记没有打印 identity_token (服务器上缺少了这个秘密,所以代码失败了关闭),或者信使的工作空间密钥或秘密不匹配.

一开始认识,然后一个小时后就有一个客人

刷新处理器没有被到达: 它必须在任何输出之前运行, 在聊天的每页上都出现 。

平话两回

从模板中去掉普通聊天标签: 此代码会打印聊天本身 。

开发者

插件和 SDK 设备

OpsIQ 提供 SDK 用于共同平台的软件包和插件。

如何运作
插件和 SDK 设备四个软件包: PHP SDK,节点.js SDK, WordPress 插件和标签 WHMCS 模块,每个模块都有其安装命令。PHPưμ㼯A SDK作曲需要 opsiq/sdk联合来文节点.js SDKnpm I @ 维基百科中的相关条目: 维克多斯克多克多德 opsiq/sdkWP 计划WordPress 插件单击安装连接( C)呜!WHMCS 模块收费加接票
插件和 SDK 设备
ưμ㼯A SDK

作曲软件包:身份符号生成,动作 API 帮助者, Webhook 签名验证 。

JavaScript SDK

浏览器-侧:跟踪,身份,自定义事件,聊天控制.

WordPress 插件

部件注入,来自WP用户会话的身份, WooCommerce 同步 。

WHMCS 模块

完全整合:部件,出票接力,身份,管理员AI.

Shopify 主题扩展名

自动嵌入客户身份的App

ưμ㼯A SDK 快速开始

ưμ㼯A SDK 实例
composer require opsiq/sdk

use OpsIQ\SDK\Identity;
$token = Identity::createToken(
    siteKey: "site_abc123",
    secret:  "opsiq_whsec_your_secret",
    customer: ["id" => "cust_1001", "email" => "[email protected]", "name" => "Jane"]
);

// Call any catalog action over the action API
$ch = curl_init("https://your-opsiq.com/api/v1.php");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer opq_your_key",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "action" => "crm.contacts.list",
        "status" => "lead",
        "limit"  => 25,
    ]),
]);
$contacts = json_decode(curl_exec($ch), true);
开发者

调查 API、事件和无连接器的自动化

调查工作室的设计是使用相同的打入式通用 API、内部执行器、活动总线和网络hook操作等 OpsIQ。这使得开发者可以集成端到端而不构建一个包接器。

⚠️
执行情况:目前仅披露实况目录 platform.get.survey.config 财务报告和已审计财务报表 platform.save.survey.config。该词 surveys.* 财务报告和已审计财务报表 feedback.* 低于批准的合同,必须返回 unknown_action 注册前

目标行动家庭

类型、模板和快速发射

surveys.types.*, surveys.templates.* 财务报告和已审计财务报表 surveys.quick_launch.* 列表、预览、即时化和验证完整的启动器。

调查和版本

surveys.create|get|list|update|archive|duplicate 加上不可变的版本,验证和发布动作.

部署和瞄准目标

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* 财务报告和已审计财务报表 surveys.variables.*.

外联和对策

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*出口、编辑和分析。

网络选择、导入和反馈

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* 财务报告和已审计财务报表 feedback.analysis.*.

连接器无阻流

1
通过 General 创建并发布 API

使用打入的勘测。 * 动作带有工作空间键。 写出允许、 风险、 确认、 能力及干燥行为 。

2
接收您的商务活动

将一个签名的事件发送到一个输入的 Webhook, 例如取消命令或完成登入步骤。 重放保护会复制事件ID 。

3
在动作触发中映射( T)

选择一个 OpsIQ 常规 API 行动,例如发出勘测邀请或准备运动,然后从经核实的触发有效载荷中绘制出场图。

4
订阅调查事件

将记录的工商安全调查。 * 生命周期子集以签名、过滤、重试、日志和授权重放方式传送到您的端点。

光圈事件目标

共享目录将涵盖调查/部署公布状态、受众和触发决定、邀请、提交/启动/部分/接受/完成/放弃、答复编辑、竞选状态和交付失败。

连接器是可选的。 它添加了可重复使用的平台发现、 验证的身份、 事实、 变量和收件人的计数 。API 加上 Actions & Triggers/webhooks 仍然是不需要被包接器的开发者完整的集成路径.
开发者

净 值 API

密码 OpsIQ 净 值 API 允许您在程序上访问所有平台特性。

如何运作
净 值 API显示 POST 的终端 OpsIQ API 带有熊鼠键,列出开放式门票和页面 JSON 反应。$ curl -X POST https://your-domain.com/api/v1.php \-H "Authorization: Bearer opq_..."200 罢{ "data": [{ "id": 4192, "ticket_number": "T-4192","subject": "Card declined", "status": "open" },... more tickets ...], "page": 1, "per_page": 50, "has_more": true }
净 值 API

请求格式

将密钥发送为 Authorization: Bearer opq_... 或 单 X-OpsIQ-Key: opq_...。使用一个认证头,而不是两个。

API 请求格式
POST https://your-opsiq-domain.com/api/v1.php
Authorization: Bearer opq_your_api_key
# Alternative header: X-OpsIQ-Key: opq_your_api_key
Content-Type: application/json

{
  "action": "endpoint.name",
  "site_key": "site_abc123"
}

共同行动

密码 API 以动作为基础: 发送 action 名称在正文中。每个注册管理员 JSON 操作有一个稳定的命名动作。 POST {"action":"meta.actions"} (不需要键)用于权威的每集列表、请求合同、风险元数据和范围。 platform.routes.* 桥梁仅供较旧的融合使用。

crm.contacts.list

列出 CRM 联系人( scope crm. read) 。 Params: q, 状态, 来源, 标记, 领先分数, 限制 。

crm.contacts.upsert

解析或创建联系人( specople crm. write). Params: 电子邮件加字段,标签,注释.

crm.deals.list

List CRM 交易( scope crm. read). Params: 状态, stage_id, company_id , 所有人_admin_id、 project_id等, 限制 。

crm.activities.record

记录联系人的生命周期/商业活动( specople crm. write) 。 参数:电子邮件或联系站_id, 事件, 值, 货币 。

crm.conversions.record

记录转换( scope crm. write). Params: contact_id或email, transferation_type, value, month.

crm.events.list

播放 CRM 事件流( scope crm. read) 。 Params: limit.

tickets.list

列表票 (scope protection. read). Params:页面,per_page,排序,顺序,状态,优先级,部门_id,被分配_admin_id(英语:admin-id),客户端_电子邮件(英语):搜索.

tickets.get

一张票及其留言(scope protection. read). Params:出票站名或票号,包括_messages,消息-限制.

tickets.reply

张贴一张票的回执(scope protect. write). Params:出票_id或出票-数字,身体,作者_类型,作者-名称,内部.

tickets.update

更新出站票 (scope protection. write). Params:出站口为出站地/站点的出站站位,站位等,优先出站点,出站对象为部门_出站地点-admin_id.

tickets.open

开出一张支持票(scope protect. write). Params:客户_邮件,客户_名,主题,身体,优先级.

tickets.bulk

运行批量队列操作(scope prite. write). Params: operation, ids.

conversations.list

列出活话对话(scope division. read). Params:页面,per_page,状态,被指派_admin_id,客户端_电子邮件,搜索.

conversations.get

一次对话及其消息(scope difference. read). Params: conversation_id或 shead_key,包括_messages.

conversations.messages

页面信息历史(scope difference. read). Params: conversation_id, page, per_page, including_internal. 页面中包含的文本是: 页面内容 : 网页内容 , 页面名称 :

conversations.send

将消息发送到对话中(scope difference. write). Params: 对话_id,消息,发件人_类型,内部.

conversations.update

指定,重新状态或重新标题一个对话(scope difference. write). Params: conversation_id, status, admin_id (被指派), subject.

连接器. list /. get / . test

查看安装了哪些连接器,每个连接器能做什么,以及其证书是否有效(scope connectioners. read).

automations.actions.list

您的动作构建器将运行的动作( 镜像自动化. read) 。

automations.triggers.list

将发射什么,以及何种条件(镜像自动化. read).

automations.runs.list

调试集成( scope acsolutions. read) 执行历史。 参数:状态, 动作_ key 。

departments.list

部门,您可前往(扫描部门. read)办理罚单。

notifications.list

给一个操作员的通知(scope notion. read). Params: admin_id (requested), unread_ only.

analytics.export

报告部分为 CSV (scope analytics.read). Params: 区域,预设,从,到. call analialyticies.sections.list for value.

站点_信息. sites. list/. reports. list

被监测网站及其SEO报告(scope site_intelligence. read).

商业.产品.列表 /. get

您的 Store 目录, 已页( scope commerce. read) 。 过滤器: 活动、 类别、 搜索 。 .get 返回一个带有其变体的产品。

商务. orders. list /. get 商务 .

存储命令( scope commerce. read) 。 过滤器: 状态、 支付_ 方法、 频道、 客户端_ 电子邮件。 由 order_id 或它的 ORD 引用,并带有行项。不返回 活网关 检查控件。

commerce.refunds.list

退款请求及其状态(scope commerce. read).

commerce.quotes.create

给客户定价(scope commerce. write)。 store 或连接器弹片。创建无:没有命令,没有付款。见商务部分。

门票。csat列表 /.get / 测量

客户满意程度答复作为数据(scope profess. read),按评级、票、代理或期过滤; .metrics 返回显示的同个数字。

conversations.ratings.list

Chat conversations your visitors rated, with the comment, what prompted the rating and the agent credited (scope conversations.read).

knowledge.articles.list

通过您的帮助中心的文章( scope kb. read) 页面 。

knowledge.articles.get

由id所著"一则帮助中心"(scope kb. read)所出的文章. Params: profile_id.

webhooks.events.list

每个事件都可以订阅一个网络终端, 并附带其有效载荷。每个计划都有可用, 这样您就可以在购买之前先建立它。

files.get

短寿命签名的附件下载链接(scope file. read). Params: reference, ttl.

security.check

询问是否 IP 或电子邮件在此被屏蔽或可疑( scope security.read) 。IP 防火墙 罚单垃圾邮件封条列表和缓存的安全AI裁决。 Params: ip 电子邮件

security.report

报告滥用所观察到的系统(scope security.write),被记录为安全事件,立即被安全AI分类,并提醒管理人员注意高风险判决。ip 电子邮件 善良 理性 来源

安全. 块列表. add /. list

管理垃圾邮件规则售票管道执行(scope safety.write/security.read),与车票页面"Block发件人"控件相同。 Params: skind(电子邮件,域名,ip),数值,理由,过期_小时.

💡
元动作总是权威的。 它会返回安装上可用的每个动作, 并按每个动作需要的范畴, 因此您不需要猜测或硬代码此列表 。

传呼、过滤和排序

每个列表动作都使用相同的参数,所以你一次学习.

页面/ 每页

开始的页数1默认 50 最大值为 200 如果喜欢,则也接受限制和抵销。

排序/顺序

要排序的字段, 以及 asc (默认 desc) 。 每个动作接受一组固定的排序字段; 其他的字段中都会忽略而不是错误 。

filters

将过滤器作为对象发送,或将过滤取出作为顶级参数。未知的过滤器会被忽略。

回来的是什么

条目、页面、每页、计数、总数和多页。请继续请求页面,直到有页页、多页为假。

已页、 过滤、 排序列表请求
POST /api/v1.php
Authorization: Bearer opq_your_api_key

{
  "action": "tickets.list",
  "status": "open",
  "priority": "urgent",
  "sort": "created_at",
  "order": "desc",
  "page": 1,
  "per_page": 50
}

错误

每一次失败都返回同样的形状,有稳定 code 和人类阅读的不匹配 error 文本,可重新措辞。

错误响应
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
缺少_ api_ key / 无效_ ape_ ky

没有发送密钥, 或密钥错误或过期。 HTTP 401.

missing_scope

密钥是有效的, 但缺少此动作需要的范围 。 HTTP 403.

仅读出_key/ action_限制

密钥是只读的, 否则此动作不在其允许列表中 。 HTTP 403.

unknown_action

没有这样的动作。 调用当前列表的元动作 。 HTTP 400.

缺少_参数/ 无效_参数

缺少所需的参数, 或不接受一个值。 HTTP 400.

not_found

记录不存在, 或没有在工作空间中此密钥可以看到 。 HTTP 404.

plan_feature_locked

您的计划不包括此动作所属的特征。 实体名称为 feature,该 plan_name 生效和有效 upgrade_url。重试将无济于事;计划必须改变。402.

license_required

安装的许可证不活动, 因此在恢复前不会运行任何动作. HTTP402.

selling_paused

商业特有:商店已售出已关机,因此无法引用或订购. HTTP.400.

rate_limited

此密钥的小时限制被使用 。 HTTP 429.

server_error

我们这边的某件事失败。 如果您需要报告, 请求_ id 识别尝试 。 HTTP 500.

安全重试

如果写出时间, 您无法判断是否降落。 发送一个 idempotency_key 重复一次同一个呼叫,返回原结果而不是两次工作。

作者( I)
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
持续多久

一个键被记住 24 对同一行动的时数和 API 键。

回来的

原作的回放,外加"一分机"_重放:真实的,这样你就可以看出来是回放.

失败情况可重试

只有成功的写法被记住。 如果一个调用失败, 将再次用同样的密钥发送它, 这也是你想要的 。

读取

读取忽略了密钥,重复读取是无害的.

测试不改变任何东西

添加( E) dry_run: true 。您所有的键、 瞄准镜和参数都完全正常检查, 然后在创建或更改任何内容之前停止呼叫 。

干跑:安全核查合格证明和有效载荷
{
  "action": "tickets.update",
  "ticket_id": 4192,
  "status": "closed",
  "dry_run": true
}

{
  "success": true,
  "dry_run": true,
  "would_execute": true,
  "message": "Authorised and validated. No write was performed because dry_run was set."
}
在您正在建设时使用干线运行。 这是确认密钥有正确瞄准镜和有效载荷形状正确, 而不创建测试数据, 您必须清理 。

费率限额

每键限制

可配置的小时限值(每小时)API 密钥( 默认) 1000 设置下每个密钥,API 钥匙

超过时

HTTP 密码 429 带有代码速率限制, 并加一个“ 重试后” 页眉, 告诉您需要等待多少秒。 限制在下一个钟点的顶端重排 。

知道你的立场

每一次响应都带有X-RateLimit-Limint,X-RaterLimite-Resuring和X-RATELimitt-Retet(一个Unix时间戳). 注意剩余并慢下来,然后你跑出而不是等待被拒绝.

告诉 429 从 401

A 类 429 意思是再试一次 401 表示密钥本身是错误的或过期的,所以重试在修复密钥之前不会有所帮助.

美洲野兽前卫队

重复一次失败的尝试IP有效的密钥永远不会绊倒它。

最佳做法

退后,当剩余 变得低, 荣誉重试之后 429 而不是立即重试。

版本和稳定性

当前版本

v1. 每一份答复都载有X-OpsIQ-API- 维生和X...OpsIQ-API- 状态好让你能确认你在跟谁说话

你们怎么被警告呢?

如果一个版本被退役, 回复会获得标准的去化和日落头, 并生成元。 动作报告已去化并日落。 请检查您监控中的那些内容, 您永远不会感到惊讶 。

何等为能起无所变化.

现有的动作名称、参数和错误代码。 新的动作和新的可选字段可能随时被添加, 所以忽略您不承认的字段, 而不是在它们上失败 。

完全整合,开始完成

这就是整个循环:找到工作,读取,行动,确认你做了什么。

整个票务流程过关 API
# 1. Discover what this install offers and what each action needs.
POST /api/v1.php
{"action":"meta.actions"}

# 2. Find the urgent open tickets.
POST /api/v1.php
Authorization: Bearer opq_your_api_key
{"action":"tickets.list","status":"open","priority":"urgent","per_page":25}

# 3. Read one, including its conversation history.
{"action":"tickets.get","ticket_id":4192}

# 4. Reply, safely enough to retry if the network drops.
{"action":"tickets.reply","ticket_id":4192,
 "body":"We have issued the refund.","idempotency_key":"reply-4192-attempt-1"}

# 5. Close it.
{"action":"tickets.update","ticket_id":4192,"status":"closed"}

# 6. Page through anything larger: keep going until has_more is false.
{"action":"tickets.list","page":2,"per_page":50}
💡
以上的一切对对话都一样:对话. list, conversion. get, conference. send and combour. update遵循相同的模式,参数和响应形状.

更多实例

每个都是一个完整的,可操作的 真正的整合而不是一个碎片。

以三种语文通过每张记录页

规则在任何地方都是一样的: 继续要求下一页,直到 has_more 完全是假的,别总猜

Python \ 每张公开票的页面
import requests

API  = "https://your-opsiq-domain.com/api/v1.php"
HEAD = {"Authorization": "Bearer opq_your_api_key"}

def every(action, **params):
    """Yield every record for a list action, one page at a time."""
    page = 1
    while True:
        r = requests.post(API, headers=HEAD,
                          json={"action": action, "page": page, "per_page": 200, **params},
                          timeout=30)
        r.raise_for_status()
        body = r.json()
        if not body.get("success"):
            raise RuntimeError(f"{body.get('code')}: {body.get('error')}")
        yield from body.get("items", [])
        if not body.get("has_more"):
            return
        page += 1

for ticket in every("tickets.list", status="open"):
    print(ticket["ticket_number"], ticket["subject"])
节点. js \ 在每一个线索的页面
const API = "https://your-opsiq-domain.com/api/v1.php";
const HEAD = { Authorization: "Bearer opq_your_api_key", "Content-Type": "application/json" };

async function* every(action, params = {}) {
  for (let page = 1; ; page++) {
    const res  = await fetch(API, {
      method: "POST",
      headers: HEAD,
      body: JSON.stringify({ action, page, per_page: 200, ...params }),
    });
    const body = await res.json();
    if (!body.success) throw new Error(`${body.code}: ${body.error}`);
    yield* body.items ?? [];
    if (!body.has_more) return;
  }
}

for await (const contact of every("crm.contacts.list", { status: "lead" })) {
  console.log(contact.email);
}
PHP – 每张开票的页面
<?php
$api = "https://your-opsiq-domain.com/api/v1.php";

function opsiq(string $action, array $params = []): array {
    global $api;
    $ch = curl_init($api);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            "Authorization: Bearer opq_your_api_key",
            "Content-Type: application/json",
        ],
        CURLOPT_POSTFIELDS => json_encode(["action" => $action] + $params),
        CURLOPT_TIMEOUT    => 30,
    ]);
    $body = json_decode((string)curl_exec($ch), true) ?: [];
    curl_close($ch);
    if (empty($body["success"])) {
        throw new RuntimeException(($body["code"] ?? "error") . ": " . ($body["error"] ?? "unknown"));
    }
    return $body;
}

$page = 1;
do {
    $res = opsiq("tickets.list", ["status" => "open", "page" => $page, "per_page" => 200]);
    foreach ($res["items"] as $t) {
        echo $t["ticket_number"], " ", $t["subject"], PHP_EOL;
    }
    $page++;
} while (!empty($res["has_more"]));

处理每一次失败API能够返回

分会 code,从不考虑 error。这个包装纸是整个合同的一元。

Python · a client that handles every error code correctly
import time, requests

RETRYABLE = {"server_error", "handler_unavailable"}

def call(action, **params):
    for attempt in range(4):
        r = requests.post(API, headers=HEAD, json={"action": action, **params}, timeout=30)
        body = r.json()
        if body.get("success"):
            return body

        code = body.get("code")

        if code == "rate_limited":
            # Honour Retry-After rather than guessing.
            time.sleep(int(r.headers.get("Retry-After", 60)))
            continue

        if code in RETRYABLE:
            time.sleep(2 ** attempt)
            continue

        # Everything below is permanent: retrying cannot fix it.
        if code == "plan_feature_locked":
            raise RuntimeError(f"Plan {body['plan_name']} lacks {body['feature']}: {body['upgrade_url']}")
        if code in ("missing_scope", "read_only_key", "action_restricted"):
            raise RuntimeError(f"This API key cannot do that: {body['error']}")
        if code in ("invalid_api_key", "missing_api_key"):
            raise RuntimeError("The key is wrong or expired; retrying will not help.")
        raise RuntimeError(f"{code}: {body.get('error')} (request_id {body.get('request_id')})")

    raise RuntimeError("Gave up after repeated retries")

一小时内回答一个差分

读取低分,为每张开出一票,从不两次在同一张牌上出场.

关闭不开心的顾客的循环
# 1. Yesterday's detractors.
POST /api/v1.php
{"action":"tickets.csat.list","filters":{"max_rating":2},"days":1,"per_page":100}

# 2. For each one, open a follow-up ticket. The idempotency key is derived
#    from the response id, so re-running the job creates nothing twice.
POST /api/v1.php
{"action":"tickets.open",
 "customer_email":"[email protected]",
 "subject":"Following up on your feedback",
 "body":"We saw your rating and want to put it right.",
 "priority":"high",
 "idempotency_key":"csat-followup-8821"}

# 3. The same shape works for chat: conversations.ratings.list with
#    {"filters":{"max_stars":2},"days":1} returns the comment, what
#    prompted the rating and which agent it is credited to.

引用一个项目,并采取行动 商人的回答

拒绝告诉你要收集什么
POST /api/v1.php
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47","quantity":1}

# The merchant needs more from the customer before it can price this:
{
  "success": false,
  "code": "quote_refused",
  "error": "We need the domain this hosting plan is for.",
  "actionable": true,
  "missing": ["domain"]
}

# Ask the customer for exactly what "missing" names, then quote again.
POST /api/v1.php
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47",
 "fields":{"domain":"example.ng"}}

{
  "success": true,
  "source": "whmcs",
  "quote": {
    "quote_id": "…",
    "totals": { "total": { "amount_minor": 306027, "currency": "NGN" }, "currency": "NGN" },
    "expires_at": "2026-09-05T12:34:56+00:00"
  },
  "ordering": { "creates_order": false, "confirm_via_api": false }
}
⚠️
显示客户 totals.total 数量并不总是乘以单价——旅馆引用一个房间,共三晚——所以你计算出的数字可以不同于商人实际收取的费用。

安全运行的网络存储接收器

验证,去复制,迅速回答,然后做工作。交付重试,这样同一事件可以不止一次到达。

PHP − 一个生产形状的网络钩接收器
<?php
// (verification exactly as in the Webhooks section, omitted here for brevity)

$event    = json_decode($raw, true);
$name     = $_SERVER["HTTP_X_OPSIQ_EVENT"] ?? ($event["event"] ?? "");
$delivery = $_SERVER["HTTP_X_OPSIQ_DELIVERY"] ?? "";

// 1. Already seen this delivery? Say OK and stop — do not redo the work.
if ($db->alreadyProcessed($delivery)) {
    http_response_code(200);
    exit(json_encode(["ok" => true, "duplicate" => true]));
}

// 2. Answer FAST. Anything slow belongs on your own queue: OpsIQ treats a
//    timeout as a failure and will retry the whole delivery.
$db->markProcessed($delivery);
$queue->push($name, $event);

http_response_code(200);
echo json_encode(["ok" => true]);

// 3. Your worker then routes on the event name.
//    conversation.rated        -> alert the team on a 1 or 2 star rating
//    ticket.created            -> mirror into your own helpdesk
//    crm.deal.won              -> post to #sales-alerts
//    commerce.payment.confirmed-> release the order in your fulfilment system

计划和应享权利

每个动作都属于一个产品特性,而你的计划决定你拥有的特性。如果您的计划没有包含特性,则行动答案 402 ——在检查了你的钥匙后,所以一个没有真实性的呼叫者不会了解你的计划,在任何事情被创造之前,那么被封锁的写作永远不会半途而废.

计划内的行动
{
  "success": false,
  "code": "plan_feature_locked",
  "feature": "commerce",
  "plan_locked": true,
  "plan_name": "Growth",
  "upgrade_url": "https://…",
  "request_id": "req_8f2c1a9d4b7e"
}
如何区分权限问题

A 类403这意味着关键词太窄了——用正确的范围重新发布,并且有效。402表示ACCOUNT没有这个功能——没有钥匙可以解锁它,计划必须改变.

不重试 a402

不是瞬间,是浮出水面 upgrade_url 给拥有账户的人而不是再找回

管理范围不能绕过它

范围表示关键发行人的授权内容;计划表示账户购买的内容。402计划缺少的特色。

飞到船前先查清楚

电话 feature 每项行动需要在下文和下文的行动目录中公布。 meta.action,因此可以在建设时检查,而不是在生产中发现.

准确看钥匙位置的最快捷的方法是 meta.me它报告现行计划、它所包含的每一特点,以及每个关键行动都无法说明每项行动的理由。

meta. me——这把钥匙实际上能做什么
POST /api/v1.php
Authorization: Bearer opq_your_api_key

{"action":"meta.me"}

{
  "success": true,
  "key": { "name": "Reporting", "scopes": ["tickets.read"], "permissions_mode": "read_only" },
  "plan": { "name": "Growth", "features": { "ticket_system": true, "commerce": false } },
  "capabilities": {
    "available_action_count": 812,
    "blocked_actions": {
      "commerce.orders.list": "plan_locked:commerce",
      "tickets.reply":        "read_only"
    }
  }
}
当一个集成在两个安装之间表现不同时,先拨打 meta. me。 它在一个请求中回答“为什么这个密钥不能这样做”,而没有任何人打开管理员。

引出一个价钱

commerce.quotes.create 价格是给一个客户的,它没有创造任何东西——没有订单、付款会话、没有持有的股票——所以在客户仍然在决定的时候可以打电话。

引用一个项目
POST /api/v1.php
Authorization: Bearer opq_your_api_key

# Your own Store
{"action":"commerce.quotes.create","source":"store","item_id":"12","quantity":2}

# A connected merchant platform, priced for a known customer
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47",
 "fields":{"domain":"example.ng"},
 "customer":{"connector_customer_id":"1042"}}
商家总胜

对于一个连接的平台来说,总数来自那个商家,而这里永远无法重新计算. 数量并不总是乘以单价——一家酒店引用一房间为三夜——所以显示你得到的总数,而不是你所研究出来的.

拒绝告诉你什么是缺失的

如果商人需要客户的帮助,你就会得到 quote_refused 含1个 missing 列表中指定要收集的字段,并列出商人要显示的文字。

秩序不是一种API调用

引文是指示性的。如果客户在聊天时签了名卡,或者商家自己签了单,就会出现确认。API。答复中是这样说的。 ordering.

当销售暂停时

如果店铺已经关门了, 引用答案 selling_paused 而不是给别人买的货定价

其他终点

几乎你需要的都是一个POST /api/v1.php. 这些是例外, 以及每个例外的目的。

/api/v1/openapi.php · /api/v1/postman.php · /api/docs/

机器合同和人类参考文献,不需要钥匙,你可以先去探索,再有钥匙。

/api/ai_stream.php

服务器发送事件,用于生成实时聊天回复。JSON行动。

/api/writing.php

较旧的AI写结尾。它所做的一切也可用作为 writing.* 行动/api/v1.php,这也是新的工作应该去的地方。

/api/inbox_copilot.php

草稿,重写和分解 用于嵌入在您自己的管理器的票箱。

/api/v1/si/…

网站情报作为小的 RESTAPI——站点,爬行,出问题,关键词,收入 ——供CI管道在部署后想开始爬行并读取结果.

/api/connectors.php?slug=&token=

连接的平台 POST 将自己的网络点击给您。 当您启用连接器时, 将刻出此符号 。

/api/integrations/*.php

集成引擎:运行和确认动作,以及摄取销售、身份和出行事件。它使用自己的钥匙类型,在“E”下发行。APIWebhook 构建器( W).

💡
这些都遵守了与行动相同的计划规则。 您的计划不包括答案 。402这里也是一样的形状

每一个行动,只要它需要的范围

此列表来自运行中的目录, 因此它总是与您所打开的版本相匹配 。 meta.actions 返回与 JSON.

2420 named actions: 804 reads, 1616 writes and 69 scopes. Every registered administrator JSON operation has a stable named action. OpenAPI: /api/v1/openapi.php. Postman: /api/v1/postman.php. Contract quality: declared_dynamic: 606; explicit: 63; route_inferred: 1633; source_inferred: 118.

administration (25)

administration.2fa.disable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Disable

administration.2fa.enable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Enable

administration.2fa.recovery.regenerate

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Recovery Regenerate

administration.2fa.setup

Read. Scope: administration.read, admin. Contract: route_inferred. Admin 2fa Setup

administration.2fa.status

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin 2fa Status

administration.ai.train.from.reply

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Ai Train From Reply

administration.brain.cancel

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Brain Cancel

administration.brain.view

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Brain View

administration.chat.access.check

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Access Check

administration.chat.create.ticket.on.behalf

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Create Ticket On Behalf

administration.chat.draft.ticket.from.thread

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Draft Ticket From Thread

administration.conv.delete

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Delete

administration.conv.get

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Get

administration.conv.list

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv List

administration.conv.new

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv New

administration.conv.save

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Save

administration.notification.prefs.get

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Notification Prefs Get

administration.notification.prefs.save

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notification Prefs Save

administration.notifications.list

Read. Scope: administration.read, admin. Contract: route_inferred. Admin Notifications List

administration.notifications.mark.all.read

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notifications Mark All Read

administration.notifications.mark.read

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Mark Read

administration.notifications.pulse

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Pulse

administration.online.list

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Online List

administration.presence.ping

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Presence Ping

administration.realtime.token

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Realtime Token

分析 (43)

analytics.add.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Add Widget

analytics.analytics.connectors.catalog

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Connectors Catalog

analytics.analytics.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Data

analytics.analytics.export

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export

analytics.analytics.export.csv

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export Csv

analytics.analytics.import

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Import

analytics.analytics.report

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Report

analytics.analytics.segments.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Delete

analytics.analytics.segments.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Segments List

analytics.analytics.segments.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Save

analytics.analytics.status

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Status

analytics.clear.all

Write. Scope: analytics.write, admin. Contract: declared_dynamic. Replay Clear All

analytics.compute

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Compute

analytics.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Create

analytics.create.route.dashboard.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Create

analytics.create.route.report.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Create

analytics.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Delete

analytics.delete.route.dashboard.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Delete

analytics.delete.route.funnels.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Delete

analytics.delete.route.report.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Delete

analytics.events

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Events

analytics.export

Read. Scope: analytics.read, admin. Contract: source_inferred. Analytics Export

analytics.get

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Get

analytics.layout.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Layout Save

analytics.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Ab Test List

analytics.list.route.dashboard.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Dashboard List

analytics.list.route.funnels.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Funnels List

analytics.list.route.report.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Report List

analytics.remove.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Remove Widget

analytics.rename

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Rename

analytics.results

Read. Scope: analytics.read, admin. Contract: route_inferred. Ab Test Results

analytics.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Save

analytics.save.widgets

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Save Widgets

analytics.scheduled.list

Read. Scope: analytics.read, admin. Contract: explicit. List scheduled analytics reports for an operator Required fields: admin_id.

analytics.sections.list

Read. Scope: analytics.read, admin. Contract: explicit. List analytics report sections and date presets

analytics.send.now

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Send Now

analytics.sessions

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Sessions

analytics.step.visitors

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Step Visitors

analytics.timeline

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Timeline

analytics.toggle.shared

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Toggle Shared

analytics.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Update

analytics.update.route.report.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Update

analytics.widget.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Widget Data

automations (6)

automations.actions.list

Read. Scope: automations.read, admin. Contract: explicit. List integration actions

automations.delete

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Delete

automations.list

Read. Scope: automations.read, admin. Contract: route_inferred. Workflow List

automations.runs.list

Read. Scope: automations.read, admin. Contract: explicit. List automation execution history

automations.save

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Save

automations.triggers.list

Read. Scope: automations.read, admin. Contract: explicit. List integration triggers

聊天 (40)

chat.call.start

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Call Start

chat.cobrowse.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Cobrowse Send

chat.feedback

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Feedback

chat.feedback.digest

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Feedback Digest

chat.form.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Delete

chat.form.get

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Form Get

chat.form.list

Read. Scope: chat.read, admin. Contract: declared_dynamic. Chat Form List

chat.form.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Save

chat.form.set.default

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Set Default

chat.meeting.decide

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Decide

chat.meeting.outcome.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Outcome Set

chat.meeting.type.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Delete

chat.meeting.type.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Save

chat.meeting.types.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Types List

chat.meetings.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meetings List

chat.online.admins

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Online Admins

chat.permissions.list

Write. Scope: admin. Contract: route_inferred. Chat Permissions List

chat.permissions.revoke

Write. Scope: admin. Contract: route_inferred. Chat Permissions Revoke

chat.permissions.save

Write. Scope: admin. Contract: route_inferred. Chat Permissions Save

chat.permissions.upload.avatar

Write. Scope: admin. Contract: route_inferred. Chat Permissions Upload Avatar

chat.reaction.toggle

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Reaction Toggle

chat.saved_replies.add

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Add Retry-safe with idempotency_key.

chat.saved_replies.list

Read. Scope: chat.read, admin. Contract: explicit. List workspace and personal saved replies

chat.saved_replies.save

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Save Retry-safe with idempotency_key.

chat.set.persona

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Set Persona

chat.snooze.clear

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Clear

chat.snooze.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Set

chat.transfer.thread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Transfer Thread

chat.transfer.unread

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Transfer Unread

chat.typing.preview

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Typing Preview

chat.whisper.ai.summary

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Ai Summary

chat.whisper.controls

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Controls

chat.whisper.delete.room

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Delete Room

chat.whisper.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper List

chat.whisper.mentions

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Mentions

chat.whisper.rooms

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Rooms

chat.whisper.save.controls

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Save Controls

chat.whisper.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Send

chat.whisper.targets

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Targets

chat.whisper.unread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Unread

商业 (11)

commerce.analytics.snapshot

Read. Scope: commerce.read, analytics.read, admin. Contract: explicit. Read privacy-safe storefront analytics

commerce.orders.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store order with its line items

commerce.orders.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store orders in the bound workspace

commerce.pages.list

Read. Scope: commerce.read, admin. Contract: explicit. List storefront pages and promotional modals

commerce.products.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store product with its variants Required fields: product_id.

commerce.products.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store products in the bound workspace

commerce.quotes.create

Write. Scope: commerce.write, admin. Contract: explicit. Quote an item for a customer (creates nothing) Required fields: source, item_id. Retry-safe with idempotency_key.

commerce.readiness.get

Read. Scope: commerce.read, admin. Contract: explicit. Check demo readiness and merchant go-live readiness

commerce.refunds.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store refund requests in the bound workspace

commerce.storefront.catalog.get

Read. Scope: commerce.read, admin. Contract: explicit. Discover Store themes, designs, blocks and promotional shells

commerce.storefront.get

Read. Scope: commerce.read, admin. Contract: explicit. Get the bound workspace storefront configuration

communications (21)

communications.auth.check

Read. Scope: admin. Contract: route_inferred. Email Auth Check

communications.campaign.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Delete

communications.campaign.save

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Save

communications.campaign.send

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Send

communications.campaigns.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Push Campaigns List

communications.drafts.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Delete

communications.drafts.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Drafts List

communications.drafts.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Save

communications.drafts.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Send

communications.mailboxes.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Delete

communications.mailboxes.list

Read. Scope: communications.read, admin. Contract: route_inferred. Email Mailboxes List

communications.mailboxes.poll

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Poll

communications.mailboxes.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Save

communications.mailboxes.test

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Test

communications.pipe.regen.token

Write. Scope: communications.write, admin. Contract: declared_dynamic. Email Pipe Regen Token

communications.platform.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Platform List

communications.platform.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Platform Send

communications.settings.get

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Settings Get

communications.settings.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Settings Save

communications.settings.test

Read. Scope: communications.read, admin. Contract: route_inferred. Email Settings Test

communications.vapid.generate

Write. Scope: communications.write, admin. Contract: declared_dynamic. Push Vapid Generate

connector_builder (11)

connector_builder.export

Read. Scope: connector_builder.read, admin. Contract: explicit. Export a generated connector Required fields: slug.

connector_builder.generate

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Generate a connector package Required fields: spec.

connector_builder.get

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Load a Builder specification Required fields: slug.

connector_builder.import.curl

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import cURL into Connector Builder

connector_builder.import.openapi

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import OpenAPI into Connector Builder

connector_builder.import.postman

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import Postman into Connector Builder

connector_builder.list

Read. Scope: connector_builder.read, admin. Contract: declared_dynamic. List Builder connectors

connector_builder.profiles

Read. Scope: connector_builder.read, connectors.read, admin. Contract: source_inferred. List Connector Builder profiles and capability contracts

connector_builder.test

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Run Builder conformance tests Required fields: slug.

connector_builder.update

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Update a generated connector Required fields: slug, spec.

connector_builder.validate

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Validate a Builder specification Required fields: spec.

connectors (51)

connectors.action

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Action

connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Start connector backfill Required fields: slug.

connectors.backfill.route.connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Backfill

connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector backfill status Required fields: slug.

connectors.backfill.status.route.connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Backfill Status

connectors.builder.ai.actions

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Actions

connectors.builder.ai.draft

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Draft

connectors.builder.ai.handler

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Handler

connectors.builder.ai.map

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Map

connectors.builder.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Delete

connectors.builder.dry.run

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Dry Run

connectors.builder.generate

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Generate

connectors.builder.import.curl

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Curl

connectors.builder.import.openapi

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Openapi

connectors.builder.import.postman

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Postman

connectors.builder.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder List

connectors.builder.load

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Load

connectors.builder.marketplace.apply

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Apply

connectors.builder.marketplace.link

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Link

connectors.builder.marketplace.status

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Marketplace Status

connectors.builder.marketplace.submit

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Submit

connectors.builder.schema

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Schema

connectors.builder.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test

connectors.builder.test.action

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test Action

connectors.builder.update

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Update

connectors.builder.validate

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Validate

connectors.contacts.import

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Contacts Import

connectors.contract

Read. Scope: connectors.read, connector_builder.read, admin. Contract: source_inferred. Read the canonical connector capability contract

connectors.customers.sync

Write. Scope: connectors.write, admin. Contract: route_inferred. Synchronize connector customers Required fields: slug.

connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Disable a connector Required fields: slug.

connectors.disable.route.connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Disable

connectors.email.account.department

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Department

connectors.email.account.remove

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Email Account Remove

connectors.email.account.routing

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Routing

connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Enable a connector Required fields: slug.

connectors.enable.route.connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Enable

connectors.get

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Get

connectors.get.route.connectors.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Get

connectors.install

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Install

connectors.integrity.scan

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connector Integrity Scan

connectors.list

Read. Scope: connectors.read, admin. Contract: explicit. List installed connectors and capabilities

connectors.list.route.connectors.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors List

connectors.oauth.start

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Oauth Start

connectors.settings.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector settings Required fields: slug.

connectors.settings.save

Write. Scope: connectors.write, admin. Contract: route_inferred. Save connector settings Required fields: slug, settings.

connectors.shared.oauth.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Shared Oauth Delete

connectors.sync.customers

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Sync Customers

connectors.test

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Test

connectors.test.route.connectors.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Test

connectors.uninstall

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Uninstall

connectors.workflow.recipes

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Workflow Recipes

conversations (38)

conversations.ai.draft

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Draft

conversations.ai.rewrite

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Rewrite

conversations.archive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Archive

conversations.assign

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Assign

conversations.assignees

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Assignees

conversations.bulk

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Bulk

conversations.clear

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear

conversations.clear.all

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear All

conversations.customer.tickets

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Customer Tickets

conversations.decline

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Decline

conversations.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete

conversations.delete.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete Last

conversations.edit.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Edit Last

conversations.export

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Export

conversations.forget.visitor

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Forget Visitor

conversations.get

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Get

conversations.history

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat History

conversations.list

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations List

conversations.messages

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Messages

conversations.ratings.list

Read. Scope: conversations.read, admin. Contract: explicit. List rated Client Chat conversations

conversations.resolve

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Resolve

conversations.saved.replies

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Saved Replies

conversations.saved.reply.add

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Add

conversations.saved.reply.ai.generate

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Ai Generate

conversations.saved.reply.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Delete

conversations.saved.reply.save

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Save

conversations.send

Write. Scope: conversations.write, admin. Contract: source_inferred. Conversations Send Retry-safe with idempotency_key.

conversations.send.route.admin.client.chat.send

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Send

conversations.tags.set

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Tags Set

conversations.thread

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Thread

conversations.threads

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Threads

conversations.toggle

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle

conversations.toggle.attachments

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Attachments

conversations.toggle.call.button

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Call Button

conversations.typing

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Typing

conversations.unarchive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Unarchive

conversations.update

Write. Scope: conversations.write, admin. Contract: explicit. Update a conversation status, assignment or subject Retry-safe with idempotency_key.

conversations.upload

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Upload

缩写 (260)

crm.ab.results

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ab Results

crm.access.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Access Set

crm.access_log.list

Read. Scope: admin. Contract: source_inferred. Crm Access Log List

crm.account.health

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health

crm.account.health.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health Board

crm.account.health.refresh

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Account Health Refresh

crm.account.plan.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Get

crm.account.plan.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Save

crm.account.plans.due

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plans Due

crm.account.timeline

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Account Timeline

crm.activities.list

Read. Scope: crm.read. Contract: explicit. List CRM contact activities

crm.activities.record

Write. Scope: crm.write. Contract: explicit. Record a CRM contact activity Required fields: contact_id, activity_type. Retry-safe with idempotency_key.

crm.activity.feed

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Activity Feed

crm.agent.toggle

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Agent Toggle

crm.ai.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Get

crm.ai.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Save

crm.ai.policy.simulate

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Simulate

crm.ai.trace

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ai Trace

crm.approval.decide

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Decide

crm.approval.delegate.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Delegate Set

crm.approval.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Approval List

crm.approval.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Get

crm.approval.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Save

crm.approval.settings

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Settings

crm.approve.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Apply

crm.approve.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Approve List

crm.approve.reject

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Reject

crm.approve.update

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Update

crm.ask

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ask

crm.assign.owner

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Assign Owner

crm.assignment.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Assignment Get

crm.assignment.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Assignment Save

crm.attachment.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Delete

crm.attachment.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Attachment List

crm.attachment.upload

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Upload

crm.autobook.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autobook Meeting

crm.autodeal.mode

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autodeal Mode

crm.book.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Book Meeting

crm.booking.link.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Booking Link Save

crm.booking.links.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Booking Links List

crm.build.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Apply

crm.build.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build Get

crm.build.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build List

crm.build.plan

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Plan

crm.build.rollback

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Rollback

crm.bulk

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Bulk

crm.bundle.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Bundle Set

crm.calendar.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Calendar Status

crm.capture.status

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Capture Status

crm.comm.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Get

crm.comm.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Save

crm.command.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Command Snapshot

crm.companies.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Companies List

crm.company.hierarchy

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Hierarchy

crm.company.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Company Save

crm.company.set.parent

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Company Set Parent

crm.company.suggest.related

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Suggest Related

crm.connectors.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Connectors Catalog

crm.consent_log.list

Read. Scope: crm.read. Contract: source_inferred. Crm Consent Log List

crm.contact.churn

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Contact Churn

crm.contact.draft.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Draft Email

crm.contact.enrich

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Enrich

crm.contact.propose.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Propose Email

crm.contacts.detail

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Detail

crm.contacts.erase

Write. Scope: admin. Contract: source_inferred. Crm Contacts Erase Retry-safe with idempotency_key.

crm.contacts.export

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Export

crm.contacts.import.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Import List

crm.contacts.import.run

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Import Run Retry-safe with idempotency_key.

crm.contacts.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts List

crm.contacts.next_action

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Next Action

crm.contacts.open_chat

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Chat Retry-safe with idempotency_key.

crm.contacts.open_ticket

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Ticket Retry-safe with idempotency_key.

crm.contacts.resync

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Resync Retry-safe with idempotency_key.

crm.contacts.save

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Save Retry-safe with idempotency_key.

crm.contacts.send_email

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Send Email Retry-safe with idempotency_key.

crm.contacts.upsert

Write. Scope: crm.write. Contract: explicit. Crm Contacts Upsert Required fields: email. Retry-safe with idempotency_key.

crm.contract.amend

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Amend

crm.contract.price.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Price Set

crm.contract.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Save

crm.contract.usage

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Usage

crm.contracts.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contracts List

crm.conversation.intel

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Conversation Intel

crm.conversions.goals.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Delete Retry-safe with idempotency_key.

crm.conversions.goals.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions Goals List

crm.conversions.goals.save

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Save Retry-safe with idempotency_key.

crm.conversions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions List

crm.conversions.record

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Record Retry-safe with idempotency_key.

crm.create.video.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Create Video Meeting

crm.customer.auto.sync

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Customer Auto Sync

crm.customer.auto.sync.status

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Auto Sync Status

crm.customer.emails

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Emails

crm.customer.payments

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Payments

crm.data.steward.bulk.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Bulk Propose

crm.data.steward.inbox

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Data Steward Inbox

crm.data.steward.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Propose

crm.deal.advance

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Advance

crm.deal.coach

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Coach

crm.deal.coach.action

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Coach Action

crm.deal.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Get

crm.deal.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Save

crm.deal.splits.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Deal Splits Get

crm.deal.splits.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Splits Set

crm.deals.advance

Write. Scope: crm.write. Contract: explicit. Advance a CRM deal to another stage Required fields: deal_id, stage_id. Retry-safe with idempotency_key.

crm.deals.create

Write. Scope: crm.write. Contract: explicit. Create a CRM deal Required fields: title. Retry-safe with idempotency_key.

crm.deals.detail

Read. Scope: crm.read. Contract: explicit. Get one CRM deal Required fields: deal_id.

crm.deals.list

Read. Scope: crm.read. Contract: explicit. List CRM deals

crm.deals.list.route.crm.deals.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deals List

crm.deals.update

Write. Scope: crm.write. Contract: explicit. Update a CRM deal Required fields: deal_id. Retry-safe with idempotency_key.

crm.detail

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Detail

crm.draft.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Draft Outreach

crm.enrich.account

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Enrich Account

crm.erase

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Erase

crm.events.catalog

Read. Scope: crm.read. Contract: explicit. List subscribable CRM domain events

crm.events.list

Read. Scope: crm.read. Contract: explicit. List durable CRM domain events

crm.export

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Export

crm.export.all

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Export All

crm.field.add

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Add

crm.field.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Get

crm.field.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Save

crm.field.remove

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Remove

crm.fields.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Fields List

crm.forecast.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forecast Board

crm.forecast.snapshot

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Forecast Snapshot

crm.form.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Form Save

crm.forms.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forms List

crm.health.repair.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Repair Catalog

crm.health.smoke

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Health Smoke

crm.health.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Snapshot

crm.home.persona.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Home Persona Set

crm.identity.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Get

crm.identity.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Save

crm.import.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Import List

crm.import.run

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Import Run

crm.inbound.activity

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Activity

crm.inbound.endpoints.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Delete Retry-safe with idempotency_key.

crm.inbound.endpoints.list

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Endpoints List

crm.inbound.endpoints.save

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Save Retry-safe with idempotency_key.

crm.inbound.endpoints.test

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Test Retry-safe with idempotency_key.

crm.leaderboard

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Leaderboard

crm.lifecycle.evaluate

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Evaluate Retry-safe with idempotency_key.

crm.lifecycle.rules.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Delete Retry-safe with idempotency_key.

crm.lifecycle.rules.list

Read. Scope: crm.read. Contract: source_inferred. Crm Lifecycle Rules List

crm.lifecycle.rules.save

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Save Retry-safe with idempotency_key.

crm.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contacts List

crm.mailbox.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Mailbox Status

crm.meeting.book

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Book

crm.meeting.cancel

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Cancel

crm.meeting.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Meeting List

crm.meeting.reschedule.accept

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Accept

crm.meeting.reschedule.reject

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Reject

crm.merge

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Merge

crm.message.send

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Message Send

crm.messaging.provider.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Delete

crm.messaging.provider.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Save

crm.messaging.provider.test

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Messaging Provider Test

crm.messaging.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Messaging Status

crm.next.action

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Next Action

crm.object.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Object Save

crm.objects.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Objects List

crm.offline.pull

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Pull

crm.offline.push

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Push

crm.open.chat

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Open Chat

crm.open.ticket

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Open Ticket

crm.outreach.campaigns.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Delete Retry-safe with idempotency_key.

crm.outreach.campaigns.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Campaigns List

crm.outreach.campaigns.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Save Retry-safe with idempotency_key.

crm.outreach.campaigns.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Send Retry-safe with idempotency_key.

crm.outreach.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Send Retry-safe with idempotency_key.

crm.outreach.templates.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Delete Retry-safe with idempotency_key.

crm.outreach.templates.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates List

crm.outreach.templates.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates Preview

crm.outreach.templates.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Save Retry-safe with idempotency_key.

crm.payments.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Payments Status

crm.pipeline.data

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Pipeline Data

crm.price.resolve

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Price Resolve

crm.pricebook.entry.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Entry Set

crm.pricebook.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Save

crm.pricebooks.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebooks List

crm.privacy_settings.get

Read. Scope: crm.read. Contract: source_inferred. Crm Privacy Settings Get

crm.privacy_settings.save

Write. Scope: admin. Contract: source_inferred. Crm Privacy Settings Save Retry-safe with idempotency_key.

crm.product.archive

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Product Archive

crm.product.revenue

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Product Revenue

crm.product.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Product Save

crm.products.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Products List

crm.propose.meeting

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Propose Meeting

crm.propose.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Propose Outreach

crm.prospecting.dashboard

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Prospecting Dashboard

crm.prospecting.icp.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Icp Save

crm.prospecting.import

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Import

crm.prospecting.research

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Research

crm.prospecting.score

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Score

crm.prospecting.sequence

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Sequence

crm.qualification.checklist.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Qualification Checklist Get

crm.qualification.checklist.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Qualification Checklist Save

crm.quota.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quota Save

crm.quote.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quote Get

crm.quote.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quote Save

crm.quotes.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quotes List

crm.record.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Delete

crm.record.fields.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Fields Get

crm.record.fields.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Fields Save

crm.record.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Get

crm.record.history

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record History

crm.record.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Save

crm.record.share.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Set

crm.record.share.unset

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Unset

crm.record.shares

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Shares

crm.records.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Records List

crm.restore.email.consent

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Restore Email Consent

crm.resync.from.platform

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Resync From Platform

crm.retention.catalog

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Retention Catalog

crm.revert

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Revert

crm.runtime.policy.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Get

crm.runtime.policy.remote.wipe

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Remote Wipe

crm.runtime.policy.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Runtime Policy Save

crm.save

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Save

crm.scoring.rule.ai

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Ai

crm.scoring.rule.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Delete

crm.scoring.rule.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Scoring Rule List

crm.scoring.rule.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Save

crm.segments.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Delete Retry-safe with idempotency_key.

crm.segments.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments List

crm.segments.members

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Members

crm.segments.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Preview

crm.segments.save

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Save Retry-safe with idempotency_key.

crm.segments.suggestions.accept

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Accept Retry-safe with idempotency_key.

crm.segments.suggestions.dismiss

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Dismiss Retry-safe with idempotency_key.

crm.segments.suggestions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Suggestions List

crm.semantic.search

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Semantic Search

crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Send Email

crm.send.email.route.crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Email

crm.send.for.signature

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send For Signature

crm.send.payment.link

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Payment Link

crm.sequence.action

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sequence Action

crm.sequence.runs

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Sequence Runs

crm.setup.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Setup Status

crm.sharing.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Get

crm.sharing.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Save

crm.subject.registry

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Subject Registry

crm.subscriptions.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Subscriptions List

crm.subscriptions.rollup

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Subscriptions Rollup

crm.subscriptions.sync

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Subscriptions Sync

crm.task.create

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Task Create

crm.tasks.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Tasks List

crm.team.parent.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Parent Set

crm.team.rules.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Rules Set

crm.team.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Save

crm.teams.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Teams List

crm.territory.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Territory Set

crm.video.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Video Status

crm.views.delete

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Delete

crm.views.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Views List

crm.views.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Save

crm.webhooks.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Delete Retry-safe with idempotency_key.

crm.webhooks.list

Read. Scope: crm.read. Contract: explicit. List CRM outbound webhook endpoints and recent deliveries

crm.webhooks.save

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Save Retry-safe with idempotency_key.

crm.webhooks.test

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Test Retry-safe with idempotency_key.

crm.workflows.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Delete Retry-safe with idempotency_key.

crm.workflows.list

Read. Scope: crm.read. Contract: source_inferred. Crm Workflows List

crm.workflows.save

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Save Retry-safe with idempotency_key.

客户 (44)

customers.analyze

Write. Scope: customers.write, journey.write, admin. Contract: route_inferred. Analyze a customer journey with AI Required fields: client_id.

customers.behaviour

Read. Scope: admin. Contract: route_inferred. Cdp Behaviour

customers.behaviour.analyze

Write. Scope: admin. Contract: route_inferred. Cdp Behaviour Analyze

customers.chat.embed.backfill

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Embed Backfill

customers.chat.embed.status

Read. Scope: customers.read, admin. Contract: declared_dynamic. Client Chat Embed Status

customers.chat.faq.ai.generate

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Ai Generate

customers.chat.faq.approve.all

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Approve All

customers.chat.faq.delete

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Delete

customers.chat.faq.delete.all

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Delete All

customers.chat.faq.export

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Export

customers.chat.faq.generate

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Generate

customers.chat.faq.import

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Import

customers.chat.faq.list

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq List

customers.chat.faq.save

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Save

customers.chat.faq.set.help

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help

customers.chat.faq.set.help.all

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help All

customers.chat.faq.status

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Status

customers.chat.grant.upload

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Grant Upload

customers.chat.help.set.slug

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Help Set Slug

customers.chat.knowledge.crawl.step

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Crawl Step

customers.chat.knowledge.delete

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Delete

customers.chat.knowledge.delete.all

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete All

customers.chat.knowledge.delete.duplicates

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete Duplicates

customers.chat.knowledge.duplicates

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Duplicates

customers.chat.knowledge.export.json

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Export Json

customers.chat.knowledge.import.json

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Import Json

customers.chat.knowledge.preview

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Preview

customers.chat.knowledge.recrawl

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Recrawl

customers.chat.knowledge.test.url

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Test Url

customers.chat.revoke.upload

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Revoke Upload

customers.chat.upload.agent.avatar

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Agent Avatar

customers.chat.upload.ai.avatar

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Ai Avatar

customers.chat.upload.icon

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Icon

customers.client.analyze

Write. Scope: admin. Contract: route_inferred. Cdp Client Analyze

customers.client.delete

Write. Scope: admin. Contract: route_inferred. Cdp Client Delete

customers.client.export

Write. Scope: admin. Contract: route_inferred. Cdp Client Export

customers.client.journey

Read. Scope: admin. Contract: route_inferred. Cdp Client Journey

customers.client.prepare.outreach

Write. Scope: customers.write, admin. Contract: route_inferred. Cdp Client Prepare Outreach

customers.clients.list

Read. Scope: admin. Contract: route_inferred. Cdp Clients List

customers.detail

Read. Scope: customers.read, admin. Contract: route_inferred. Client Detail

customers.get

Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. Get a customer profile Required fields: client_id.

customers.journey

Read. Scope: customers.read, journey.read, admin. Contract: route_inferred. Get a complete customer journey Required fields: client_id.

customers.list

Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. List known customers

customers.outreach.prepare

Write. Scope: customers.write, crm.write, admin. Contract: route_inferred. Prepare CRM outreach for a customer Required fields: client_id.

departments (1)

departments.list

Read. Scope: departments.read, admin. Contract: source_inferred. Departments List

电子邮件 (2)

email.template.send

Write. Scope: email.write, admin. Contract: source_inferred. Send one governed workspace email template Required fields: template, to. Retry-safe with idempotency_key.

email.templates.list

Read. Scope: email.read, admin. Contract: source_inferred. List email templates available to this workspace

engagement (163)

engagement.ab.autowinner

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Autowinner

engagement.ab.bandit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Bandit

engagement.address.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Address Get

engagement.address.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Address Save

engagement.ai.agent

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Agent

engagement.ai.analyze

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Analyze

engagement.ai.compile.profile

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Compile Profile

engagement.ai.copy

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Copy

engagement.ai.critique

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Critique

engagement.ai.decide

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Decide

engagement.ai.design

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Design

engagement.ai.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Edit

engagement.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Generate

engagement.ai.ideas

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Ideas

engagement.ai.image

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image

engagement.ai.image.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image Edit

engagement.ai.localize

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Localize

engagement.ai.logo

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Logo

engagement.ai.media.jobs

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Media Jobs

engagement.ai.narrative

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Narrative

engagement.ai.responsive

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Responsive

engagement.ai.variants

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Variants

engagement.ai.video.start

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Start

engagement.ai.video.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Status

engagement.approval.decide

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Decide

engagement.approval.request

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Request

engagement.approvals.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Approvals List

engagement.asset.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Delete

engagement.asset.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Upload

engagement.assets.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Assets List

engagement.audience.materialize

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Materialize

engagement.audience.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Save

engagement.audience.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Audience Test

engagement.audit.export

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Audit Export

engagement.autoresponder.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Autoresponder Get

engagement.autoresponder.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Autoresponder Save

engagement.bank.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Delete

engagement.bank.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Bank List

engagement.bank.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Save

engagement.bank.used

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Used

engagement.blackouts.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Blackouts Get

engagement.blackouts.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Blackouts Save

engagement.brand.kit.bootstrap

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Bootstrap

engagement.brand.kit.font.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Font Upload

engagement.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Brand Kit Get

engagement.brand.kit.get.route.survey.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Brand Kit Get

engagement.brand.kit.save

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Brand Kit Save

engagement.brand.kit.save.route.survey.brand.kit.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Brand Kit Save

engagement.campaign.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Archive

engagement.campaign.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Delete

engagement.campaign.duplicate

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Duplicate

engagement.campaign.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Get

engagement.campaign.launch

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Launch

engagement.campaign.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign List

engagement.campaign.pause

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Pause

engagement.campaign.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Preview

engagement.campaign.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Publish

engagement.campaign.rollback

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Rollback

engagement.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Save

engagement.campaign.save.route.survey.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Save

engagement.campaign.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Toggle

engagement.campaign.versions

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Versions

engagement.comment.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Comment Add

engagement.comments.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Add

engagement.comments.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Delete

engagement.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Comments List

engagement.comments.list.route.survey.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Comments List

engagement.comments.resolve

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Resolve

engagement.connectors.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Connectors Catalog

engagement.coupon.providers

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Coupon Providers

engagement.coupons.clear

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Clear

engagement.coupons.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Coupons Stats

engagement.coupons.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Upload

engagement.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Delete

engagement.delete.route.tour.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Delete

engagement.delivery.analytics

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Analytics

engagement.delivery.dashboard

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Dashboard

engagement.deployment.ab.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Promote

engagement.deployment.ab.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Save

engagement.deployment.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Publish

engagement.deployment.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Save

engagement.deployment.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Status

engagement.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Campaign Detail

engagement.digest.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Digest Save

engagement.feed.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Feed Catalog

engagement.feed.items

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Feed Items

engagement.geo.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Geo Preview

engagement.idle.cron.set

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Idle Cron Set

engagement.import.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Create

engagement.import.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Replay

engagement.leads.export

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads Export

engagement.leads.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads List

engagement.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Announcements List

engagement.list.route.tours.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Tours List

engagement.module.set.ai.live

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Ai Live

engagement.module.set.custom.html

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Custom Html

engagement.module.set.enabled

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Enabled

engagement.module.status

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Module Status

engagement.onsite.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Onsite Preview

engagement.pause.all

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Pause All

engagement.presence

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Presence

engagement.preview.share

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Preview Share

engagement.push.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Push Draft

engagement.recipients.issue

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Issue

engagement.recipients.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Recipients List

engagement.recipients.revoke

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Revoke

engagement.response.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Response Detail

engagement.responses.browse

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Responses Browse

engagement.rule.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Delete

engagement.rule.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Save

engagement.rule.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Proactive Rule Stats

engagement.rule.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Rule Test

engagement.rule.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Toggle

engagement.rules.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Proactive Rules List

engagement.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Save

engagement.save.route.tour.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Save

engagement.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Stats

engagement.stats.route.tour.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Tour Stats

engagement.studio.a11y

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio A11y

engagement.studio.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Generate

engagement.studio.ai.insights

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Insights

engagement.studio.ai.target

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Target

engagement.studio.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Archive

engagement.studio.assets

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio Assets

engagement.studio.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Create

engagement.studio.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Delete

engagement.studio.duplicate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Duplicate

engagement.studio.event

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Studio Event

engagement.studio.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Get

engagement.studio.governance

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Governance

engagement.studio.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio List

engagement.studio.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview

engagement.studio.preview.link

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview Link

engagement.studio.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Publish

engagement.studio.rename

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Rename

engagement.studio.revert

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Revert

engagement.studio.save.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Draft

engagement.studio.save.targeting

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Targeting

engagement.studio.set.active

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Active

engagement.studio.set.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Status

engagement.studio.template.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Delete

engagement.studio.template.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Save

engagement.studio.tpl.preview

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Tpl Preview

engagement.studio.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Upload

engagement.studio.webhook

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Webhook

engagement.targeting.simulate

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Targeting Simulate

engagement.template.apply

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Apply

engagement.template.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Template List

engagement.template.save.custom

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Save Custom

engagement.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Toggle

engagement.toggle.route.tour.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Toggle

engagement.trigger.set.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Trigger Set Save

engagement.variant.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Delete

engagement.variant.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Variant List

engagement.variant.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Promote

engagement.variant.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Save

engagement.version.compare

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Version Compare

engagement.version.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Version Get

engagement.version.label

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Version Label

engagement.webhook.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Delete

engagement.webhook.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Replay

engagement.webhook.run

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Run

engagement.webhook.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Save

feedback (8)

feedback.analytics

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Analytics

feedback.detractors

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Detractors

feedback.get

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Get

feedback.ingest

Write. Scope: feedback.write, admin. Contract: explicit. Ingest a feedback record or external review

feedback.list

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback List

feedback.overview

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Overview

feedback.sources.list

Read. Scope: feedback.read, admin. Contract: explicit. List Voice of Customer feedback sources

feedback.update

Write. Scope: feedback.write, admin. Contract: source_inferred. Feedback Update Retry-safe with idempotency_key.

files (1)

files.get

Read. Scope: files.read, admin. Contract: source_inferred. Files Get

小时 (48)

hr.agent.incident.close

Write. Scope: hr.write, admin. Contract: route_inferred. Close an agent incident — the same act that lifts the suspension it caused Required fields: incident_uuid, resolution.

hr.agent.step

Write. Scope: hr.write, admin. Contract: route_inferred. Run one agent step: gate verdict, execution and outcome reported separately Required fields: run_uuid, agent_key, tool_key, jurisdiction, purpose.

hr.agent.step.status

Read. Scope: hr.read, admin. Contract: route_inferred. What actually happened at a step (permitted, executed, proven, failed, compensated) Required fields: run_uuid, seq.

hr.agent.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes an agent run; no further agent steps are accepted Required fields: run_uuid.

hr.agent.tool.grant

Write. Scope: hr.write, admin. Contract: route_inferred. Grant an agent a tool for one jurisdiction and purpose, up to a risk ceiling Required fields: agent_key, tool_key, jurisdiction, max_risk, purpose.

hr.agent.tools

Read. Scope: hr.read, admin. Contract: declared_dynamic. List the registered typed tools an agent may use, and open agent incidents

hr.ai.corrections

Write. Scope: hr.write, admin. Contract: declared_dynamic. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing

hr.ai.quality.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception

hr.booking.slots_reconcile

Write. Scope: hr.write, admin. Contract: declared_dynamic. Release booking slots whose claim never became a booked meeting

hr.connectors.certify

Write. Scope: hr.write, admin. Contract: route_inferred. Certify an HR connector (scope sandbox|production; production demands provider-side proof under dual control) Required fields: connector_class, connector_key, scope, evidence, submitted_by.

hr.connectors.health

Read. Scope: hr.read, admin. Contract: route_inferred. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog Required fields: account_uuid.

hr.decisions.appeals

Write. Scope: hr.write, admin. Contract: route_inferred. File an appeal against an AI decision on a person's behalf; it must be heard by an independent human Required fields: decision_uuid, subject_type, subject_id, grounds.

hr.decisions.explanation

Read. Scope: hr.read, admin. Contract: route_inferred. Plain-language explanation of one AI decision: what was looked at, which policy, and how to appeal Required fields: decision_uuid, audience.

hr.employee.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision seatless employee access and send the invitation Required fields: person_uuid.

hr.employee.restore

Write. Scope: hr.write, admin. Contract: route_inferred. Lift an employee access suspension (written reason required) and provision again Required fields: person_uuid, reason.

hr.experience.metrics

Read. Scope: hr.read, admin. Contract: route_inferred. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys

hr.global.readiness

Read. Scope: hr.read, admin. Contract: declared_dynamic. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage

hr.identity.facets

Read. Scope: hr.read, admin. Contract: route_inferred. List a person's identity facets and open conflicts Required fields: person_uuid.

hr.identity.link

Write. Scope: hr.write, admin. Contract: route_inferred. Link an identity facet to a person Required fields: person_uuid, facet_type, facet_key.

hr.interview.room.connect

Write. Scope: hr.write, admin. Contract: route_inferred. Connect the AI to interview media; refuses unless media really reaches the worker Required fields: media_uuid.

hr.interview.room.consent

Write. Scope: hr.write, admin. Contract: route_inferred. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription) Required fields: media_uuid, purpose, state.

hr.interview.room.pause

Write. Scope: hr.write, admin. Contract: route_inferred. Pause a live interview Required fields: media_uuid.

hr.interview.room.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision an interview room (a place to meet — NOT AI participation) Required fields: session_uuid, transport, accommodation_route.

hr.interview.room.state

Read. Scope: hr.read, admin. Contract: route_inferred. Read an interview room, including whether the AI is actually participating Required fields: media_uuid.

hr.interview.room.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes the interview; the AI cannot speak in it again Required fields: media_uuid, reason.

hr.jurisdiction.capabilities

Read. Scope: hr.read, admin. Contract: route_inferred. What this product may do in one country, per feature, with the law behind each answer Required fields: code.

hr.jurisdiction.change.raise

Write. Scope: hr.write, admin. Contract: route_inferred. Report a change in the law; a high or critical one suspends every lane in that jurisdiction at once Required fields: pack_key, summary, severity.

hr.jurisdiction.coverage

Read. Scope: hr.read, admin. Contract: declared_dynamic. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests

hr.jurisdiction.explain

Read. Scope: hr.read, admin. Contract: route_inferred. Why an action about one person is allowed, reduced or blocked, with the rule and citation Required fields: person_uuid, feature.

hr.jurisdiction.pack.release

Write. Scope: hr.write, admin. Contract: route_inferred. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law Required fields: release_uuid.

hr.learning.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read courses, paths and enrolments

hr.leave.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read leave types and requests

hr.lifecycle.lanes

Read. Scope: hr.read, admin. Contract: declared_dynamic. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it

hr.marketplace.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read HR connector accounts, conflicts and deliveries

hr.org.tree

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read the organisation tree

hr.people.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

hr.people.get

Read. Scope: hr.read, admin. Contract: route_inferred. Get one HR person Required fields: person_uuid.

hr.people.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List HR people

hr.people.update

Write. Scope: hr.write, admin. Contract: route_inferred. Update an HR person Required fields: person_uuid, display_name, primary_email.

hr.postings.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List job postings

hr.readiness.read

Read. Scope: hr.read, admin. Contract: declared_dynamic. Run the HR release readiness report

hr.release.verify

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the four HR release gates (schema, manifest, probe, readiness)

hr.requisitions.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create a requisition Required fields: title, openings, justification.

hr.requisitions.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List requisitions

hr.thread.delete

Write. Scope: hr.write, admin. Contract: route_inferred. Delete a workforce conversation; refused while it is under legal hold Required fields: thread_uuid, reason.

hr.thread.legal_hold

Write. Scope: hr.write, admin. Contract: route_inferred. Place or lift a legal hold on a workforce conversation Required fields: thread_uuid, on, reason.

hr.thread.retention

Write. Scope: hr.write, admin. Contract: route_inferred. Set a conversation's retention class (standard|extended|permanent) Required fields: thread_uuid, retention_class.

hr.threads.retention_sweep

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the conversation retention sweep; legal holds are never swept

intent (6)

intent.clear

Write. Scope: intent.write, admin. Contract: declared_dynamic. Intent Clear

intent.funnel

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read the intent funnel

intent.funnel.aggregate

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel Aggregate

intent.funnel.route.intent.funnel

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel

intent.summary

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read intent summaries

intent.summary.route.intent.summary

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Summary

数据 (6)

kb.faq.delete

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Delete Retry-safe with idempotency_key.

kb.faq.generate

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Generate Retry-safe with idempotency_key.

kb.faq.import

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Import Retry-safe with idempotency_key.

kb.faq.list

Read. Scope: kb.read, read, admin. Contract: source_inferred. Kb Faq List

kb.faq.save

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Save Retry-safe with idempotency_key.

kb.faq.set_status

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Set Status Retry-safe with idempotency_key.

knowledge (78)

knowledge.analytics.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Analytics Get

knowledge.analytics.toggle

Write. Scope: kb.write, admin. Contract: route_inferred. Help Analytics Toggle

knowledge.article.ai.refine

Read. Scope: kb.read, admin. Contract: route_inferred. Help Article Ai Refine

knowledge.article.class.bulk

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Class Bulk

knowledge.article.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Delete

knowledge.article.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Publish

knowledge.article.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Save

knowledge.article.set.category

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Category

knowledge.article.set.public

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Public

knowledge.articles.ai.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ai Generate

knowledge.articles.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Bulk Delete

knowledge.articles.count

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Articles Count

knowledge.articles.get

Read. Scope: kb.read, admin. Contract: explicit. Get one Help Center article Required fields: article_id.

knowledge.articles.ids

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ids

knowledge.articles.list

Read. Scope: kb.read, admin. Contract: route_inferred. Help Articles List

knowledge.articles.set.public.all

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Set Public All

knowledge.categories.ai.merge

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Ai Merge

knowledge.categories.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Categories Bulk Delete

knowledge.categories.list

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Categories List

knowledge.categories.merge.dupes

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Merge Dupes

knowledge.category.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Delete

knowledge.category.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Category Get

knowledge.category.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Save

knowledge.center.article.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Article Image Upload

knowledge.center.favicon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Favicon Upload

knowledge.center.hero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Dark Upload

knowledge.center.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Upload

knowledge.center.logo.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Dark Upload

knowledge.center.logo.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Upload

knowledge.center.og.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Og Image Upload

knowledge.center.settings.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Settings Get

knowledge.center.settings.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Settings Save

knowledge.center.subhero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Dark Upload

knowledge.center.subhero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Upload

knowledge.center.translate.estimate

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Estimate

knowledge.center.translate.run

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Translate Run

knowledge.center.translate.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Translate Status

knowledge.center.translate.stop

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Stop

knowledge.center.widget.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Hero Upload

knowledge.center.widget.icon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Icon Upload

knowledge.comments.deliver.notifications

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Deliver Notifications

knowledge.comments.moderate

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Moderate

knowledge.comments.moderation.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Comments Moderation List

knowledge.import.batches

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Batches

knowledge.import.connectors

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Import Connectors

knowledge.import.csv.preview

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Import Csv Preview

knowledge.import.preview

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Preview

knowledge.import.resync

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Resync

knowledge.import.run

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Run

knowledge.import.undo

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Undo

knowledge.insights.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Insights Generate

knowledge.insights.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Insights Get

knowledge.mark.reviewed

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Mark Reviewed

knowledge.missed.dismiss

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Dismiss

knowledge.missed.draft.article

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Draft Article

knowledge.missed.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Missed List

knowledge.missed.mark.published

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Mark Published

knowledge.missed.refresh

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Missed Refresh

knowledge.organize.descriptions

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Descriptions

knowledge.organize.status

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Status

knowledge.organize.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Organize Step

knowledge.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Publish

knowledge.reformat.revert

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Reformat Revert

knowledge.reformat.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Reformat Status

knowledge.reformat.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Reformat Step

knowledge.review.queue

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Review Queue

knowledge.search.gaps

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Search Gaps

knowledge.set.featured

Write. Scope: kb.write, admin. Contract: route_inferred. Help Set Featured

knowledge.set.visibility

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Set Visibility

knowledge.subdomain.allocate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Allocate

knowledge.subdomain.check

Read. Scope: kb.read, admin. Contract: route_inferred. Help Subdomain Check

knowledge.subdomain.release

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Release

knowledge.taxonomy.organize

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Taxonomy Organize

knowledge.taxonomy.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Taxonomy Status

knowledge.taxonomy.step

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Taxonomy Step

knowledge.widget.categories

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Categories

knowledge.widget.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Widget Publish

knowledge.widget.targets

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Targets

leads (6)

leads.delete

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Delete a lead Required fields: lead_id.

leads.delete.route.lead.delete

Write. Scope: leads.write, admin. Contract: route_inferred. Lead Delete

leads.list

Read. Scope: leads.read, crm.read, admin. Contract: route_inferred. List leads

leads.stats

Read. Scope: leads.read, analytics.read, admin. Contract: declared_dynamic. Get lead statistics

leads.stats.route.leads.stats

Read. Scope: leads.read, admin. Contract: declared_dynamic. Leads Stats

leads.update

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Update a lead Required fields: lead_id, status.

元数据a (4)

meta.action

Read. Scope: none. Contract: explicit. Get one General API action contract Required fields: name.

meta.actions

Read. Scope: none. Contract: explicit. List the complete General API contract

meta.me

Read. Scope: none. Contract: explicit. Describe the authenticated API key and active workspace

meta.scopes

Read. Scope: none. Contract: explicit. List API scopes and the actions protected by each scope

notifications (1)

notifications.list

Read. Scope: notifications.read, admin. Contract: source_inferred. Notifications List

平台 (926)

platform.add.announcement

Write. Scope: platform.write, admin. Contract: declared_dynamic. Add Announcement

platform.add.kb.article

Write. Scope: platform.write, admin. Contract: route_inferred. Add Kb Article

platform.add.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Add Todo Item

platform.ai.action.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Action Lookup

platform.ai.anomaly.detect

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Anomaly Detect

platform.ai.brain.add

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Add

platform.ai.brain.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Delete

platform.ai.brain.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Edit

platform.ai.brain.list

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain List

platform.ai.brain.pin

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Pin

platform.ai.brain.status

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Status

platform.ai.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Chat

platform.ai.confidence.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Confidence Stats

platform.ai.context.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Context Lookup

platform.ai.daily.brief

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief

platform.ai.daily.brief.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Daily Brief Check

platform.ai.daily.brief.dismiss

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Daily Brief Dismiss

platform.ai.daily.brief.fetch

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief Fetch

platform.ai.eval.control.summary

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Control Summary

platform.ai.eval.feedback.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Feedback Queue

platform.ai.eval.kb.gap.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Kb Gap Queue

platform.ai.eval.load

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Load

platform.ai.eval.replay.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Replay History

platform.ai.eval.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Run

platform.ai.eval.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Save

platform.ai.eval.score.answer

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Score Answer

platform.ai.eval.simulate

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Eval Simulate

platform.ai.feedback.analysis

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Analysis

platform.ai.feedback.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Stats

platform.ai.history.archive

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Archive

platform.ai.history.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Clear All

platform.ai.history.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Delete

platform.ai.history.export.csv

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Export Csv

platform.ai.history.get

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Get

platform.ai.history.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History List

platform.ai.history.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Stats

platform.ai.insight.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Clear

platform.ai.insight.history

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight History

platform.ai.insight.report.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Report Delete

platform.ai.insight.report.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight Report Get

platform.ai.instructions.compress

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Compress

platform.ai.instructions.connector.templates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Connector Templates

platform.ai.instructions.example

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Example

platform.ai.instructions.load

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Load

platform.ai.instructions.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Instructions Preview

platform.ai.instructions.reset

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Reset

platform.ai.instructions.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Save

platform.ai.page.insights

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Page Insights

platform.ai.popup.regen

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Popup Regen

platform.ai.quality.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Quality View

platform.ai.reasoning.chain.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Reasoning Chain Get

platform.ai.score.lead

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Score Lead

platform.ai.smart.alerts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Smart Alerts

platform.ai.spoke

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Spoke

platform.ai.triage.accuracy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Triage Accuracy

platform.ai.whmcs.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Whmcs Chat

platform.ai.writing

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Writing

platform.api.keys.catalog

Read. Scope: admin. Contract: declared_dynamic. Api Keys Catalog

platform.api.keys.create

Write. Scope: admin. Contract: route_inferred. Api Keys Create

platform.api.keys.delete

Write. Scope: admin. Contract: route_inferred. Api Keys Delete

platform.api.keys.list

Read. Scope: admin. Contract: declared_dynamic. Api Keys List

platform.api.keys.revoke

Write. Scope: admin. Contract: route_inferred. Api Keys Revoke

platform.api.keys.update

Write. Scope: admin. Contract: route_inferred. Api Keys Update

platform.audit.export

Read. Scope: admin. Contract: route_inferred. Audit Export

platform.blocked

Write. Scope: platform.write, admin. Contract: route_inferred. Blocked

platform.campaigns

Read. Scope: platform.read, admin. Contract: declared_dynamic. Campaigns

platform.chart.browsers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Browsers

platform.chart.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Countries

platform.chart.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Devices

platform.chart.hourly

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Hourly

platform.chart.new.returning

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart New Returning

platform.chart.os

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Os

platform.chart.sources

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Sources

platform.chart.visitors

Read. Scope: platform.read, admin. Contract: route_inferred. Chart Visitors

platform.chatbot.flow.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Delete

platform.chatbot.flow.get

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Get

platform.chatbot.flow.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Save

platform.chatbot.flow.stats

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Stats

platform.chatbot.flow.test.advance

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Advance

platform.chatbot.flow.test.start

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Start

platform.chatbot.flow.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Toggle

platform.chatbot.flows.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chatbot Flows List

platform.chatbot.node.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Delete

platform.chatbot.node.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Save

platform.chatbot.nodes.list

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Nodes List

platform.clear.admin.chat.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Clear Admin Chat History

platform.command.center.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Command Center View

platform.commerce.actf.execute

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Execute

platform.commerce.actf.policy.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Policy Save

platform.commerce.actf.review

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Review

platform.commerce.actf.simulate

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Simulate

platform.commerce.analytics.report

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report

platform.commerce.analytics.report.email

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report Email

platform.commerce.autonomy.issue

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Autonomy Issue

platform.commerce.autonomy.status

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Autonomy Status

platform.commerce.collections.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Collections Delete

platform.commerce.collections.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Collections Save

platform.commerce.customer.block

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Block

platform.commerce.customer.credit.add

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Credit Add

platform.commerce.customer.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Save

platform.commerce.customers.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Customers List

platform.commerce.digital.codes.import

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Codes Import

platform.commerce.digital.config.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Config Save

platform.commerce.digital.file.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Digital File Upload

platform.commerce.fulfilment.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Fulfilment Transition

platform.commerce.intelligence.economics.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Economics Save

platform.commerce.intelligence.market.price.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Price Save

platform.commerce.intelligence.market.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Save

platform.commerce.kit.apply

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Kit Apply

platform.commerce.kit.preview

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Kit Preview

platform.commerce.kits.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Kits List

platform.commerce.launch.readiness

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Launch Readiness

platform.commerce.menu.ai.build

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menu Ai Build

platform.commerce.menus.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menus Save

platform.commerce.merchandising.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Merchandising Save

platform.commerce.midmarket.operations

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Midmarket Operations

platform.commerce.onboarding.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Ai Draft

platform.commerce.onboarding.apply

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Apply

platform.commerce.option.sets.generate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Option Sets Generate

platform.commerce.option.sets.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Option Sets Save

platform.commerce.option.templates

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Option Templates

platform.commerce.order.refundable

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Refundable

platform.commerce.order.ship

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Order Ship

platform.commerce.order.shipments

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Shipments

platform.commerce.orders.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Orders List

platform.commerce.orders.transition

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Orders Transition

platform.commerce.page.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Draft

platform.commerce.page.ai.refine

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Refine

platform.commerce.page.render

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Render

platform.commerce.pages.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Pages Delete

platform.commerce.pages.list

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages List

platform.commerce.pages.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages Save

platform.commerce.price.advice

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Price Advice

platform.commerce.products.ai.copy

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Ai Copy

platform.commerce.products.bulk

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Bulk

platform.commerce.products.catalog.meta

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Catalog Meta

platform.commerce.products.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Delete

platform.commerce.products.duplicate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Duplicate

platform.commerce.products.export.csv

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Export Csv

platform.commerce.products.image.alt.ai

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Image Alt Ai

platform.commerce.products.image.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Delete

platform.commerce.products.image.update

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Image Update

platform.commerce.products.image.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Upload

platform.commerce.products.images.list

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Images List

platform.commerce.products.images.reorder

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Images Reorder

platform.commerce.products.import.csv

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Import Csv

platform.commerce.products.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products List

platform.commerce.products.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Save

platform.commerce.refunds.complete.manual

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Complete Manual

platform.commerce.refunds.request

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Request

platform.commerce.returns.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Returns Transition

platform.commerce.size.charts.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Size Charts Delete

platform.commerce.size.charts.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Size Charts Save

platform.commerce.store.maturity

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Store Maturity

platform.commerce.storefront.brand.import

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Brand Import

platform.commerce.storefront.domain.remove

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Remove

platform.commerce.storefront.domain.set

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Set

platform.commerce.storefront.logo.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Logo Upload

platform.commerce.storefront.page.ai.seo

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Storefront Page Ai Seo

platform.commerce.storefront.slug.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Storefront Slug Save

platform.commerce.supply.chain

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Supply Chain

platform.commerce.variants.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Variants Delete

platform.commerce.variants.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Variants Save

platform.commerce.wallet.topup.refund

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Wallet Topup Refund

platform.commerce.wallet.topups.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Wallet Topups List

platform.complete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Complete Todo Item

platform.consent.log.list

Read. Scope: platform.read, admin. Contract: route_inferred. Consent Log List

platform.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Countries

platform.country.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Country Detail

platform.custom.code.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Approve

platform.custom.code.disable

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Disable

platform.custom.code.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Reject

platform.custom.code.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Rollback

platform.custom.code.status

Read. Scope: platform.read, admin. Contract: route_inferred. Custom Code Status

platform.delete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Delete Todo Item

platform.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Devices

platform.diag.check.resolutions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Check Resolutions

platform.diag.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Dismiss

platform.diag.event.taxonomy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Event Taxonomy

platform.diag.identity.restitch

Write. Scope: admin. Contract: declared_dynamic. Diag Identity Restitch

platform.diag.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Recheck

platform.diag.recheck.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Diag Recheck All

platform.diag.report

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Report

platform.diag.unmute

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Unmute

platform.dismiss.credit.alert

Write. Scope: admin. Contract: route_inferred. Dismiss Credit Alert

platform.domain.knowledge.ai.generate

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Ai Generate

platform.domain.knowledge.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Delete

platform.domain.knowledge.list

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge List

platform.domain.knowledge.save

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Save

platform.domain.knowledge.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Toggle

platform.domain.verify.add

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Add

platform.domain.verify.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Domain Verify List

platform.domain.verify.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Recheck

platform.domain.verify.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Remove

platform.dynamic.action.dispatch

Write. Scope: platform.write, admin. Contract: route_inferred. Dynamic Action Dispatch

platform.events.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Events Clear All

platform.events.list

Read. Scope: platform.read, admin. Contract: route_inferred. Events List

platform.experiment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Delete

platform.experiment.results

Read. Scope: platform.read, admin. Contract: route_inferred. Experiment Results

platform.experiment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Save

platform.experiments.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Experiments Clear All

platform.experiments.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Experiments List

platform.failed.logins.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear All

platform.failed.logins.clear.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear History

platform.failed.logins.journey

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Journey

platform.failed.logins.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins List

platform.failed.logins.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Unblock

platform.feedback.analysis.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Analysis Get

platform.feedback.analysis.run

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Analysis Run

platform.feedback.analytics.all

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics All

platform.feedback.analytics.detractors

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Detractors

platform.feedback.analytics.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Metrics

platform.feedback.analytics.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Overview

platform.feedback.analytics.segments

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Segments

platform.feedback.analytics.sentiment

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Sentiment

platform.feedback.analytics.themes

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Themes

platform.feedback.analytics.trends

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Trends

platform.feedback.assignees.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Assignees List

platform.feedback.event.outbox.drain

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Event Outbox Drain

platform.feedback.exports.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Exports Create

platform.feedback.exports.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Exports Get

platform.feedback.external.review.ingest

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback External Review Ingest

platform.feedback.ingest.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Ingest Create

platform.feedback.items.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Assign

platform.feedback.items.evidence

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Evidence

platform.feedback.items.follow.up.complete

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Complete

platform.feedback.items.follow.up.set

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Set Required fields: bool.

platform.feedback.items.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Get

platform.feedback.items.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items List

platform.feedback.items.mark.read

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Mark Read

platform.feedback.items.notes.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Notes Add

platform.feedback.items.set.priority

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Priority

platform.feedback.items.set.status

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Status

platform.feedback.items.tags.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Add

platform.feedback.items.tags.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Remove

platform.feedback.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback List

platform.feedback.reconciliation

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reconciliation

platform.feedback.reports.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Reports Delete

platform.feedback.reports.email

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Email

platform.feedback.reports.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Get

platform.feedback.reports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports List

platform.feedback.satisfaction.advice.last

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advice Last

platform.feedback.satisfaction.advise

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advise

platform.feedback.satisfaction.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Overview

platform.feedback.sources.health

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources Health

platform.feedback.sources.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources List

platform.feedback.sources.rebuild

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Rebuild

platform.feedback.sources.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Replay

platform.feedback.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Stats

platform.fx.refresh.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Fx Refresh Now

platform.geoip.autodetect

Read. Scope: platform.read, admin. Contract: declared_dynamic. Geoip Autodetect

platform.get.admin.chat.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Admin Chat History

platform.get.ai.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Get Ai Snapshot

platform.get.campaign.groups

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Campaign Groups

platform.get.client.chat.knowledge.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Client Chat Knowledge Overview

platform.get.kb.categories

Read. Scope: platform.read, admin. Contract: route_inferred. Get Kb Categories

platform.get.live.health.snapshot

Read. Scope: platform.read, admin. Contract: route_inferred. Get Live Health Snapshot

platform.get.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Pwa Chat Prefs

platform.get.servers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Servers

platform.get.survey.config

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Survey Config

platform.get.ticket.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Ticket Options

platform.get.ticket.thread

Read. Scope: platform.read, admin. Contract: route_inferred. Get Ticket Thread

platform.get.todo.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Todo List

platform.get.widget.advanced

Read. Scope: platform.read, admin. Contract: route_inferred. Get Widget Advanced

platform.governance.summary

Read. Scope: platform.read, admin. Contract: route_inferred. Governance Summary

platform.groups.create

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Create

platform.groups.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Delete

platform.groups.list

Write. Scope: platform.write, admin. Contract: route_inferred. Groups List

platform.groups.rename

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Rename

platform.groups.set.primary

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Set Primary

platform.hc.preview.mint

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Preview Mint

platform.hc.template.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Apply

platform.hc.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Delete

platform.hc.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Template Preview

platform.hc.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Save

platform.hc.templates.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Templates List

platform.hc.translation.review.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review Get

platform.hc.translation.review.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review List

platform.hc.translation.review.revert

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Revert

platform.hc.translation.review.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Save

platform.heatmap

Read. Scope: platform.read, admin. Contract: route_inferred. Heatmap

platform.hr.access.grant.manual

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Grant Manual

platform.hr.access.policy.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Access Policy List

platform.hr.access.policy.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Policy Set

platform.hr.access.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Request

platform.hr.access.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Revoke

platform.hr.accommodation.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Accommodation List

platform.hr.accommodation.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Accommodation Resolve

platform.hr.agent.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Assign

platform.hr.agent.compensation.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Compensation Retry

platform.hr.agent.compensation.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Agent Compensation Sweep

platform.hr.agent.compensations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Compensations

platform.hr.agent.incident.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Incident Close

platform.hr.agent.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Register

platform.hr.agent.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Step

platform.hr.agent.step.status

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Agent Step Status

platform.hr.agent.tool.auth

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Auth

platform.hr.agent.tool.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Grant

platform.hr.agent.tools

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Tools

platform.hr.ai.act.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Ai Act Build

platform.hr.ai.act.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Export

platform.hr.ai.act.fria.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Fria Record

platform.hr.ai.act.notice.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Notice Publish

platform.hr.ai.act.overseer.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Assign

platform.hr.ai.act.overseer.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Revoke

platform.hr.ai.act.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Overview

platform.hr.ai.metering.export

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Export

platform.hr.ai.metering.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Overview

platform.hr.ai.metering.settings.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Metering Settings Save

platform.hr.ai.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Status

platform.hr.analytics.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Analytics Ask

platform.hr.analytics.snapshot

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Analytics Snapshot

platform.hr.app.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr App Move

platform.hr.appeal.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Appeal List

platform.hr.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Appeal Resolve

platform.hr.application.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Application History

platform.hr.application.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Application List

platform.hr.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Assign

platform.hr.auto.offer.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Auto Offer Run

platform.hr.autonomy.lane.demote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Demote

platform.hr.autonomy.lane.install

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Autonomy Lane Install

platform.hr.autonomy.lane.promote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Promote

platform.hr.autonomy.lane.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Autonomy Lane Review

platform.hr.autonomy.lane.shadow

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Shadow

platform.hr.autonomy.lanes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Lanes

platform.hr.autonomy.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Overview

platform.hr.availability.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Availability Save

platform.hr.band.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Approve

platform.hr.band.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Band List

platform.hr.band.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Save

platform.hr.benchmarks.contribute.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Contribute Now

platform.hr.benchmarks.opt.in

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benchmarks Opt In

platform.hr.benchmarks.opt.out

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Opt Out

platform.hr.benchmarks.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Benchmarks Overview

platform.hr.benefit.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Enroll

platform.hr.benefit.plan.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Plan Save

platform.hr.bias.audit.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Bias Audit List

platform.hr.bias.audit.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Bias Audit Run

platform.hr.booking.link.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Booking Link Save

platform.hr.booking.slots.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Booking Slots Reconcile

platform.hr.breaker.reset

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Breaker Reset

platform.hr.broadcast.audience.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast Audience Options

platform.hr.broadcast.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast List

platform.hr.broadcast.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Broadcast Preview

platform.hr.broadcast.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Broadcast Send

platform.hr.budget.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Budget Set

platform.hr.calibration.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Close

platform.hr.calibration.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Move

platform.hr.calibration.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Open

platform.hr.capabilities.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capabilities Get

platform.hr.capability.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Capability Set

platform.hr.capability.trail

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capability Trail

platform.hr.cards.refresh

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Cards Refresh

platform.hr.case.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Assign

platform.hr.case.attachment.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Attachment Add

platform.hr.case.attachment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Attachment List

platform.hr.case.categories

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case Categories

platform.hr.case.event.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Event Add

platform.hr.case.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Get

platform.hr.case.grant.access

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Grant Access

platform.hr.case.intake.mailbox

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Intake Mailbox

platform.hr.case.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case List

platform.hr.case.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Open

platform.hr.case.route

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Route

platform.hr.case.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Thread

platform.hr.case.tighten

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Tighten

platform.hr.certification.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification Define

platform.hr.certification.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification List

platform.hr.certification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification Record

platform.hr.certification.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification State

platform.hr.certification.types

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Certification Types

platform.hr.check.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Check List

platform.hr.check.manual.result

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Manual Result

platform.hr.check.order

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Order

platform.hr.check.requery

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Requery

platform.hr.check.void

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Void

platform.hr.checkin.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Checkin Record

platform.hr.coach.feedback

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Coach Feedback

platform.hr.coach.me

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Coach Me

platform.hr.coach.receive

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Coach Receive

platform.hr.comp.change.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Approve

platform.hr.comp.change.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Request

platform.hr.compliance.build

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Compliance Build

platform.hr.compliance.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Compliance List

platform.hr.connector.cert.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Revoke

platform.hr.connector.cert.submissions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Connector Cert Submissions

platform.hr.connector.cert.submit

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Submit

platform.hr.connector.certify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Certify

platform.hr.connector.health

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Health

platform.hr.connector.options

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Options

platform.hr.connector.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Revoke

platform.hr.contract.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Contract List

platform.hr.copilot.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Apply

platform.hr.copilot.plan

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Copilot Plan

platform.hr.copilot.recipes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Copilot Recipes

platform.hr.copilot.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Reject

platform.hr.correction.dataset.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Correction Dataset Build

platform.hr.correction.datasets

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Correction Datasets

platform.hr.correction.privacy.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Correction Privacy Review

platform.hr.course.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Enroll

platform.hr.course.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Save

platform.hr.course.skills.tag

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Skills Tag

platform.hr.decision.appeal.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Assign

platform.hr.decision.appeal.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal File

platform.hr.decision.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Resolve

platform.hr.decision.appeals.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decision Appeals List

platform.hr.decision.explanation

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Decision Explanation

platform.hr.decisions.recent

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decisions Recent

platform.hr.directory.visibility.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Directory Visibility Get

platform.hr.directory.visibility.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Directory Visibility Set

platform.hr.discipline.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Decide

platform.hr.discipline.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Propose

platform.hr.document.access.log

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document Access Log

platform.hr.document.deletion.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Deletion Request

platform.hr.document.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Hold

platform.hr.document.intake

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Intake

platform.hr.document.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document List

platform.hr.document.requirement.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Add

platform.hr.document.requirement.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Remove

platform.hr.document.review.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Review Approve

platform.hr.document.reviews

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Document Reviews

platform.hr.dsr.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Dsr List

platform.hr.dsr.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Dsr Transition

platform.hr.email.intake.log

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Email Intake Log

platform.hr.employee.access.events

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Employee Access Events

platform.hr.employee.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Provision

platform.hr.employee.restore

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Restore

platform.hr.employee.suspend

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Suspend

platform.hr.employment.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment Activate

platform.hr.employment.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment End

platform.hr.enterprise.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Enterprise Approve

platform.hr.equipment.delivered

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Delivered

platform.hr.equipment.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Request

platform.hr.equipment.returned

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Returned

platform.hr.escrow.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Escrow Resolve

platform.hr.evidence.a11y.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence A11y Record

platform.hr.evidence.attest

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Attest

platform.hr.evidence.dr.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Dr Record

platform.hr.evidence.ledgers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Evidence Ledgers

platform.hr.evidence.load.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Load Record

platform.hr.evidence.owner.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Owner Assign

platform.hr.expense.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Confirm

platform.hr.expense.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Decide

platform.hr.expense.handoff

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Handoff

platform.hr.expense.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Expense Overview

platform.hr.expense.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Policy Save

platform.hr.experience.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Experience Metrics

platform.hr.expiry.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Expiry Run

platform.hr.fairness.cohort.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Cohort Define

platform.hr.fairness.cohorts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Fairness Cohorts

platform.hr.fairness.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Evaluate

platform.hr.faq.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Delete

platform.hr.faq.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Draft

platform.hr.faq.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Faq List

platform.hr.faq.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Save

platform.hr.faq.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq State

platform.hr.feedback.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Feedback List

platform.hr.feedback.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Feedback Record

platform.hr.flag.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Flag Set

platform.hr.flags.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Flags Get

platform.hr.frontline.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Frontline Overview

platform.hr.gig.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Decide

platform.hr.gig.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Post

platform.hr.global.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Global Readiness

platform.hr.goal.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Create

platform.hr.goal.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Draft

platform.hr.goal.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Update

platform.hr.grievance.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance File

platform.hr.grievance.outcome

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance Outcome

platform.hr.headcount.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Approve

platform.hr.headcount.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Draft

platform.hr.headcount.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Headcount List

platform.hr.hire

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hire

platform.hr.hiring.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hiring Decide

platform.hr.holiday.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Holiday Save

platform.hr.identity.admin.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Admin Options

platform.hr.identity.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Conflict Resolve

platform.hr.identity.coverage.plan

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Coverage Plan

platform.hr.identity.facets

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Identity Facets

platform.hr.identity.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity History

platform.hr.identity.link

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Link

platform.hr.identity.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Revoke

platform.hr.identity.verification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Verification Record

platform.hr.incident.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Incident List

platform.hr.incident.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Open

platform.hr.incident.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Step

platform.hr.interview.recording.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Start

platform.hr.interview.recording.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Upload

platform.hr.interview.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Review

platform.hr.interview.room.answer

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Answer

platform.hr.interview.room.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Ask

platform.hr.interview.room.connect

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Connect

platform.hr.interview.room.consent

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Consent

platform.hr.interview.room.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room End

platform.hr.interview.room.leave

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Leave

platform.hr.interview.room.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Interview Room List

platform.hr.interview.room.observe

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Observe

platform.hr.interview.room.pause

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Pause

platform.hr.interview.room.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Provision

platform.hr.interview.room.reconnect

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Reconnect

platform.hr.interview.room.resume

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Resume

platform.hr.interview.room.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room State

platform.hr.interview.room.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Takeover

platform.hr.interview.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Schedule

platform.hr.interview.transcript.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Transcript Correct

platform.hr.investigation.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Close

platform.hr.investigation.finding

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Finding

platform.hr.investigation.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Hold

platform.hr.investigation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Open

platform.hr.investigation.triage

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Investigation Triage

platform.hr.iplan.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Approve

platform.hr.iplan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Create

platform.hr.iplan.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Iplan List

platform.hr.iscore.human

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Human

platform.hr.iscore.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Run

platform.hr.isession.attach.meeting

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Attach Meeting

platform.hr.isession.control

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Control

platform.hr.isession.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Isession List

platform.hr.isession.liveness

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Isession Liveness

platform.hr.isession.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Schedule

platform.hr.job.arch.analyse

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Job Arch Analyse

platform.hr.job.arch.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Apply

platform.hr.job.arch.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Approve

platform.hr.job.arch.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Job Arch Overview

platform.hr.job.arch.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Propose

platform.hr.job.arch.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Reject

platform.hr.job.family.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Family Save

platform.hr.job.level.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Level Save

platform.hr.job.profile.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Profile Save

platform.hr.job.version.draft.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Draft Ai

platform.hr.job.version.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Publish

platform.hr.job.version.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Save

platform.hr.job.versions

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Job Versions

platform.hr.jurisdiction.capabilities

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Capabilities

platform.hr.jurisdiction.case.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Run

platform.hr.jurisdiction.case.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Save

platform.hr.jurisdiction.change.assess

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Assess

platform.hr.jurisdiction.change.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Close

platform.hr.jurisdiction.change.raise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Raise

platform.hr.jurisdiction.coverage

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Coverage

platform.hr.jurisdiction.explain

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Explain

platform.hr.jurisdiction.overlay.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Overlay List

platform.hr.jurisdiction.overlay.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Overlay Save

platform.hr.jurisdiction.pack.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Draft

platform.hr.jurisdiction.pack.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Release

platform.hr.jurisdiction.pack.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Withdraw

platform.hr.jurisdiction.release.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Release List

platform.hr.jurisdiction.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Rule Save

platform.hr.jurisdiction.source.declare

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Source Declare

platform.hr.jurisdiction.transfer.declare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Transfer Declare

platform.hr.kill.flip

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Flip

platform.hr.kill.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Toggle

platform.hr.kiosk.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Register

platform.hr.kiosk.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Revoke

platform.hr.knowledge.pack.install

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Install

platform.hr.knowledge.pack.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Remove

platform.hr.knowledge.packs

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Knowledge Packs

platform.hr.leadership.score

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leadership Score

platform.hr.learning.assign.mandatory

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Learning Assign Mandatory

platform.hr.learning.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Learning Overview

platform.hr.leave.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Decide

platform.hr.leave.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leave Overview

platform.hr.leave.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Policy Save

platform.hr.leave.type.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Type Save

platform.hr.letter.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Letter Issue

platform.hr.letter.kinds

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Letter Kinds

platform.hr.letter.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Letter Preview

platform.hr.listening.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Close

platform.hr.listening.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Listening Overview

platform.hr.listening.run.due

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Listening Run Due

platform.hr.listening.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule Save

platform.hr.listening.schedule.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule State

platform.hr.loop.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Approve

platform.hr.loop.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Correct

platform.hr.loop.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Evaluate

platform.hr.loop.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Loop Overview

platform.hr.loop.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Propose

platform.hr.loop.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Release

platform.hr.loop.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Rollback

platform.hr.loop.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Snapshot

platform.hr.marketplace.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Marketplace Overview

platform.hr.meeting.book

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Book

platform.hr.meeting.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Cancel

platform.hr.meeting.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Propose

platform.hr.meeting.reschedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Reschedule

platform.hr.meetings.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Meetings Overview

platform.hr.meetings.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Meetings Reconcile

platform.hr.mentor.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Mentor Propose

platform.hr.module.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Module Toggle

platform.hr.new.hire.checkin.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr New Hire Checkin State

platform.hr.offer.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Approve

platform.hr.offer.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Draft

platform.hr.offer.esign.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Esign Confirm

platform.hr.offer.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Offer List

platform.hr.offer.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Send

platform.hr.offer.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Withdraw

platform.hr.onboarding.checkins.book

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Checkins Book

platform.hr.onboarding.draft.tasks

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Draft Tasks

platform.hr.onboarding.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Onboarding Overview

platform.hr.onboarding.plan.buddy

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Buddy

platform.hr.onboarding.plan.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Close

platform.hr.onboarding.plan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Create

platform.hr.onboarding.task.block

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Block

platform.hr.onboarding.task.done

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Done

platform.hr.onboarding.task.skip

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Task Skip

platform.hr.onboarding.task.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Unblock

platform.hr.onboarding.task.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Verify

platform.hr.onboarding.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Template Save

platform.hr.one.on.one.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr One On One List

platform.hr.one.on.one.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr One On One Record

platform.hr.opportunity.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Decide

platform.hr.opportunity.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Post

platform.hr.org.chart

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Chart

platform.hr.org.legal.entities

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Legal Entities

platform.hr.org.legal.entity.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Legal Entity Create

platform.hr.org.location.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Location Create

platform.hr.org.locations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Locations

platform.hr.org.map.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Org Map Overview

platform.hr.org.map.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Remove

platform.hr.org.map.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Save

platform.hr.org.tree

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Tree

platform.hr.org.unit.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Unit Create

platform.hr.org.unit.move

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Org Unit Move

platform.hr.override.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Override Record

platform.hr.overtime.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Overtime Decide

platform.hr.path.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Enroll

platform.hr.path.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Save

platform.hr.pay.equity.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Pay Equity Overview

platform.hr.pay.gap.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pay Gap Evaluate

platform.hr.payroll.import

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Import

platform.hr.payroll.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Overview

platform.hr.payroll.provider.exceptions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Provider Exceptions

platform.hr.payroll.reconcile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Reconcile

platform.hr.payslips.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payslips Issue

platform.hr.people.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr People List

platform.hr.perf.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Perf Overview

platform.hr.person.create

Write. Scope: platform.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

platform.hr.person.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Get

platform.hr.person.identifier.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Identifier Add

platform.hr.person.identifier.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifier Read

platform.hr.person.identifiers

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifiers

platform.hr.person.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Update

platform.hr.pilot.outcome.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pilot Outcome Record

platform.hr.pipeline

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pipeline

platform.hr.policy.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Activate

platform.hr.policy.compile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Compile

platform.hr.pool.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Create

platform.hr.pool.member.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Add

platform.hr.pool.member.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Remove

platform.hr.pool.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pool Overview

platform.hr.portal.address

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Portal Address

platform.hr.portal.slug.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Portal Slug Save

platform.hr.position.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Assign

platform.hr.position.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Create

platform.hr.position.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Position Overview

platform.hr.position.profile.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Profile Set

platform.hr.position.reports.to

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Reports To

platform.hr.position.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position State

platform.hr.position.vacate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Vacate

platform.hr.posting.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Close

platform.hr.posting.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Create

platform.hr.posting.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Posting List

platform.hr.posting.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Publish

platform.hr.probation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Open

platform.hr.probation.review

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Review

platform.hr.profile.address.format

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Address Format

platform.hr.profile.address.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Address Write

platform.hr.profile.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Decide

platform.hr.profile.ownership.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Ownership Get

platform.hr.profile.ownership.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Ownership Set

platform.hr.profile.pending

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Pending

platform.hr.profile.photo.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Clear

platform.hr.profile.photo.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Set

platform.hr.profile.reveal

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Reveal

platform.hr.profile.section.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section End

platform.hr.profile.section.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section Write

platform.hr.profile.sections

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Sections

platform.hr.pulse.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Close

platform.hr.pulse.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Issue

platform.hr.pulse.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pulse List

platform.hr.pulse.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Open

platform.hr.pulse.results

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Pulse Results

platform.hr.quality.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Overview

platform.hr.quality.sample.draw

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Quality Sample Draw

platform.hr.quality.samples

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Samples

platform.hr.quality.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Quality Verdict

platform.hr.queue.agent.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Add

platform.hr.queue.agent.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Remove

platform.hr.queue.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Save

platform.hr.readiness.report

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Readiness Report

platform.hr.recognise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Recognise

platform.hr.relations.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Relations Overview

platform.hr.release.gates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Release Gates

platform.hr.release.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Release Verify

platform.hr.req.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Create

platform.hr.req.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Req List

platform.hr.req.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Reject

platform.hr.req.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Transition

platform.hr.review.cycle.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Cycle Open

platform.hr.review.include

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Include

platform.hr.review.respond

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Respond

platform.hr.review.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Template Save

platform.hr.rubric.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Approve

platform.hr.rubric.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Create

platform.hr.rubric.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Rubric List

platform.hr.run.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Replay

platform.hr.run.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Start

platform.hr.run.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Step

platform.hr.run.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Takeover

platform.hr.scenario.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Scenario Run

platform.hr.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Schedule Save

platform.hr.screening.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Correct

platform.hr.screening.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Screening List

platform.hr.screening.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Screening Review

platform.hr.screening.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Run

platform.hr.screening.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Verify

platform.hr.security.assurance.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Security Assurance Record

platform.hr.service.item.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Service Item Save

platform.hr.servicedesk.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Servicedesk Overview

platform.hr.shadow.compare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shadow Compare

platform.hr.shift.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Add

platform.hr.shift.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Assign

platform.hr.signature.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Cancel

platform.hr.signature.confirm

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature Confirm

platform.hr.signature.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature List

platform.hr.signature.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Request

platform.hr.signin.design.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Signin Design Get

platform.hr.signin.design.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Signin Design Save

platform.hr.skill.challenge.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Skill Challenge Resolve

platform.hr.skills.infer.sweep

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Sweep

platform.hr.skills.infer.text

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Text

platform.hr.skills.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Skills Overview

platform.hr.skills.taxonomy.adopt

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Skills Taxonomy Adopt

platform.hr.status

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Status

platform.hr.succession.nominate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Nominate

platform.hr.succession.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Open

platform.hr.succession.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Succession Overview

platform.hr.swap.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Approve

platform.hr.swap.decline

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Decline

platform.hr.sync.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Sync Conflict Resolve

platform.hr.talent.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Talent Overview

platform.hr.thread.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Delete

platform.hr.thread.dm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Dm

platform.hr.thread.legal.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Legal Hold

platform.hr.thread.outreach

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Outreach

platform.hr.thread.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Post

platform.hr.thread.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Read

platform.hr.thread.retention

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Retention

platform.hr.thread.search

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Search

platform.hr.threads.inbox

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Threads Inbox

platform.hr.threads.retention.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Threads Retention Sweep

platform.hr.time.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Time Decide

platform.hr.time.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Time Overview

platform.hr.title.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Title History

platform.hr.title.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Title Record

platform.hr.training.requirement.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Training Requirement Save

platform.hr.truth.register

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Truth Register

platform.hr.turnover.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Turnover Run

platform.hr.verifier.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Verifier Verdict

platform.hr.wb.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Grant

platform.hr.wb.identity

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Identity

platform.hr.wb.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Wb List

platform.hr.wb.read

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Read

platform.hr.wb.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb State

platform.hr.workforce.dashboard

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Workforce Dashboard

platform.inbound.activity.feed

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Activity Feed

platform.inbound.endpoints.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Delete

platform.inbound.endpoints.list

Write. Scope: admin. Contract: route_inferred. Inbound Endpoints List

platform.inbound.endpoints.save

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Save

platform.inbound.endpoints.test

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Test

platform.interrupted

Read. Scope: platform.read, admin. Contract: declared_dynamic. Interrupted

platform.ip.classify

Read. Scope: platform.read, admin. Contract: route_inferred. Ip Classify

platform.js.errors.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Js Errors Clear All

platform.js.errors.list

Read. Scope: platform.read, admin. Contract: route_inferred. Js Errors List

platform.js.issue.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Assign

platform.js.issue.update

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Update

platform.js.sourcemap.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Delete

platform.js.sourcemap.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Upload

platform.js.sourcemaps.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Js Sourcemaps List

platform.leads

Read. Scope: platform.read, admin. Contract: route_inferred. Leads

platform.license.delete

Write. Scope: admin. Contract: declared_dynamic. License Delete

platform.license.diagnostics

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Diagnostics

platform.license.force.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Force Check

platform.license.preflight

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Preflight

platform.license.save

Write. Scope: admin. Contract: route_inferred. License Save

platform.license.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Status

platform.license.verify.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. License Verify Now

platform.lifecycle.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Evaluate

platform.lifecycle.rule.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Delete

platform.lifecycle.rule.list

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Rule List

platform.lifecycle.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Save

platform.list.assignable.sites

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Assignable Sites

platform.list.network.issues

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Network Issues

platform.lookup.client.full

Read. Scope: platform.read, admin. Contract: route_inferred. Lookup Client Full

platform.mark.feedback.read

Write. Scope: platform.write, admin. Contract: route_inferred. Mark Feedback Read

platform.marketplace.local.install

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Install

platform.marketplace.local.uninstall

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Uninstall

platform.marketplace.session.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Marketplace Session Get

platform.marketplace.session.set

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Session Set

platform.media.ready

Read. Scope: platform.read, admin. Contract: route_inferred. Media Ready

platform.message.contact.locale

Write. Scope: platform.write, admin. Contract: route_inferred. Message Contact Locale

platform.message.outbound.convert

Write. Scope: platform.write, admin. Contract: route_inferred. Message Outbound Convert

platform.message.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translate

platform.message.translation.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Delete

platform.message.translation.save

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Save

platform.meta.channels.disconnect

Write. Scope: platform.write, admin. Contract: declared_dynamic. Meta Channels Disconnect

platform.meta.channels.switch.page

Write. Scope: platform.write, admin. Contract: route_inferred. Meta Channels Switch Page

platform.observe

Read. Scope: platform.read, admin. Contract: declared_dynamic. Observe

platform.onboarding.action

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Action

platform.onboarding.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Readiness

platform.open.network.issue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Open Network Issue

platform.open.ticket

Read. Scope: platform.read, admin. Contract: route_inferred. Open Ticket

platform.operator.text.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Operator Text Translate

platform.opsiq.backup.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Download a full backup in one request (retired)

platform.opsiq.backup.import

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import

platform.opsiq.backup.import.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import Start

platform.opsiq.backup.job.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Start

platform.opsiq.backup.job.status

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Status

platform.outreach.campaign.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Delete

platform.outreach.campaign.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Campaign List

platform.outreach.campaign.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Save

platform.outreach.campaign.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Send

platform.outreach.compose.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Compose Send

platform.outreach.draft.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Delete

platform.outreach.draft.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Draft List

platform.outreach.draft.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Save

platform.outreach.messages.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Messages Delete

platform.outreach.replies.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Replies List

platform.outreach.reply.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Ai

platform.outreach.reply.mark

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Mark

platform.outreach.reply.pref

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Pref

platform.outreach.reply.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Send

platform.outreach.reply.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Thread

platform.outreach.send.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Send Detail

platform.outreach.send.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Send Retry

platform.outreach.sends.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Sends List

platform.outreach.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Delete

platform.outreach.template.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template List

platform.outreach.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template Preview

platform.outreach.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Save

platform.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview

platform.overview.hub.view

Read. Scope: platform.read, admin. Contract: route_inferred. Overview Hub View

platform.overview.intelligence.graph

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview Intelligence Graph

platform.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Pages

platform.paths.data

Read. Scope: platform.read, admin. Contract: route_inferred. Paths Data

platform.pause

Read. Scope: platform.read, admin. Contract: declared_dynamic. Pause

platform.profile.change.password

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Change Password

platform.profile.get

Read. Scope: platform.read, admin. Contract: route_inferred. Profile Get

platform.profile.reward.claim

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim

platform.profile.reward.claim.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim Cancel

platform.profile.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Save

platform.profile.session.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Session Revoke

platform.profile.sessions.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Profile Sessions List

platform.profile.sessions.revoke.others

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Sessions Revoke Others

platform.profile.team.dispute.file

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Team Dispute File

platform.purge

Write. Scope: admin. Contract: route_inferred. Purge

platform.purge.all

Write. Scope: admin. Contract: route_inferred. Purge All

platform.realtime

Read. Scope: platform.read, admin. Contract: route_inferred. Realtime

platform.realtime.test

Write. Scope: platform.write, admin. Contract: route_inferred. Realtime Test

platform.resume

Read. Scope: platform.read, admin. Contract: declared_dynamic. Resume

platform.retention.data

Read. Scope: platform.read, admin. Contract: route_inferred. Retention Data

platform.routes.list

Read. Scope: admin. Contract: source_inferred. List every registered OpsIQ operation

platform.routes.read

Read. Scope: admin. Contract: explicit. Execute a registered read operation Required fields: route.

platform.routes.write

Write. Scope: admin. Contract: explicit. Execute a registered write operation Required fields: route, idempotency_key. Retry-safe with idempotency_key.

platform.run.ai.analysis

Write. Scope: platform.write, admin. Contract: route_inferred. Run Ai Analysis

platform.save.admin.chat.history

Write. Scope: platform.write, admin. Contract: route_inferred. Save Admin Chat History

platform.save.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Pwa Chat Prefs

platform.save.survey.config

Write. Scope: platform.write, admin. Contract: route_inferred. Save Survey Config

platform.save.widget.advanced

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Widget Advanced

platform.scim.token.issue

Read. Scope: platform.read, admin. Contract: route_inferred. Scim Token Issue

platform.scim.token.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Scim Token List

platform.scim.token.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Scim Token Revoke

platform.segment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Delete

platform.segment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment List

platform.segment.members

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Members

platform.segment.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Preview

platform.segment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Save

platform.segment.suggestion.accept

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Accept

platform.segment.suggestion.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Dismiss

platform.segment.suggestion.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Suggestion List

platform.send.campaign

Write. Scope: platform.write, admin. Contract: route_inferred. Send Campaign

platform.send.client.email

Write. Scope: platform.write, admin. Contract: route_inferred. Send Client Email

platform.send.ticket.reply

Write. Scope: platform.write, admin. Contract: route_inferred. Send Ticket Reply

platform.service.studio.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Service Studio Get

platform.set.active.site

Write. Scope: platform.write, admin. Contract: route_inferred. Set Active Site

platform.silence

Read. Scope: platform.read, admin. Contract: declared_dynamic. Silence

platform.site.set.group

Write. Scope: platform.write, admin. Contract: route_inferred. Site Set Group

platform.sites.add

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Add

platform.sites.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Edit

platform.sites.list

Write. Scope: platform.write, admin. Contract: route_inferred. Sites List

platform.sites.picker

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Picker

platform.sites.regenerate.secret

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Regenerate Secret

platform.sites.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Remove

platform.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Stats

platform.stepup.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Stepup Verify

platform.submit.agent.ai.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Agent Ai Feedback

platform.submit.triage.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Triage Feedback

platform.takeover

Read. Scope: platform.read, admin. Contract: declared_dynamic. Takeover

platform.terminate

Read. Scope: platform.read, admin. Contract: route_inferred. Terminate

platform.test.geoip

Read. Scope: platform.read, admin. Contract: route_inferred. Test Geoip

platform.top.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Top Pages

platform.train.client.chat.knowledge

Write. Scope: platform.write, admin. Contract: route_inferred. Train Client Chat Knowledge

platform.triggers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Triggers

platform.trust.evidence.report

Write. Scope: platform.write, admin. Contract: declared_dynamic. Trust Evidence Report

platform.turn.pool.add

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Add

platform.turn.pool.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Turn Pool List

platform.turn.pool.pick.test

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Pick Test

platform.turn.pool.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Remove

platform.turn.pool.update

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Update

platform.update.lead.status

Write. Scope: platform.write, admin. Contract: route_inferred. Update Lead Status

platform.wa.embedded.signup.exchange

Write. Scope: platform.write, admin. Contract: route_inferred. Wa Embedded Signup Exchange

platform.warehouse.export.run

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Export Run

platform.warehouse.exports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Exports List

platform.webhook.deliveries.list

Read. Scope: platform.read, admin. Contract: route_inferred. Webhook Deliveries List

platform.webhook.endpoint.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Delete

platform.webhook.endpoint.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Webhook Endpoint List

platform.webhook.endpoint.save

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Save

platform.webhook.endpoint.test

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Test

platform.webhook.redeliver

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Redeliver

platform.weekly.digest.view

Read. Scope: platform.read, admin. Contract: route_inferred. Weekly Digest View

platform.whmcs.op.dispatch

Read. Scope: platform.read, admin. Contract: declared_dynamic. Whmcs Op Dispatch

platform.workspace.custom.domain.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Remove

platform.workspace.custom.domain.set

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Set

platform.writing.json.knowledge.clear

Write. Scope: platform.write, admin. Contract: declared_dynamic. Writing Json Knowledge Clear

platform.writing.json.knowledge.count

Read. Scope: platform.read, admin. Contract: declared_dynamic. Writing Json Knowledge Count

platform.writing.json.knowledge.import

Write. Scope: platform.write, admin. Contract: route_inferred. Writing Json Knowledge Import

portal_studio (169)

portal_studio.accessibility.evidence.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Accessibility Evidence Save

portal_studio.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Add

portal_studio.allocate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Subdomain Allocate

portal_studio.analytics.breakdown

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Breakdown

portal_studio.analytics.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Load

portal_studio.apply.kit

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Apply Kit

portal_studio.apply.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Apply Theme

portal_studio.approval

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Approval

portal_studio.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Approve

portal_studio.ask

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Ask

portal_studio.audience.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Delete

portal_studio.audience.explain

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Explain

portal_studio.audience.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience List

portal_studio.audience.preview

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Preview

portal_studio.audience.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Save

portal_studio.brand.generate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Generate

portal_studio.brand.import

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Import

portal_studio.cancel.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Cancel Schedule

portal_studio.certify

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Certify

portal_studio.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Host Check

portal_studio.check.route.portal.subdomain.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Subdomain Check

portal_studio.comment.add

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Add

portal_studio.comment.resolve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Resolve

portal_studio.component.package.inspect

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Package Inspect

portal_studio.component.package.install

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Component Package Install

portal_studio.component.validate

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Validate

portal_studio.config

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Handoff Config

portal_studio.data.resolve

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Data Resolve

portal_studio.delete.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Delete Theme

portal_studio.developer.contract

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Developer Contract

portal_studio.discovery.preview

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Discovery Preview

portal_studio.discovery.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Discovery Save

portal_studio.document.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Load

portal_studio.document.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Save

portal_studio.experiment.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Control

portal_studio.experiment.results

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiment Results

portal_studio.experiment.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Save

portal_studio.experiments.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiments List

portal_studio.form.archive

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Archive

portal_studio.form.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Form Catalog

portal_studio.form.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Create

portal_studio.form.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Delete

portal_studio.form.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Duplicate

portal_studio.form.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Evaluate

portal_studio.form.group.apply

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Apply

portal_studio.form.group.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Delete

portal_studio.form.group.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Save

portal_studio.form.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Publish

portal_studio.form.restore

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Restore

portal_studio.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Save

portal_studio.form.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Template

portal_studio.form.test

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Test

portal_studio.form.version.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Version Restore

portal_studio.history

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design History

portal_studio.identity.discover

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Discover

portal_studio.identity.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Load

portal_studio.identity.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Identity Save

portal_studio.integration.activate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Activate

portal_studio.integration.install

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Install

portal_studio.integration.kill.switch

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Kill Switch

portal_studio.integration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration List

portal_studio.integration.policy

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration Policy

portal_studio.integration.policy.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Integration Policy Save

portal_studio.integration.preflight

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Preflight

portal_studio.integration.revise

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Revise

portal_studio.integration.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Rollback

portal_studio.integration.transition

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Transition

portal_studio.journey.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Archive

portal_studio.journey.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Journey Catalog

portal_studio.journey.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Delete

portal_studio.journey.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Duplicate

portal_studio.journey.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Journey Evaluate

portal_studio.journey.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Instantiate

portal_studio.journey.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Restore

portal_studio.journey.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Save

portal_studio.kb.category.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Delete

portal_studio.kb.category.reorder

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Reorder

portal_studio.kb.category.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Category Save

portal_studio.kb.governance

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Governance

portal_studio.kb.governance.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Governance Save

portal_studio.kb.languages

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Languages

portal_studio.kb.languages.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Languages Save

portal_studio.kb.parity

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Parity

portal_studio.kb.search.tuning

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning

portal_studio.kb.search.tuning.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning Save

portal_studio.kb.tree

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Tree

portal_studio.knowledge.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Knowledge Summary

portal_studio.list

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain List

portal_studio.load

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Analytics Load

portal_studio.load.route.portal.design.load

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Load

portal_studio.load.route.portal.form.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Form Load

portal_studio.lock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Lock

portal_studio.migration.apply

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Apply

portal_studio.migration.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Approve

portal_studio.migration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration List

portal_studio.migration.reconcile

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Reconcile

portal_studio.migration.report

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration Report

portal_studio.migration.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollback

portal_studio.migration.rollout

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollout

portal_studio.migration.start

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Start

portal_studio.node.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Add

portal_studio.node.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Delete

portal_studio.node.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Duplicate

portal_studio.node.move

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Move

portal_studio.node.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Update

portal_studio.operations.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Control

portal_studio.operations.feed

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Feed

portal_studio.operations.record

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Record

portal_studio.operations.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Summary

portal_studio.org.context

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Context

portal_studio.org.member.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Org Member Save

portal_studio.org.members

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Members

portal_studio.org.requests

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Requests

portal_studio.page.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Archive

portal_studio.page.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Create

portal_studio.page.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Delete

portal_studio.page.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Duplicate

portal_studio.page.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Restore

portal_studio.page.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Update

portal_studio.parity.accept

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Accept

portal_studio.parity.capture

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Capture

portal_studio.parity.compare

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Compare

portal_studio.parity.create

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Create

portal_studio.parity.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Parity List

portal_studio.personalization.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Delete

portal_studio.personalization.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Personalization List

portal_studio.personalization.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Save

portal_studio.presence

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Presence

portal_studio.preview

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Preview

portal_studio.preview.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Preview Catalog

portal_studio.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Publish

portal_studio.quality

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Quality

portal_studio.redirect.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Delete

portal_studio.redirect.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Save

portal_studio.release.diff

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Release Diff

portal_studio.release.evidence

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Release Evidence

portal_studio.release.history

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Release History

portal_studio.release.publish

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Publish

portal_studio.release.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Rollback

portal_studio.release.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule

portal_studio.remove

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Remove

portal_studio.request.changes

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Request Changes

portal_studio.restore.field

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Restore Field

portal_studio.restore.published

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Restore Published

portal_studio.revert

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Design Revert

portal_studio.review

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Review

portal_studio.review.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Review Link

portal_studio.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Rollback

portal_studio.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save

portal_studio.save.route.portal.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Form Save

portal_studio.save.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save Theme

portal_studio.saved.section.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Delete

portal_studio.saved.section.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Instantiate

portal_studio.saved.section.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Save

portal_studio.schedule

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Schedule

portal_studio.schedule.cancel

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule Cancel

portal_studio.scim.config

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Scim Config

portal_studio.service.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Archive

portal_studio.service.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Service Catalog

portal_studio.service.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Duplicate

portal_studio.service.reorder

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Reorder

portal_studio.service.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Restore

portal_studio.service.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Save

portal_studio.service.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Template

portal_studio.sign.in.flow.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Sign In Flow Save

portal_studio.signin.methods

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Signin Methods

portal_studio.test.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Handoff Test Link

portal_studio.unlock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Unlock

portal_studio.upload

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Image Upload

sales (14)

sales.ai.insight

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Ai Insight

sales.analyze

Write. Scope: sales.write, analytics.write, admin. Contract: route_inferred. Analyze sales with AI

sales.chart

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Chart

sales.compare

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. Compare sales periods

sales.compare.route.sales.compare

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Compare

sales.goal.delete

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Delete

sales.goal.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion Goal List

sales.goal.save

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Save

sales.list

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. List sales and conversions

sales.list.route.conversion.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion List

sales.record

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Record

sales.stats

Read. Scope: sales.read, analytics.read, admin. Contract: declared_dynamic. Read sales statistics

sales.stats.route.sales.stats

Read. Scope: sales.read, admin. Contract: declared_dynamic. Sales Stats

sales.table

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Table

安保服务 (21)

security.ai.analyze

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Analyze

security.ai.ask

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Ask

security.ai.briefs

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Briefs

security.ai.chain.explain

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Chain Explain

security.ai.incident.action

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Incident Action

security.ai.incidents

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Incidents

security.ai.js.triage

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Js Triage

security.ai.policies

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Policies

security.ai.policy.action

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Policy Action

security.ai.verdicts

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Verdicts

security.blocklist.add

Write. Scope: security.write, admin. Contract: source_inferred. Add a spam rule (email, domain or IP) to the ticket blocklist Required fields: kind, value. Retry-safe with idempotency_key.

security.blocklist.list

Read. Scope: security.read, admin. Contract: explicit. List the current ticket spam rules

security.chain.reanchor

Write. Scope: security.write, admin. Contract: declared_dynamic. Security Chain Reanchor

security.check

Read. Scope: security.read, admin. Contract: source_inferred. Check an IP or email against the platform blocklists and Security AI verdicts

security.ip

Write. Scope: security.write, admin. Contract: route_inferred. Block Ip

security.ip.route.unblock.ip

Write. Scope: security.write, admin. Contract: route_inferred. Unblock Ip

security.list

Write. Scope: security.write, admin. Contract: route_inferred. Access Log List

security.overview.chains

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Chains

security.overview.data

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Data

security.report

Write. Scope: security.write, admin. Contract: source_inferred. Report abuse a connector observed (spam, login attack, scan, fraud) Retry-safe with idempotency_key.

security.visitor

Write. Scope: security.write, admin. Contract: route_inferred. Block Visitor

sessions (5)

sessions.detail

Read. Scope: sessions.read, admin. Contract: route_inferred. Session Detail

sessions.get

Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. Get a session journey Required fields: session_id.

sessions.list

Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. List sessions

sessions.merged

Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Merged

sessions.table

Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Table

settings (11)

settings.ai.eval.watchtower.config

Write. Scope: settings.write, admin. Contract: declared_dynamic. Ai Eval Watchtower Config

settings.get.client.chat.settings

Read. Scope: settings.read, admin. Contract: route_inferred. Get Client Chat Settings

settings.get.settings

Read. Scope: settings.read, admin. Contract: route_inferred. Get Settings

settings.opsiq.branding.clear

Write. Scope: admin. Contract: route_inferred. Opsiq Branding Clear

settings.opsiq.branding.upload

Write. Scope: admin. Contract: route_inferred. Opsiq Branding Upload

settings.privacy.settings.get

Read. Scope: settings.read, admin. Contract: declared_dynamic. Privacy Settings Get

settings.privacy.settings.save

Write. Scope: settings.write, admin. Contract: route_inferred. Privacy Settings Save

settings.save.ai.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Ai Settings

settings.save.chat.widget.settings

Write. Scope: settings.write, admin. Contract: declared_dynamic. Save Chat Widget Settings

settings.save.client.chat.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Client Chat Settings

settings.save.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Settings

site_intelligence (221)

site_intelligence.action.audit.chain

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Audit Chain

site_intelligence.action.execute

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Execute

site_intelligence.action.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Preview

site_intelligence.action.token

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Token

site_intelligence.agent.auto.bg

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg

site_intelligence.agent.auto.bg.stop

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg Stop

site_intelligence.agent.auto.step

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Step

site_intelligence.agent.chat

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Chat

site_intelligence.agent.conn.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Delete

site_intelligence.agent.conn.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Get

site_intelligence.agent.conn.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Save

site_intelligence.agent.conn.test

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Test

site_intelligence.agent.coverage

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Coverage

site_intelligence.agent.events

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Events

site_intelligence.agent.hosted.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Apply

site_intelligence.agent.hosted.finalize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Finalize

site_intelligence.agent.hosted.live.set

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Live Set

site_intelligence.agent.hosted.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Preview

site_intelligence.agent.hosted.rollback

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Rollback

site_intelligence.agent.hosted.start

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Start

site_intelligence.agent.hosted.verify

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Verify

site_intelligence.agent.run.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Delete

site_intelligence.agent.run.finalize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Finalize

site_intelligence.agent.run.rollback

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Rollback

site_intelligence.agent.run.start

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Start

site_intelligence.agent.run.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Status

site_intelligence.agent.run.verify

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Verify

site_intelligence.agent.runs.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Runs List

site_intelligence.agent.set.mode

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Set Mode

site_intelligence.agent.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Status

site_intelligence.agent.step.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Apply

site_intelligence.agent.step.skip

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Skip

site_intelligence.agent.turn.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Turn Status

site_intelligence.ai.activity

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Activity

site_intelligence.ai.alert.enrich

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alert Enrich

site_intelligence.ai.alerts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alerts

site_intelligence.ai.analyst

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst

site_intelligence.ai.analyst.ask

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Ask

site_intelligence.ai.analyst.email

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Email

site_intelligence.ai.analyst.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Run

site_intelligence.ai.badges

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges

site_intelligence.ai.badges.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Badges Portfolio

site_intelligence.ai.badges.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges Preview

site_intelligence.ai.bl.plan

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan

site_intelligence.ai.bl.plan.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan Run

site_intelligence.ai.brief

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief

site_intelligence.ai.brief.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief Run

site_intelligence.ai.comp.analyse

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse

site_intelligence.ai.comp.analyse.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse Run

site_intelligence.ai.content.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Get

site_intelligence.ai.content.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content List

site_intelligence.ai.content.publish

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Publish

site_intelligence.ai.content.write

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Write

site_intelligence.ai.daily.digest

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Daily Digest

site_intelligence.ai.discover

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Discover

site_intelligence.ai.fix.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply

site_intelligence.ai.fix.apply.bulk

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply Bulk

site_intelligence.ai.fix.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss

site_intelligence.ai.fix.dismiss.bulk

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss Bulk

site_intelligence.ai.fix.generate

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate

site_intelligence.ai.fix.generate.all

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate All

site_intelligence.ai.fix.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix List

site_intelligence.ai.kw.coach

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach

site_intelligence.ai.kw.coach.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach Run

site_intelligence.ai.overview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Overview

site_intelligence.ai.page.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit

site_intelligence.ai.page.audit.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit Run

site_intelligence.ai.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Portfolio

site_intelligence.ai.portfolio.history

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Ai Portfolio History

site_intelligence.ai.portfolio.run

Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Ai Portfolio Run

site_intelligence.ai.probe

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Probe

site_intelligence.ai.prompt.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Add

site_intelligence.ai.prompt.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt History

site_intelligence.ai.prompt.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Remove

site_intelligence.ai.prompts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompts

site_intelligence.ai.readiness

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Readiness

site_intelligence.ai.ready

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Ready

site_intelligence.alert.resolve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Alert Resolve

site_intelligence.alerts

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Alerts

site_intelligence.alerts.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence alerts

site_intelligence.alerts.resolve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Resolve a Site Intelligence alert Required fields: alert_id.

site_intelligence.analyze

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Analyze

site_intelligence.ask

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ask

site_intelligence.audit.hint

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Audit Hint

site_intelligence.backlink.disavow

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlink Disavow

site_intelligence.backlinks

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Backlinks

site_intelligence.backlinks.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List backlinks

site_intelligence.backlinks.refresh

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlinks Refresh

site_intelligence.billing.overview

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Billing Overview

site_intelligence.brand.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Get

site_intelligence.brand.radar

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Radar

site_intelligence.brand.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Save

site_intelligence.cannibalisation

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Cannibalisation

site_intelligence.compare

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Compare

site_intelligence.competitor.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Add

site_intelligence.competitor.refresh

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Refresh

site_intelligence.competitor.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Remove

site_intelligence.competitors

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Competitors

site_intelligence.competitors.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List competitors

site_intelligence.content.brief

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Brief

site_intelligence.content.decay

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Decay

site_intelligence.content.draft

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Draft

site_intelligence.crawl.budget

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Crawl Budget

site_intelligence.crawl.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl List

site_intelligence.crawl.status

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl Status

site_intelligence.crawls.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence crawls

site_intelligence.crawls.status

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Get crawl status

site_intelligence.dashboard

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Read the Site Intelligence dashboard

site_intelligence.dashboard.route.si.dashboard

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Dashboard

site_intelligence.dashboard.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Dashboard Save

site_intelligence.diag.backfill

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Backfill

site_intelligence.diag.compare

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Compare

site_intelligence.diag.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Diag Portfolio

site_intelligence.diag.recs.regen

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Recs Regen

site_intelligence.diag.thresholds

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds

site_intelligence.diag.thresholds.eval

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Eval

site_intelligence.diag.thresholds.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds History

site_intelligence.diag.thresholds.profile

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Profile

site_intelligence.diag.thresholds.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Save

site_intelligence.diagnostics

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diagnostics

site_intelligence.exec.report

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Exec Report

site_intelligence.export

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Export

site_intelligence.ga4.connect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Connect

site_intelligence.ga4.list.properties

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 List Properties

site_intelligence.ga4.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Map

site_intelligence.ga4.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Status

site_intelligence.ga4.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Sync

site_intelligence.gbp

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp

site_intelligence.gbp.draft.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Approve

site_intelligence.gbp.draft.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Dismiss

site_intelligence.gbp.draft.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Sync

site_intelligence.gbp.drafts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Drafts

site_intelligence.gbp.locations

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Gbp Locations

site_intelligence.gbp.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Map

site_intelligence.gbp.post.draft

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Draft

site_intelligence.gbp.post.publish

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Publish

site_intelligence.gbp.qa

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa

site_intelligence.gbp.qa.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Approve

site_intelligence.gbp.qa.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Dismiss

site_intelligence.gbp.qa.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Sync

site_intelligence.gbp.site.prefs

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Site Prefs

site_intelligence.gbp.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Sync

site_intelligence.google.truth.schedule.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Google Truth Schedule Save

site_intelligence.growth

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Growth

site_intelligence.gsc.connect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Connect

site_intelligence.gsc.list.properties

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc List Properties

site_intelligence.gsc.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Map

site_intelligence.gsc.opportunities

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Opportunities

site_intelligence.gsc.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Status

site_intelligence.gsc.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Sync

site_intelligence.image.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Image Audit

site_intelligence.internal.links

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Internal Links

site_intelligence.issue.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Issue History

site_intelligence.issues

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Issues

site_intelligence.issues.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence issues

site_intelligence.keyword.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Add

site_intelligence.keyword.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Remove

site_intelligence.keyword.research

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Research

site_intelligence.keywords

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Keywords

site_intelligence.keywords.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List tracked keywords

site_intelligence.local

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local

site_intelligence.local.grid

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid

site_intelligence.local.grid.scan

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid Scan

site_intelligence.log.ingest

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Ingest

site_intelligence.log.summary

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Summary

site_intelligence.metadata.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Metadata Audit

site_intelligence.overview

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Overview

site_intelligence.page

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page

site_intelligence.page.experience

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Experience

site_intelligence.page.optimize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Optimize

site_intelligence.pages

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Pages

site_intelligence.pages.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence pages

site_intelligence.pagespeed.bridge.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Pagespeed Bridge Status

site_intelligence.portfolio.export

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Portfolio Export

site_intelligence.provider.health

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Provider Health

site_intelligence.rank.check

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rank Check

site_intelligence.rec.action

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rec Action

site_intelligence.recommendations

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Recommendations

site_intelligence.redirect.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Redirect Audit

site_intelligence.report

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report

site_intelligence.report.generate

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report Generate

site_intelligence.reports

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Reports

site_intelligence.reports.list

Read. Scope: site_intelligence.read, admin. Contract: source_inferred. Site Intelligence Reports List

site_intelligence.reset.google.oauth

Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Reset Google Oauth

site_intelligence.revenue

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Revenue

site_intelligence.revenue.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Revenue Portfolio

site_intelligence.save.shared.google.oauth

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Save Shared Google Oauth

site_intelligence.scan.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Start a Site Intelligence analysis

site_intelligence.schedule.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Delete

site_intelligence.schedule.run.now

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Run Now

site_intelligence.schedule.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Save

site_intelligence.schedules.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedules List

site_intelligence.schema.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schema Audit

site_intelligence.server.engineer

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Server Engineer

site_intelligence.settings.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Settings Save

site_intelligence.sites.list

Read. Scope: site_intelligence.read, admin. Contract: explicit. List Site Intelligence monitored sites

site_intelligence.speed

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed

site_intelligence.speed.progress

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Progress

site_intelligence.speed.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Run

site_intelligence.speed.v2

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2

site_intelligence.speed.v2.build.task

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Build Task

site_intelligence.speed.v2.collect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Collect

site_intelligence.speed.v2.read

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Read

site_intelligence.speed.v2.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Run

site_intelligence.start.crawl

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Start Crawl

site_intelligence.task.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Approve

site_intelligence.task.assign

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Assign

site_intelligence.task.bulk.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Apply

site_intelligence.task.bulk.assign

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Assign

site_intelligence.task.bulk.deadline

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Deadline

site_intelligence.task.bulk.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Dismiss

site_intelligence.task.deadline

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Deadline

site_intelligence.task.note

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Note

site_intelligence.task.proof

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Proof

site_intelligence.task.reject

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Reject

site_intelligence.task.review

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Review

site_intelligence.topical.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Topical Map

site_intelligence.webhook.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Delete

site_intelligence.webhook.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Save

site_intelligence.webhooks.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhooks List

site_intelligence.workflow

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Workflow

状态 (6)

status.component.save

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Component Save

status.components.save

Write. Scope: status.write, admin. Contract: explicit. Create or update a public status component Required fields: name. Retry-safe with idempotency_key.

status.incident.create

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Incident Create

status.incident.resolve

Read. Scope: status.read, admin. Contract: route_inferred. Status Incident Resolve

status.incidents.create

Write. Scope: status.write, admin. Contract: explicit. Create a status-page incident Required fields: title. Retry-safe with idempotency_key.

status.incidents.resolve

Write. Scope: status.write, admin. Contract: source_inferred. Status Incidents Resolve Retry-safe with idempotency_key.

调查 (22)

surveys.analytics.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Analytics Get

surveys.audiences.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey audiences

surveys.audiences.materialize

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Audiences Materialize Retry-safe with idempotency_key.

surveys.campaigns.create

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey campaign Required fields: deployment_id. Retry-safe with idempotency_key.

surveys.campaigns.launch

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Campaigns Launch Retry-safe with idempotency_key.

surveys.campaigns.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey campaigns

surveys.deployments.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey deployments

surveys.deployments.set_status

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Deployments Set Status Retry-safe with idempotency_key.

surveys.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Get

surveys.imports.create

Write. Scope: surveys.write, admin. Contract: explicit. Create and run a survey import Required fields: kind. Retry-safe with idempotency_key.

surveys.imports.process

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Imports Process Retry-safe with idempotency_key.

surveys.invitations.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey invitations

surveys.links.create

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Links Create Retry-safe with idempotency_key.

surveys.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey definitions

surveys.responses.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Responses Get

surveys.responses.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey responses

surveys.triggers.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey trigger sets

surveys.types.list

Read. Scope: surveys.read, admin. Contract: explicit. List supported question types and Studio templates

surveys.versions.list

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Versions List

surveys.webhooks.delete

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Webhooks Delete Retry-safe with idempotency_key.

surveys.webhooks.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey webhook subscriptions

surveys.webhooks.save

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey webhook subscription Required fields: url. Retry-safe with idempotency_key.

团队 (63)

team.delete

Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Delete

team.delete.route.departments.delete

Write. Scope: team.write, admin. Contract: route_inferred. Departments Delete

team.list

Read. Scope: team.read, admin. Contract: route_inferred. Admin Users List

team.list.route.departments.list

Read. Scope: team.read, admin. Contract: declared_dynamic. Departments List

team.perf.activity

Write. Scope: admin. Contract: route_inferred. Team Perf Activity

team.perf.ai.compare

Write. Scope: admin. Contract: route_inferred. Team Perf Ai Compare

team.perf.ai.review

Write. Scope: admin. Contract: route_inferred. Team Perf Ai Review

team.perf.availability

Write. Scope: admin. Contract: route_inferred. Team Perf Availability

team.perf.award.finalize

Write. Scope: admin. Contract: route_inferred. Team Perf Award Finalize

team.perf.award.history

Read. Scope: team.read, admin. Contract: route_inferred. Team Perf Award History

team.perf.award.void

Write. Scope: admin. Contract: route_inferred. Team Perf Award Void

team.perf.claim.pay

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Pay

team.perf.claim.recover

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Recover

team.perf.claim.reject

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Reject

team.perf.clear

Write. Scope: admin. Contract: route_inferred. Team Perf Clear

team.perf.coaching.action.item.add

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Add

team.perf.coaching.action.item.complete

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Complete

team.perf.coaching.evidence.pin

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Pin

team.perf.coaching.evidence.unpin

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Unpin

team.perf.coaching.session

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session

team.perf.coaching.session.create

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Create

team.perf.coaching.session.update

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Update

team.perf.coaching.sessions

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Sessions

team.perf.coaching.status

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Status

team.perf.data

Write. Scope: admin. Contract: route_inferred. Team Perf Data

team.perf.heatmap

Write. Scope: admin. Contract: route_inferred. Team Perf Heatmap

team.perf.history

Write. Scope: admin. Contract: route_inferred. Team Perf History

team.perf.pay.all.claims

Write. Scope: admin. Contract: route_inferred. Team Perf Pay All Claims

team.perf.qa.calibration.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Calibration Record

team.perf.qa.dispute.resolve

Write. Scope: admin. Contract: route_inferred. Team Perf Qa Dispute Resolve

team.perf.qa.disputes

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Disputes

team.perf.qa.evaluation.submit

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Evaluation Submit

team.perf.qa.overview

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Overview

team.perf.qa.scorecard.publish

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Publish

team.perf.qa.scorecard.save

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Save

team.perf.quest.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Record

team.perf.quest.save

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Save

team.perf.quest.status

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Status

team.perf.quests

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quests

team.perf.recognition

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition

team.perf.recognition.settings.save

Write. Scope: admin. Contract: route_inferred. Team Perf Recognition Settings Save

team.perf.recognition.streak.history

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streak History

team.perf.recognition.streaks.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streaks Record

team.perf.reward.budget.authorize

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Budget Authorize

team.perf.reward.claims

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Claims

team.perf.reward.pay

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Pay

team.perf.reward.payouts

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Payouts

team.perf.reward.period.finalize

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Finalize

team.perf.reward.period.history

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period History

team.perf.reward.period.preview

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period Preview

team.perf.reward.period.reverse

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Reverse

team.perf.reward.period.void

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Void

team.perf.reward.save

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Save

team.perf.reward.state

Write. Scope: admin. Contract: route_inferred. Team Perf Reward State

team.perf.trends

Write. Scope: admin. Contract: route_inferred. Team Perf Trends

team.perf.v2.data

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Data

team.perf.v2.export

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Export

team.perf.v2.live

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Live

team.perf.v2.reward.sheet

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Reward Sheet

team.perf.v2.settings

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings

team.perf.v2.settings.save

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings Save

team.save

Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Save

team.save.route.departments.save

Write. Scope: team.write, admin. Contract: route_inferred. Departments Save

罚单 (77)

tickets.ai.summary

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Ai Summary

tickets.analytics

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Analytics

tickets.approval.decide

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Decide

tickets.approval.request

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Request

tickets.approvals.pending

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Approvals Pending

tickets.assignment.rule.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Assignment Rule Delete

tickets.assignment.rule.list

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Assignment Rule List

tickets.assignment.rule.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Assignment Rule Save

tickets.assignment_rules.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Assignment Rules Delete Retry-safe with idempotency_key.

tickets.assignment_rules.save

Write. Scope: tickets.write, admin. Contract: explicit. Create or update a ticket assignment rule Required fields: name. Retry-safe with idempotency_key.

tickets.bulk

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Bulk Retry-safe with idempotency_key.

tickets.bulk.route.tickets.bulk

Write. Scope: tickets.write, admin. Contract: route_inferred. Tickets Bulk

tickets.calendar.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Calendar Delete

tickets.calendar.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Calendar Save

tickets.claim

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Claim

tickets.csat.get

Read. Scope: tickets.read, admin. Contract: explicit. Get the CSAT response for one ticket Required fields: ticket_id.

tickets.csat.list

Read. Scope: tickets.read, admin. Contract: explicit. List ticket CSAT responses in the bound workspace

tickets.csat.metrics

Read. Scope: tickets.read, admin. Contract: explicit. CSAT metrics for a period (the tickets dashboard numbers)

tickets.embed.load

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Load

tickets.embed.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Save

tickets.embed.secret

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Secret

tickets.field.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Field Save

tickets.follower.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Add

tickets.follower.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Remove

tickets.get

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Get

tickets.kb.deflection

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Deflection

tickets.kb.draft

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Draft

tickets.kb.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Save

tickets.kb.version.restore

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Version Restore

tickets.kb.versions

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Versions

tickets.link.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Add

tickets.link.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Remove

tickets.list

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets List

tickets.open

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Retry-safe with idempotency_key.

tickets.open_guest

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Guest Retry-safe with idempotency_key.

tickets.ops.summary

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Ops Summary

tickets.policy.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Policy Delete

tickets.policy.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Policy Save

tickets.presence.leave

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Leave

tickets.presence.ping

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Ping

tickets.quick.replies

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Quick Replies

tickets.quick.reply.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Quick Reply Save

tickets.relations.get

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Relations Get

tickets.reply

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Reply Retry-safe with idempotency_key.

tickets.reply.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Delete

tickets.reply.edit

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Edit

tickets.reply.outbound.convert

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Outbound Convert

tickets.reply.translate

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translate

tickets.reply.translation.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Delete

tickets.reply.translation.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Save

tickets.rule.compose

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Rule Compose

tickets.side.ai.draft

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Ai Draft

tickets.side.assign.department

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Assign Department

tickets.side.create

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Create

tickets.side.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side List

tickets.side.mention

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side Mention

tickets.side.recipients

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Side Recipients

tickets.side.reply

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Reply

tickets.sla.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Sla Delete Retry-safe with idempotency_key.

tickets.sla.save

Write. Scope: tickets.write, admin. Contract: explicit. Create or update an SLA policy Required fields: name. Retry-safe with idempotency_key.

tickets.split

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split

tickets.split.candidates

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split Candidates

tickets.tag.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Add

tickets.tag.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Tag List

tickets.tag.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Remove

tickets.tags.add

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Add Retry-safe with idempotency_key.

tickets.tags.list

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Tags List

tickets.tags.remove

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Remove Retry-safe with idempotency_key.

tickets.update

Write. Scope: tickets.write, admin. Contract: source_inferred. Update a ticket status, priority, subject, department or assignment Retry-safe with idempotency_key.

tickets.view.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Delete

tickets.view.list

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket View List

tickets.view.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Save

tickets.views.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Delete Retry-safe with idempotency_key.

tickets.views.save

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Save Retry-safe with idempotency_key.

tickets.worklog.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Add

tickets.worklog.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Delete

tickets.worklog.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Worklog List

todos (1)

todos.add

Write. Scope: todos.write, admin. Contract: source_inferred. Todos Add Retry-safe with idempotency_key.

visitors (3)

visitors.block

Write. Scope: visitors.write, security.write, admin. Contract: route_inferred. Block a visitor Required fields: visitor_id.

visitors.list

Read. Scope: visitors.read, analytics.read, admin. Contract: route_inferred. List visitors

visitors.table

Read. Scope: visitors.read, admin. Contract: route_inferred. Visitors Table

网络呼号 (1)

webhooks.events.list

Read. Scope: webhooks.read, crm.read, admin. Contract: explicit. List outbound webhook events and their payloads

写作 (6)

writing.analyze

Write. Scope: writing. Contract: source_inferred. Writing Analyze Retry-safe with idempotency_key.

writing.compose

Write. Scope: writing. Contract: source_inferred. Writing Compose Retry-safe with idempotency_key.

writing.reply

Write. Scope: writing. Contract: source_inferred. Writing Reply Retry-safe with idempotency_key.

writing.rewrite

Write. Scope: writing. Contract: source_inferred. Writing Rewrite Retry-safe with idempotency_key.

writing.summarize

Write. Scope: writing. Contract: source_inferred. Writing Summarize Retry-safe with idempotency_key.

writing.translate

Write. Scope: writing. Contract: source_inferred. Writing Translate Retry-safe with idempotency_key.

OpenAPI和邮递员可以到吗?+

是。 生成的 OpenAPI 3.0 文档位于 /api/v1/openapi.php, 生成的 Postman 收藏在 /api/v1/postman.php, 和人可读的开发者 Docs 在 /api/docs/.

我怎么才能在不止一个工作区工作?+

在请求中发送 site_ key 来选择工作空间。 为一个工作空间发布的密钥会被固定在它上; 有管理员背景的密钥可以选择允许它看到的任何工作空间, 而任何它不被拒绝 。

哪个动作可以只读密钥调用 ?+

任何标记为已读的动作。 将权限模式设定在密钥上只读_ 只读, 而每个写入都用已读_ 密钥拒绝, 因此报告集成即使错误也无法改变任何内容 。

为什么我找不到 管理者能看见的东西?+

密钥被设定为工作空间。 其他工作空间的记录返回到未找到而非权限错误, 所以 API 从未证实别处是否存在某事。

开发者

警卫 API

每个连接器和集成设备都签订一份安全合同:请 OpsIQ 它知道什么 关于一个 IP 或发送者,并反馈 滥用您自己的系统看到。

OpsIQ 已经为自己辩护: IP 防火墙屏蔽了攻击者,票管过滤了垃圾邮件,安全AI对违法者进行了分类并提出了块规则. Security API 打开该智能到您的其他系统。一个计费平台、客户端门户或自定义的应用程序可以在信任访问者之前进行检查,并报告其观察到的情况,从而使整个安装从每个表面学习。

做你该做的

信任前检查

安全。用防火墙状态检查答案,任何匹配发送者的垃圾邮件规则,以及缓存的 AI 判断 IP 一通电话,一通综合意见.

报告你看到什么

报告将观察记录为安全事件, IP 重复报道将事件集中起来,就像攻击一样 OpsIQ 直视。

共享垃圾邮件规则

安全 封禁列表 添加和封禁 封口列表 读取和写入相同的垃圾邮件规则 车票页面使用,所以一个系统封禁的发送者被封禁在任何地方.

举报连接器的滥用行为
POST /api/v1.php
Authorization: Bearer opq_your_api_key
Content-Type: application/json

{
  "action": "security.report",
  "ip": "203.0.113.7",
  "kind": "spam",
  "reason": "Sent 40 junk tickets in 10 minutes",
  "source": "whmcs:example.com"
}

范围与安全

security.read

需要安全检查和安全 封面名单 安全报告

security.write

需要安全 报告和保安 封锁列表 添加 仅提供给您想要输入规则和报告的系统 。

没有什么东西是被无声地摧毁的

被封禁的发信人仍然会登陆垃圾邮件视图中,在那里可以读取并还票.

平台保护自己

服务器是自己的 IP 地址永远无法通过此方式被封禁、封锁列表或报告 API,因此一个配置错误的集成不能将平台拆下.

💡
整合下的 Mint 键, 然后API 键,并仅给出它所需要的安全范围。每个动作的完整请求合同以元. actions和OpenAPI 文档为单位 。
我的连接器会自动使用吗?+

出局同步已经自动:当您屏蔽一个 IP,通过连接器安全同步告知连接的平台。API 是输入的一半。用带有安全范围的关键指向这四个动作上的连接符或自定义代码。

垃圾邮件规则是住在哪里?+

一个商店 车票页面屏蔽发送器控制 垃圾邮件AI在设置中,还有这个 API 所有的工作都与同一个挡板列表相对, 所以有一个地方可以找。

开发者

活动 API

从您的服务器或网站发送自定义事件到 OpsIQ,用于分析,实验,CRM触发器和webhook条件.

如何运作
活动 API音轨()调用发送自定义的演示_已预订事件 OpsIQ,它为转换目标、分块和触发器提供素材。OpsIQ.track ("demo_booked"), {值 : 0,计划:"pro"});转换目标分会触发和网络呼号( Webhooks)浏览器( E)OpsIQ.track)或服务器侧 POST /v1/events
活动 API

浏览器边事件

浏览器事件跟踪
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

服务器侧事件

服务器侧、 记录活动和通过动作转换联系人 API。使用时 crm.activities.record 寿命周期/商业活动和 crm.conversions.record 转换。没有 events.send 动作; 输入CRM事件接收者居住在 /v1/inbound.php?t=<token> 第三方系统,推动事件。

服务器侧活动( 动作) API)
POST /api/v1.php
Authorization: Bearer opq_your_key
Content-Type: application/json

{
  "action": "crm.activities.record",
  "site_key": "site_abc123",
  "email": "[email protected]",
  "event": "subscription.upgraded",
  "value": 50,
  "currency": "USD"
}

命名公约

点标记

命令,完成的,不是命令,已经完成的

过去紧张

按钮,点击" 不是"按钮,单击"

具体

定价 计划选择 而不是用户行动

开发者

A. 数据如何流动 OpsIQ

了解数据流有助于您调试集成并优化性能.

如何运作
数据流动情况数据从部件和信标流入 OpsIQ 核心(CDP,身份图,AI大脑,分析,CRM)然后通过webhooks和REST出局. API.部件信标( B)OpsIQ 核心项目CDP 身份图AI 大脑分析CRM网络呼出净 值 API
数据流动

输入数据流量

1
部件信标

密码 JavaScript 部件发送页面视图、点击和聊天信息到 /beacon.php.

2
事件摄入量

存储在 opsiq_events 中的事件,包含站点_ key,事件类型,客户,以及属性.

3
届会大会

会话构建者分组页面浏览到会话(通过 cron).

4
身份解析

识别出匿名记录后,会与客户简介相链接.

5
连接器同步

连接器从外部平台取出数据并存储在连接器缓存中.

6
AI 背景

AI集合背景来自:访客历史,客户简介,连接器数据,KB,并被迅速.

数据流外出

1
事件火灾

内部事件起火(ticket. created, chalk. message, order. completed).

2
任务队列

活动被放置在同步任务队列中 。

3
网络呼号发送

调度员签名并发送到所有订阅的端点.

4
失败时重试

以指数回放方式对交付失败进行再试.

设置

设置参考

设置是工作空间的控制中心。 下面的一切都被设定到您所在的工作空间, 因此一个账户可以运行多个品牌, 其身份、 聊天行为和保留规则不同 。

查找一个设置

设置中约有600个单个控制符, 分布在11个标签上, 归在四个菜单下。 您不需要浏览它们 。

搜索设置 (Ctrl + K)

按 Ctrl + K,或 Cmd +K 在 Mac 上, 设置页面的任意位置。 输入字节键后按 Enter 直接跳转到控制。 搜索会容忍小打字并理解相关的单词, 因此调度器会找到 Cron , 隐私会找到跟踪控制。 它只会显示您的角色可以打开的设置 。

工作空间和计划

通用和许可证。

AI和客户支助

管理助理AI,客户聊天, OpsIQ 写作与支持门户.

数据和治理

追踪和隐私、权限和安全。

系统

Cron设置(仅自办)和危险区.

保存

每个选项卡都用自己的保存按钮自行保存。 客户端聊天和 OpsIQ 写出他们的被指针到屏幕上。 在切换标签前保存; 更改不会被带过 。

深层链接

活性标签被写入了页面地址,因此可以给标签作书签或发送给同事.

一般情况:企业身份

这份专页上最重要的卡片,AI在每一份答复、报告和每日简报上都读取这些值。

企业名称

AI 报告、每日简报和客户信息措辞。匹配您的网站页脚。

商业工业

设计人工智能分析、领先评分、简介和调查预设,从网络托管、电子商务、SaaS、房地产、代理、咨询、保健、教育、金融或一般业务中选择。

系统语言

向没有选择自己语言的人显示的语言。 每个代理可以覆盖在他们的配置中 。

使用浏览器语言

显示访问者自己的语言的登录页。 一旦有人在那里选择了一种语言, 他们的选择就获胜, 而这个选项永远不会覆盖它 。

系统时区

整个系统运行的区域有:日期、报告、时间表和背景。使用您的操作时区,而不是客户。

一般情况:地理实施计划和跟踪

GeoIP2 数据库路径

GeoLite2-City.mmdb. 首发负载时自动检测的完整路径 cPanel, Plesk, DirectAdmin, Cloudways, Docker 和 plain Linux 或 Windows. 在同一文件夹中为访问者网络提供商添加 GeoLite2-ASN. mmdb 。

地源模式

只使用 GeoLite2 , 带有一个 Cloudflare 倒置,或 Cloudflare 只有这个。Cloudflare 模式要求网站通过 Cloudflare,并启用访问者位置头,用于城市和区域细节。

会话超时( s)

访问者会话被视为结束前不活动。 默认值 14400 四个小时

实时刷新间隔(s)

Live Feed 多久刷新一次。 默认 30 秒数。

活动阈值( 分)

访问者在最后一页装入后算作活多久 。2分钟。这是现场直播的下载,而不是会话长度。

数据保留(日)

删除过去收集并生成的记录:分析、聊天、机票、反馈、交易、AI遥测、集成记录和CRM活动。0设置、作者内容和同意收据永远不会被删除。

当聊天被删除时

选择删除的对话保留在记录上的数量: 全记录, 记录没有对话, 或者只记录分数。 删除总是隐藏在收件箱和访客历史中的聊天内容。 计划保留和忘记访问者总是完全抹去, 不管这些是什么 。

轨道机器人交通

将爬行者算作访客。请离开,它会夸大游客的计算和每份报告的浏览。

已启用反馈调查

向访客显示全站反馈部件。 与客户端聊天、 支持流程的聊天调查分开 。

概况:AI特征

每个AI表面的主交换器。 默认全部打开并保存每个工作空间 。

AI 票价查询

按类别,优先级和情绪对每张票进行分类,并写出票头的线程摘要.

AI 线程悬浮摘要

当代理在票单上徘徊一行时,在工具提示中显示分解标记和摘要。需要 AI Trage 。

收件箱副驾驶( 编译器)

添加票务回复框下的 ADraft AI 回复, Warmer, Shorter, More real and Apologetic 按钮。 没有代理, 任何信息都不会发送 。

问...OpsIQ 副驾驶

每个行政页面上都有页码的浮动副驾驶。知道哪些客户、发票或机票是开着的。

晨报

副驾驶每天首次开放时,会出示紧急机票、逾期答复和候机聊天等文件。星期日的节目每周审查一次。

概况:钱,品牌,后援

OpsIQ B. 基准货币

管理器中的每个货币总额都被转换成此货币以显示。连接器会存储自己的出源货币; 设置每个连接器 。

自动同步 FX 费率

每6小时从免费公共饲料中刷新收费,但无 API 键。您可以添加手动比对种子的速率。自动同步关闭后,没有手动速率的货币将不被转换。

启用商务和计费功能

关闭了船舶。打开它就可以看到销售和转换页面、仪表板收入卡和现场情报服务。关闭后,每个价格表面都隐藏起来,销售页面会留下菜单。

商业词汇

教学 OpsIQ 你的措辞是:你是否更新、更新的词句、你销售的什么、买主的称呼。

品牌和标识

上传了两条,一条是光背景(admin sidebar),一条则是暗色(签名页)。3 MB.

现场情报员,允许私自行动 SSH 目标

Auto-Implement SEO代理连接在 SSH 上. 私人,回回回和保留地址默认被屏蔽,作为反SSRF措施. 只允许在必须到达本地服务器的自托管安装上使用.

OpsIQ 备份/ 恢复

输出每个设置和 OpsIQ- 拥有的表格加上上传的文件。还原替换 OpsIQ 只进行配置和记录;它从未触及客户、发票、机票、服务、域名、订单或交易。

⚠️
在使用危险区中的任何内容之前先使用备份。 备份在一般中存在, 删除动作在危险区存在, 因此很容易在未先导出的情况下到达删除按钮 。
设置

设置: 安全

保护登录管理员、您的工作人员账户和数据 OpsIQ 收集。支持门户的客户签名是单独配置的。

登录保护

谷歌( G)reCAPTCHA

停止在管理员的登录上输入 bots 和证书填入。 选择 v3( 隐形、 得分) 或 v2( checkbox), 设定 v3 分数阈值, 并提供网站和密钥。 这些密钥会被支持的门户请求表重新使用 。

失败- Login 自动锁定

在一个窗口内设置一些失败后的地址, 屏蔽数小时。 您可以自定义锁定的页面信息, 并显示一个小的等屏分心 。

登录硬化

密码政策,最小长度,拒绝在已知的违反情况下发现的密码,每个账户的锁定时反对证书输入,每个管理员必须有两个因素,密码在危险行动前重新进入,以及新的设备的登录警报.

单签名( OIDC)

工作人员通过身份提供商登录。需求发放者 URL,客户端ID和客户端秘密。自动提供域,每行一个,在第一个登录时自动创建用户。

单一签名( O) (SAML 2.0)

给说话的提供者 SAML. OpsIQ ACS 回复的用品 URL 和 SP 实体 ID; 您提供 IDP 实体的 ID, 登录 URL,可选择的退出 URL 和X节。509 签名证书。电子邮件和名称属性字段仅用于非标准属性名称。

SCIM 供应

目录驱动的创建、更新和停用 OpsIQ 账户。OpsIQ 用品供应 SCIM 基础 URL; 您在此生成标签符号, 这样一面可以被取消, 而不中断其余部分 。

威胁、阻拦和收集

出行 Egress 允许列表

限制外部主机此工作空间连接器可能调用的内容。 Companion to the SSH 目标控制在通用。

威胁分数和自动锁定

威胁分数一旦超过你的门槛 就会阻止访客0禁用它。在选择数字前,请查看安全概览的一页。

块页信件

被屏蔽的访客看到的信息, 如纯文本或您自己的习惯 HTML 块屏.

访问者的核心网络生命

实际会议中的措施LCP、INP和CLS。

接驳、安全重试的意外交付

自定义事件队列在浏览器中并分批发送并重试,减少不良移动连接的损失.

已签名的跟踪灯塔

真正的部件嵌入式带有旋转的密码符, 因此可以拒绝伪造的跟踪数据。 默认关闭; 允许更改嵌入法, 所以先测试 。

安全警报

默认关闭。 检测和封存运行, 不管您是否被告知, 以及AI 帮助多少 。

启用安全提示

此卡的开关总机.

失败的登录波阈值

有多少在短时间内失败的登录 算作值得警惕的浪潮。

IP 名誉情报

增加公众虐待信息中出现的访问者的威胁分数。

站点表

小时营业时间和 TLS 过期检查,在证书失效前发出警告.

AI 安全分析员和AI事件简报

将可解释的判决加入可疑活动,并将相关攻击组织成一个单一的可读事件,而不是一流事件。

策略自动驾驶

行动本身,将事件所得的教训转化为拟议或适用的规则。在您审查并赞同其建议之前,请先行。

每日安保摘要和每周态势顾问

安全概览页面每日复刊,每周硬化核对表显示哪些被保护,哪些仍然开放。

自动过期的陈旧提案

一条拟议的整块规则 你从未执行过 过期本身 而不是积累。

DOM 会话重放

启用 DOM 会话重放

记录访问者重播的会话。 当重播库从不装入, 所以不放入不会产生费用。 记录被取样并被隐私化, 在Analytics 下的会话重播页面上被观看 。

样本率、最大捕获率、保留率

记录会议的份额、单场录音可能持续多长时间以及录音保存天数。

⚠️
会话重放记录使用您网站的真人。 保留样本率和保留率要保持在仍然回答您问题的水平, 并在您的隐私通知中披露 。
设置

设置: 跟踪和隐私

或 OpsIQ 可能收集, 以及每一种记录存续多久。

不适用情况

不包括 IPs 和 CIDR 范围

地址从未跟踪过,每行一个,准确地址或CIDR范围。最干净的方法是让自己的团队远离分析,因为它覆盖了那个地址的每个人,而不仅仅是签约管理员。

不包括 URL 路径

页面图案从未跟踪过,每行一张,带有星号的通配符。例如 /admin/* 把整个后台都从访客记录里放出来

数据保留政策

每一子系统在几天内自动清理。 与一般数据保留设置和危险区清理分开。

AI 交互日志

信心遥测, 包含简短的询问和响应预览。 默认 90 天数。这保存了大多数客户的文本,所以在收紧隐私时先缩短文本。

AI 使用事件

费用报告按名记账。90 天数。仅数字,没有消息内容。

行动审计线索

篡改不言自明的行动和安全记录。默认 365 几天,保持这段时间,这是你的证据线索。

诊断

系统健康记录 默认 30 几天时间。

未回答的问题

AI无法回答的一组问题。默认 90 研究AI在过期前错过的提问。

监督狗和出口

异常症状警报

每日比较昨天和最近的基准值,当一个度量移动超过你的阈值时会发出警报。默认值 35 百分之百 默认关闭

仓库导出

夜间堆放会话、访客、页面视图和相关表格,用于您自己的BI 堆栈, 以您选择的格式保存了数天。 默认关闭 。

设置

设置: 管理员AI 助理

浮动助理 您的工作人员在管理员内部使用, 可以现场阅读客户端、 发票、 票、 服务器和 crun 日志。 与客户聊天系统下的客户界面不同的助理。

启用 OpsIQ AI 部件

在每个管理页面上显示助理按钮。 关闭后为每个人隐藏它 。

版式和行为

角位置,面板宽度(320 改为: 600 px),最大高度(千分位数)400 改为: 900 px),角半径(.0改为: 24),字体大小,并有一个被霜冻的玻璃模糊了面板后面.

显示快取芯片

首页下方的一击快捷键。大多数员工使用最快的方式。

显示模型信息

显示哪个模型回答和需要多长时间。在调价时有用,噪音可以用于日常使用。

人均出入门

只显示登录管理员的助手, 其用户名和电子邮件都匹配 。OpsIQ 指定到此工作空间的代理。 所有者总是通过。 在启用前使用检查我的访问按钮, 或者您可以锁定自己的团队 。

AI 个人资料a

显示面板打开时显示的名称、页眉标签行和自定义欢迎消息。

智能快活芯片

编辑每个快捷键的标签和下限提示, 添加您自己的, 或重置为默认。 标签是工作人员看到的, 提示是AI 收到的 。

颜色和形状

芯片形状(平面,圆形,平方),芯片颜色,卡片主题和发射装置形状(圆形相接,平面相接),并有活预览.

对话内存

助手在浏览器会话中记得每个人的历史,最多 120 信件,存储在您自己的数据库中。清除后可以开始新的消息。

设置

设置: 客户端聊天

您的客户使用的聊天部件, 以及设置的最大区域。 有六个子标签, 主切换器和 Save 被绑在标签的上方 。

通过子目录来工作, 以进行新安装: 身份和复制、外观、行为、 支持流程、 知识培训。 高级是基础设施, 可以等待 。

身份和复制

品牌身份

部件名称、标签行、 AI 名称、 系统名称和闲置通知名称, 以及代理名称的出现方式。 Agent Name Source在真名、 自定义名称或团队标签之间做出决定 。

聊天问候

问候两位,一位是全体访客,另一位是身份明确的访客。一个问题开始的谈话比发言多。

弹出取茶机

聊天前的浮出的信息,有自有的名称,字体大小和颜色. AI可以写取笑者,有控件,用于生成多少个,每个访问显示多少个以及它们之间的间隙.

提示和交接

完整脚本: 请求姓名和电子邮件、 确认、 要求人、 无法使用代理、 票票创建或取消、 交接待决。 大约二十多行的单行在相撞面板上 。

状态和闲置通知

三种客户可见信息:代理关闭聊天,访客安静下来,代理手接回AI. 避免内部措辞像解析或三分法.

作曲家和建议

输入占位符、“对人说话”按钮标签和所建议的开场问题。有三项好建议比一页文章更偏差票。

启动器、图标和神通

发射人图标,是打开时可选的不同图标,发射人大小,以及人类代理和AI的图像.

外观

主题和玻璃

主题模式, 溢出颜色预设, 模糊的强度和不透明, 加上动画的切换, 分隔线, 隐藏状态行, 藏取信件盒卡并隐藏关闭按钮。 以预设开始; 它同时设置了数十个颜色 。

主颜色

启动器、 头条、 帮助面板、 链接、 按钮、 系统通知和作曲器, 每个都带有渐变的起始和结尾颜色。 默认的玻璃选项忽略了这些并保持透明完成 。

面板、泡泡和芯片

大约30个采取器覆盖了面板、边框、文本、输入区和每个泡泡类型(访问器、AI、代理、打字、系统),加上建议芯片及其悬浮状态。 只打开这个来进行精确的品牌匹配,并检查泡泡文本的对比度。

版式和形状

面板宽度和高度,角半径,字体大小,屏幕位置,发射装置形状,气泡样式以及是否显示相机等。测试手机上的宽度。

行为

自动回答 AI

交换器是人工智能的回答,关闭意味着每条信息都等待人类.

人类的后继和自然的双文本

当访客安静下来时, 温和的跟进, 以及一个可选的简短的第二条信息, 一个人物发送的方式。 每静下来, 第一次延迟, 稍后的乘数, 存在窗口和最大序列窗口, 可以限制在工作时间, 并且经过简单的感谢后, 被压制 。

打字机回复和回复速度

答覆是否逐个字排出,以及助手的回答速度如何,通过预设或您自己的最小和最大延迟以毫秒表示。一个小延迟读作比即时回复更人性化 。

实时翻译

每位代理人在看自己的书时,用自己的语言读写。

代理闲置后再交给AI

AI恢复谈话前的代理不活动时间.

自动打开聊天

在部件打开前秒数 。0从不打开 。 在移动中入侵; 请离开0除非测试。

更聪明的回答

计划提前解决单行本答,思考深度,代理答复的可选单独模式,向访客展示推理,容忍误入歧途,长时间对话记忆,限制助手只与您的业务打交道,价格用访问货币计算,以及链接如何出现。只有谈论你的业务才能为几乎所有人服务。

节约成本

跳过对问候和感谢等问候的知识搜索, 并封顶了最长的答覆。 Trims 成本不改变回答真实问题的质量 。

语文

部件支持哪一种语言, 以及如何选择一个访问者 。

客户账户的答案

用户自有账户的签名回复,可选择实时查询,并仅在需要时可选择加载。在所有情况下只读;在需要时加载可以明显地降低成本。

退款

助理收集细节和向个人交接的协助退款请求。它从未完成退款。

对话和部件

保持过去的对话,在连接的站点间继续聊天,可拖动的窗口,向来客人要电子邮件,让团队将聊天变成罚单.

部件特性

爱莫吉取取子,带有可选的只贴面模式的附件,AI图像理解,内置图标,麦克风,对讲机按钮,访客声音,附件预览,语音呼叫按钮和会话隔离. AI图像的理解是让访客粘贴出错截图并获得有用答案的由来.

管理信箱、通知和欢迎弹出

访客欢迎弹出,加上你的代理提醒:收件箱声音,桌面通知,低声,无论是私人低声哔哔,还是收件匣民意调查间隔.

支持流量

人体手腕

如何分配对一个人的请求,代理商必须回应的秒数,是否拒绝将聊天返回AI,以及AI在超时到期后是否恢复。在直播前配置此功能,或者一个要求人类的访客只需等待即可。

工作时间

开放时间、时区和关闭时段信息。除这些时间外,人工智能不会提供人类服务。OpsIQ 写作.

AI关机后的答复

第一次回复新消息,当某人已经排队时的回复,以及重复的时间要多久.

离线窗体

显示联系表,而不是聊天。

查票和部门通知

AI的票证意识,因此一个引用出票号码的访客会得到真实状态,而AI可以前往哪个部门。 一个内置的面板显示每个部门的真正收件人,解决方式与通知者解决的方式相同,所以在客户发现某个部门提醒任何人之前,你可以看到这一点。

聊天部件中的帮助中心

让访问者浏览已发布的文章而不离开聊天。 您选择入口、 下栏标签和图标的位置, 以及是否提供完整帮助中心的链接。 默认情况下关闭 。

对话评分

当代理关闭聊天、交接结束或您设定的不活动期之后,星级评级触发。 选择一两个触发点, 而不是全部。

后聊天调查

当访客关闭聊天时进行简短的勘察,其中包含您的问题、延迟、时间规则和每次访问的上限。访客也可以通过电子邮件或下载记录。一个问题得到回答;三个问题没有得到回答。

聊天后电子邮件调查

对话结束后通过电子邮件进行后续调查,可选择使用访客所交谈的语言,对延迟的控制,主题,内语,提问,既要按下按钮标签,也要用感谢行.

答复反馈

拇指上下指向每个AI的回答,喂入质量的仪表板.

对话归档

自动存档数日后,自动解决数分钟后,并删除数日后存档的对话。保留了第三位,与General and Tracking同时进行。

知识培训

助理知道什么,客户聊天里没有其他的事

网站 知识培训

爬行您的站点, 使助手能够从站点中回复。 最多可有10个起始链接、 页数限制、 链接深度以及排除文件夹 。URL 可以在全部爬行之前测试。不包括出账、账号和管理路径。

嵌入层

密码 API 键和模型,将页面变成可搜索的含义而不是关键字匹配。

AI 知识组织者

一击,AI读取每个FAQ,并爬行页面,将其分入类别.

问题,经核实的答案

问答对数被视为最高优先源,每个对数具有状态、重量和类别。JSON,而AI可以从对您业务的描述中写出它们。当助手出错时,写一个FAQ:它排在了爬行的页面后,所以修复是即时的.

高级

业绩和限制

投票间隔、 信件速率限制和窗口、 每个窗口的最大附件大小、 附加尝试, 并允许文件扩展名。 扩展名列表是一个安全控制; 保持紧凑 。

实时交付

即时信息和状态传递,而不是投票,通过普赛尔,阿比利或火地站,有倒计时的投票间隔. 投票对大多数站点来说是罚款的.

推动通知

通过 Pusher Beams 或 OneSignal 向代理设备发出设备提醒,并带有设备利息.

Web 推 (VAPID) (中文(简体) ).

浏览器使用您自己生成的没有第三方提供者的密钥进行推取。 在此生成, 不在危险区 。

语音、视频和屏幕共享

TURN 证书通过限制性网络连接,使用 Cloudflare 或Twilio证书 或你自己的TURN URL,用户名和证书。

收件箱工作流程

代理工作空间设置而非访客设置:分钟后第一回应 SLA,保存队列视图,键盘快捷键和命令调色板,在对话中搜索,以及检查者中的客户出票.

通讯通道

WhatsApp, SMS, Facebook Messenters, Instagram, Telegram, X Direct messages and LINE , 各自都有自己的AI自动重回开关, 外加频道上的AI动作的政策开关、 回复解答和WhatsAapp重新接触模板。 每个频道都与网络聊天在同一收件箱中着陆 。

编辑标签时在标签更新的底部预览。 使用它而不是重新装入您的网站来检查更改 。
设置

设置:模板

每封邮件OpsIQ发送, 以及所有信件的设定。 编辑任何信件的措辞, 并为任何事项撰写自己的模板OpsIQ尚未发送。

一种设计,许多信息

电话 全球电子邮件模板 是包装符:你的标志、头、卡、打字和脚印,中间是空的。每条信息OpsIQ发送被插入到中间。编辑包装器一次,每封邮件都会一起改变 — 票单回复、存储收据、密码重置、订票提醒、PeopleOS信件以及您自己写的任何东西。

无法发送电子邮件OpsIQ。它被应用在每条消息的单个点,所以以后添加的信息不能错过它。

编辑信件

1
打开设置, 然后是模板

信件按内容分类:票和门户、存储、登录和账户安全、预订、谈话和通知、报告、PeopleOS信件以及你自己。

2
按您想要的编辑

你得到这个话题,一个富于文字的编辑 与一个HTML视图中您可以切换到活字, 并预览完好的电子邮件, 确切地说, 与收件人收到时相同 。

3
使用可变芯片

编辑器上方的芯片是变化的事实:一个出票号码,一个订单参考,一个预订时间。单击一个键,将它放在光标所在的地方。

4
保存

只有此信件被写入。 留下一个字段, 它保留它内置的文字; 线上的药丸会告诉你它处于哪个状态 。

💡
您不使用的变量在电子邮件发送时被删除, 其所在的行也随之被删除。 这就是为什么没有电话号码的预订从不发送“ Phone:” 之后再无任何信息 。

写出自己的模板

使用此信息获取信件OpsIQ尚未发送 : 发送通知、 更新提醒、 欢迎包、 许可证密钥 。 它得到所有内置信息 — 编辑器、 预览、 计划规则和您的全球设计 — , 而您自己的系统通过API.

1
按下添加模板

按钮坐落在模板页的上方,并再次放在"你的自有模板"旁边.

2
说吧

名称会成为您系统发送的参考文献, 显示在您输入的字段下—— 例如 x_ Custom_ delivet- blowed。 它不会在之后更改, 因为某些东西已经由它发送 。

3
说它的目的和被寄去的时候

这两行是你和你的同事一年之后在模板页上读到的,价值30秒。

4
列出更改的部分

逗号分隔, 例如: 名称, 当, 跟踪_ link。 每个都变成一个{{variable}}您可以跳入主题或消息, 您的系统会在发送时间填入。

5
写入主题和信件

平话句是好的——换行符成为段落. 仅写 MESSAGE; 标志, 页眉和页脚来自全局模板.

6
创造它,然后打开它

它出现在"你的自有模板"下,带有全编辑器和活预览,与每条内置消息相同.

⚠️
Write the message, not the whole page. A template that carries its own <html> document is refused, because a whole document would slip past the wrapper and your email would go out with none of your branding on it.

发送您的模板

两次呼叫产品API。呼叫者提供接收者和变量——从不使用措辞,从不设计,所以一个集成既不能通过您的工作空间发送没有品牌的邮件,也不能悄悄地改变你对您的客户说的话。

列出您的模板和每个模板需要的变量
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{ "action": "email.templates.list", "mine": true }
寄过来
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{
  "action": "email.template.send",
  "template": "x_custom_delivery_booked",
  "to": "[email protected]",
  "to_name": "Ada Obi",
  "variables": {
    "name": "Ada",
    "when": "Thursday 11 September, 14:00",
    "tracking_link": "https://track.example.com/AB12"
  }
}
💡
变量名称在API收发邮件,请按你输入的形状 把它们放回去

模板和你的计划

您没有服务的信息

上面有“见计划”的链接,没有编辑器——所以你可以看到什么OpsIQ将会发出,什么解锁它。

自己的模板

选择创建时属于服务模板, 或者将其留在每个计划中。 没有该服务的工作空间会看到它列表, 但无法编辑或发送 。

签名、安全、通知和电子邮件测试

从未计划。 不能修正密码的文字重设您接收的管理员, 将错失锁 。

问 题

我能只换个消息吗?+

不,是故意的。设计是包装,它被共享,这是每个邮件都能识别到的。每个消息都是文字、事实面板和您在信件中添加的任何按钮。

如果我按重置的话,我的措辞会怎样?+

重置只出现在全局模板上, 它用内置设计取代编辑器中的内容。 在您按下 Save 之前, 任何内容都不会被写入, 这样您就可以关闭对话框来改变您的思维 。

我错误地删除了其中一个模板。+

删除需要两下, 完全出于这个原因 —— 第一个手臂, 告诉你什么会停止工作。 如果它已经消失, 请再次用同名和相同的引用重现它; 只有措辞必须重新打字 。

连接器或加载器能否带出自己的模板?+

是的,一个邮箱装了个邮箱json在它自己的目录中,它的信息会出现在“开发者模板”下,并带有相同的编辑器、预览、包装和计划门。您的措辞编辑属于您的工作空间,在软件包更新后幸存。

设置

设置 : OpsIQ 写入

票房以书面答复:自动回复,本土票道系统,升级,营业时间,路由和客户端邮件.

自动重读

显示 OpsIQ 写入按钮

在管理员中为您的代理添加写入帮助按钮。

自动重写启用票

排出新票并回复, 并在延迟后回复。 开始检查草稿, 时间为一周。 退款、 取消和访问更改应始终送达个人 。

自动复制部门

哪些部门可以自动重写。任何未列出的都留给一个人,这是安全默认。

答复延迟时间表(分钟)

等待自动回复发送多久。 即时回复读作机器人; 几分钟读作快团队。

按部门分列的最大人工智能回复

每个部的上限,例如计费1支助处3没有盖子,一个模糊的线条可以循环。

回复长度、状态和身份

最大写出符, 答覆后和升级后的票位状况, 自动回复的管理员记录是哪个。 使用一个明确名称的账户, 工作人员可以告诉AI 回复来自人类。

本地售票业务

原生入场券系统

入场券系统 OpsIQ,用于没有外部服务台的安装。

将电子邮件输入本地票

将收到的邮件变成罚单。OpsIQ 提供终点 URL, 认证令牌, 脚本路径和 PHP 二进制。 任何可以发送到该端点的都可以创建门票, 所以要保密令牌 。

多回合答复和延迟及解禁

AI是否继续随着对话的进行而回复,以及它是否等待一个安静的窗口,这样三个快讯就能得到一个考虑的回复。 安静的窗是让自动回复感觉被考虑的最佳单一设置。

公共支助门户

客户端页面,任何人都可以提高并跟踪一张票,可选的欢迎行。其地址和外观在支持门户标签中配置 。

车票号码格式

生成的票号中出现多少个随机字母.

电子邮件客户使用自己的语言

罚单邮件遵循客户语言。员工电子邮件从不改变语言:通知、部门通知、简报和预定报告使用您的系统语言。

鸣谢和确认

新票的固定确认信息, 加上在打开票面、 反馈左出后和关闭票面时的确认信息。 每个票面上都有现场预览。 还有一个全局电子邮件模板包装以及视图后的联系。

AI垃圾邮件筛选

屏幕来自未知发送者的票, 可以自行选择移动可疑垃圾邮件。 请在您看到其判断之前先离开自动移动 。

自动关闭闲置入场券

关闭一张在静默几天后售出的票。 在关闭信息中告诉客户如何重新打开 。

营业时间(SLA日历)

时间区、开放和关闭时间、第一重读和解析计时器的工作日和假日。客户聊天系统下与工作时间分开的日程安排。

自动分配新票

自动分配,可选的只能给在线的代理,具有代理技能和基于技能的路由的匹配敏感性.

推荐的重复票

当顾客打开一张接近他们已有的票时,会发现一个点,并具有可调整的匹配敏感性.

结束后的满意度调查

关闭后一天发送一份调查邮件,结果出现在CSAT的页面上。

以电子邮件通知部门

新票到来后,会给部门发邮件,接收者是该部门的成员,而不是部门邮箱地址,这是入境的地址票到来的地址.

AI可能读作

AI 客户端数据访问

主开关加单个只读权限,用于客户概况摘要、发票、交易、信用余额、产品和服务、域、链接服务器和高级账户概览。从概况摘要开始,并按答复需要添加类别。

升级和知识

启用 AI 票价升级

在回答前将一张票移动到更适合的部门。您选择允许的部门、检查延迟,并可以写出自己的升级通知指示。打开内部升级通知条,以便您的团队了解为什么一个票被移动。

知识环境

回复是否使用客户语言,是否引用了已爬行的链接和FAQs,AI是否读取了图像和 PDF 附件、 知识回复模式, 是否导入 JSON 使用知识,以及源链接是否可能出现。使用被爬行的链接和FAQs应该打开,或者AI在猜测。

人回复后,停止自动重写

一旦工作人员答复,AI就停止回答罚单,没有它,AI可以谈论你自己的经纪人.

车票和电子邮件说明

自由文字指令塑造每个回复的语气和内容,并用一个可加载的范例。请具体说明AI绝对不能做什么。

导入 JSON 知识

上传或粘贴 a JSON 用于写作助理的知识文件。

按钮工作室

客户界面按钮的完整设计者:显示样式、大小、标签、图标、形状、最小宽度、背景样式,主要和次要颜色、梯度角度、边框、角半径、阴影、打字、贴花、闲置动画、徘徊运动和颜色,以及焦点环,加自定义 CSS 框中输入了控件未覆盖的任何东西。

设置

设置: 支持门户

客户介绍网站,人们在那里筹集和跟踪票并阅读您的帮助文章。该标签控制了如何到达和客户如何签名;其视觉设计是在支持门户工作室进行的。

门户工作室或嵌入式票房门户网站:我想要哪一个?.

这两种产品是不同的,人们不断地把它们混为一谈。 他们解决了不同的问题, 和运行两者在一起是正常的。

支持门户工作室:一个您发送客户到的地方

工作室设计 a 完整的支持站点 OpsIQ 给您的主机。它有自己的网页地址,或你自己的域名,并带有整个自助体验:帮助文章搜索、请求表、票房历史、客户签名和助手。通过主题、导航、版式、知识、脚印、品牌、票卡、助理、表格和 CSS,在桌面、平板电脑和电话大小进行预览,然后发布。

使用它的时候 您想要一个品牌目的地,您可以指向每个客户, 您宁愿不构建或维护您的网站中的支持区域。

嵌入式出道口:自有站点内的出道券

嵌入层 仅限您网站页面上的票证体验。客户打开、跟踪和回复支持请求,而从未离开您的页面,而您自己的页眉、导航和设计也保持原样。在部件构建器中设置布局、外观和访问规则,预览结果,然后将嵌入的片断复制到您的页面。

使用它的时候 您已经拥有一个网站或应用程序, 并且您希望支持在其中发生, 而不是将客户交给另一个地址。

简本

工作室正在建设 你送顾客去的地方嵌入舱带出门票 到你的客户已经在哪里。许多企业同时运行,将票务部件嵌入其账户区域,用于内文请求,同时将托管门户作为完整的自助服务目的地,并进行文章搜索。它们是独立的交换机。

地址和访问权

访问模式

门户是否向任何人开放,或仅限于已签入的客户,开放门户获得更多的门票和更多的垃圾邮件.

版式选择

门户和帮助中心是共享一个英雄还是使用两个英雄,这两个都会出现哪个导航和脚印,以及导航部分的标签.

门户地址

顾客使用的地址 选个名字 OpsIQ 显示由此生成的门户和匹配的帮助中心地址。以后更改您已经发送的断开链接。

您的自有域

从您拥有的域为门户服务,例如支持. yourdomain. com.

嵌入式入门票

切换上述的即时切换部件, 打开嵌入式构建器, 您选择了版式、 外观和访问规则, 预览结果并复制页面片段。 这不是 Portal Studio: 工作室设计主机门户, 这样就可以将票放在您自己的站点内。 两者可以同时打开 。

顾客怎么签的

这些是您的客户登录选项。 工作人员登录配置在设置、 安全 下 。

登录方法

签名页面上会显示哪些选项。 连接器和电子邮件签名自动工作 。

社会注册

消费者账户提供者,每个供应商都需要客户身份和秘密,其地址由下列机构提供: OpsIQ 向供应商登记。

单人签名( OIDC)

客户通过身份提供商与发行商签入 URL,客户端ID,秘密和一个可选的允许电子邮件域名列表.

客户 SAML 2.0

密码 SAML 等值单位。OpsIQ ACS 回复的用品 URL和 SP 实体 ID; 您提供 IDP 实体的 ID, 登录和退出 URLs, X. (中文(简体) ).509 证书和可选属性名称。翻转 SAML 在签名方法中,否则它不会出现。

应用程序上的无缝签名

一个签名的深层链接 所以一个客户已经 签入您的申请 土地在门户,没有再次签入。 OpsIQ 提供签名秘密, 门户 URL 和工作空间密钥,是您语言的完整路径(PHP, Laravel, WordPress, WHMCS, Node.js弗拉斯克、干戈、.NET、铁路、爪哇、去和在自办机上安装 OpsIQ 、 服务器本身、 一步步设置笔记、 以及用于签名测试链接的生成器。 在写入任何代码之前使用生成器 。

路线如何运作

您的客户点击一个在路由中指向的支持链接。 路由会发现客户签名到您的应用程序( 一个客人被发送到您的登录和返回), 从您的服务器读取密钥, 签下一个在两分钟后到期的一次性符牌, 并用不引用和不存储头重定向到门户, 这样该符牌不会被缓存或泄露 。

门户的自有符号按下按钮

在Portal Studio, 签名页面, 打开我的网站登录并设置您的登录页面 URL 输入到同一路由中。 opsiq_portal_return (该客户登入的一页);该路由只有在其位于您的门户地址内时才予以尊重,并将客户带回,签入.

WHMCS

无所可写: WHMCS 从远程网站找到的钩子已经将客户端签名到门户网站并处理返回地址。设置您的登录页面 URL 给您的 WHMCS 客户端区域登录 。

到处都签了

出入口签名也会在您的应用程序中签名客户.

收受和保护

请求表格字段

请求表所收集的结构字段。 每个额外的字段都会丢失提交, 所以只询问您需要什么进行分解 。

垃圾邮件和虐待保护

蜂蜜壶和速率限制总是保护公共形式。在顶端,您可以屏蔽一次性电子邮件地址,添加自己的被屏蔽域,并使用 Google reCAPTCHA 或 添加 CAPTCHA 。Cloudflare Turnstile. reCAPTCHA 重用在设置,安全下已经设置的密钥; Turnsttile密钥在此输入 。

门户分析

一份仅阅读的门户网站活动摘要,介绍过去30天的活动。

设置

设置: 权限、 许可证、 线和危险区

系统组,加上决定谁能看到哪个设置标签的团队访问控制.

团队访问和权限

人均权限

每个管理员都获得一套明确的权限,涵盖聊天收件箱的访问,这些权限可以由他们编辑的章节,以及他们的部门。任何具有全管理员角色的人,总是有权限的。设置权限决定一个人看到的标签,因此给予最窄的一组,让他们工作。

许可证

显示您当前许可证、 它赋予您的权利及其状态 。

编程设置

仅自备安装。OpsIQ 显示您运行的预定任务和标签被隐藏。 一条线的 Crontab 驱动每个预定任务: 自动复制票、 升级路由、 汇率刷新、 邮箱投票和连接器同步 。

1
复制行号

标签上显示您服务器的精确的冠状线, 并带有已选择的正确的 PHP 二进制 。

2
加入到crontab上

运行 crontab - e 作为运行 PHP 并粘贴单行的用户。 打开 cPanel 使用 Cron Jobs 工具代替。

3
校验

一分钟内心跳平板就亮了,用跑来测试而不是等待

心跳面板显示上次运行、持续时间和处理的自动重读队列以及电子邮件和连接器民意测验。它警告上一次运行来自手动网络按钮而不是真正的服务器克龙,以及心跳停止时。

危险区

删除全部跟踪数据

抹去所有东西 OpsIQ 您选中要包含哪些内容并准确输入确认词。 设置和站点配置、被封锁的地址、您的团队所写的所有信息( 知识库、 FAQs、 翻译、 门户设计、 动作定义) 和同意收据都保存完好 。

清理数据比旧

同样的扫描仅限于记录比 30, 60, 90 或 为 180 对于自动滚动的保留,则使用通用和跟踪中的保留值,并让预定任务完成。

🚫
从设置中导出备份, 常规后再使用危险区中的任何内容。 这些动作无法被撤销 。
设置

管理你的团队

请团队成员,并分配角色来控制谁可以访问什么.

团队
团队和部门团队屏幕:一张有接触,角色徽章(Owner,Full Admin,Agent)的管理员表,各部门各可以访问.团队和部门工作空间团队和部门+ 保存管理员用户联系人作用部门自动操作[email protected]阿达·奥武苏拥有者全部( A)知识管理[email protected]高祖门萨完全管理员全部( A)RT 调制组[email protected]丽塔·特特赫探员计费斯贝[email protected]探员支助1TEAM邀请管理管理( M)2ROLES业主 完全管理人 代理人3SCOPED各部门的出入
真正的团队屏幕:每个管理员都有他们的接触,角色和他们能够接触到的部门,特工放范围,所有者全员.

角色

拥有者

包括执照、账单和危险区在内的全程通行,每处安装一次。

完全管理员

除了执照和危险区之外,可以全程进入 管理管理员

探员

仅限于指定部门,票房,聊天,分析等仅限.

邀请小组成员

1
转到团队

导航到侧边栏的团队。

2
点击邀请

输入队员的电子邮件 。

3
设定角色

选择拥有者、 完全管理员或代理 。

4
指派部门

特工部门,请选择可进入的部门。

5
发送邀请

他们收到一封带有设置链接的电子邮件.

设置

团队业绩

您的支援团队是如何表现的。 访问是允许的, 而不是角色的: 查看权限打开页面, 管理权限解锁目标, QA 和同事识别符读取, 奖励- 财务权限就是添加 Rewards 标签的。 一个团队领导可以被授予其中的任何一项, 而不会成为完整的管理员 。

团队业绩
团队业绩团队表现屏:代理按复合分数栏,CSAT和每行有付费按钮的奖励平衡来排名.团队业绩工作空间团队业绩助理索雷号CSAT平衡RT 调制组丽塔·特特赫4.8$42支付斯贝萨姆·博滕4.5$28支付知识管理高祖门萨4.2$15支付自动操作阿达·奥武苏4.9$51支付1SCORED综合业绩2CSAT & LOAD评分+分量3REWARDS支付代理结余
真正的团队表现屏幕:每个代理在量和CSAT上打出分数,每行可以有奖励的平衡.

页面是如何组织

团队性能是五个分页,每个分页回答不同的问题,它们被命令的顺序是:通常需要你多么迫切.

01 指挥中心

现场排队状态,客户结果与你的目标对比,能力如何使用,需要决定的情况,以及证据调整的每队指数.

02 队友

领跑板,识别(最有改进和记录),追求,以及选择进入控制谁可能看到排名.

03 质量

计分卡,有记录的评价,机会校正审查员协议,审查员漂移,证据纠纷.

04 奖励

收值,支付债权,以及受管期间分配:授权资金到位上限,审查预览,定稿.

05 历史

工作空间如何随时间演变:带有图表的趋势度量,以及 28- 日覆盖热映射显示团队实际工作时,每张卡都隐藏自己,直到有足够的历史可以绘制它.

无分数不是零

手提量不够的队友——或者其带证据的维度加起来不到所配置重量的一半——被显示为无分数。他们的分数、分数和分数都是空的,而且它们会隐藏故障。这是有意的:将一个没有的测量作为零使某人在有安静一周的排名中处于下方。证据阈值可以按照目标()评分中每个工作空间来配置。

这两个证据阈值可以做不同的工作,值得区分。 最低处理的判断是否某人得到任何分数。 最小评分不影响得分: 它决定奖和奖励资格。 因此,一个队友可以完全得分并排名,并且仍然没有资格在这段时间里获得分数,因为被评分的客户太少。

💡
Every figure is scoped to the workspace you are viewing and the time range you pick. A teammate working in two separate workspaces has an independent record in each. Two exceptions worth knowing: a site GROUP is one workspace, so its member domains are measured together; and the All-sites view deliberately measures everything at once.

实绩指数

由五个维度组成的复合体,每个维度按你设定的目标而不是同僚进行衡量,然后当背后的证据很薄时拉入中间。70 因此,一个微薄的优秀得分被拉下去,一个细薄的差分被拖出去。四个对话的第一个糟糕的星期也不是一个定论。随着证据积累,调整后的数字与原始数字一致。

质量

客户从经核实的反馈中感到满意,如果有质量保证计分卡结果,则予以补充,并对此进行管理。

反应

第一次反应时间在P50和P90百分位,与你的目标相对.

决议

分辨率时间和一触即发率。

SLA

B. 与《公约》SLA您已经配置了, 再加上风险和违反数。

管理

重开和转会率——复出的工作.

💡
重量是可配置和相对的;不必总计 100. 缺少的证据只能降低指数,永远不提高——全部配置的重量留在分母中.

能力和生产时间

占用、生产时间、每个生产小时解决和网上分享窗口。OpsIQ 没有名册或轮班源,替换分母将是一个带有百分比标志的猜测。它读作没有,并附上了这个理由。

⚠️
仅报告。占据情况说明时间是怎样花的,从未花费过多少,而且资金、大门或金额都不可能支付。 没有手柄时间证据的队友认为没有时间,也不可能是零。

质量保证

记分卡是标题审查员对真实对话的评分。 只有已发布的版本才能得到评价,而发布新版本则永远不会重写已经得分的内容。 评论是一次对话的证据,而不是对一个人的判决。

审阅员协议

报告为偶然修正统计(Cohen's和Fleiss' kappa),而不是原始协议百分比。100% 时间,但无信息。

评论员漂移

评论员在同一次谈话中无论系统性的比同事更硬还是更软——与小组其他部分进行比较,而不是一个长期的趋势,需要独立地审查一次以上的互动。

争端

团队成员可以正式争议记录的关于他们的证据。公开争议阻碍奖励期的终局化,直到解决为止。

自评

被拒绝,队友不能提交对自己的评价.

⚠️
AI级评价在发布校正后才能影响报酬,显示模型与人类审查人员非常一致,用Kappa对照最小样本来衡量. 开口意味着模型与人们非常一致以进行计数——这绝不意味着模型是正确的.

承认

单是排名就记录了失败模式:衡量游戏、烧死和公开羞辱最后的任何人。 三种选择都坐在一边。

改进最多

以队友自己的前科衡量, 绝不以同事为标准, 缩小了,所以一个小分母不能买到赢。

断层

连续的时期都满足固定的,宣布的条 — — 平均评级、处理量、评级计数和负反馈率,所有绝对数字。 每个人都可以同时保持一个平稳,因此没有产生排名,而拥有特殊月的同事也无法打破你的排名。

预选入档

默认关闭。 队友总是看到自己的索引; 他们是否看到同事是工作空间的决定。 百分位带可以发布而不是绝对位置 。

💡
承认从来不涉及金钱。 一笔钱不能用来支付或打破,而且大多数改进不是奖项类别。

查询

团队努力争取的目标,以固定的申报栏而不是相互对照来衡量,这样,每个人都可以在同一时期澄清同样的追求。

范围和节制

个人或团队;一次性、可重复或有明确窗口的季节性。

标准

所处理的谈话、收分、活跃日、平均评分或负面反馈率。 所有绝对值 — — 没有衡量其价值取决于同事所做的。

质量警卫

任何任务都需设定量目标。 击中次数而质量低于底部, 则拒绝进行任务, 而不是完成任务, 它被显示为不进行, 不是未完成的 。

重复限制

由最慢标准驱动的每期上限,再加可选冷却后再重复计算.

团队追求

共享进步,没有公布每队归属,因此团队追求不能成为领跑板.

教练会

教练课是记录,不是聊天。它有一个教练、一个队友正在接受教练、安排时间、商定的谈话要点以及随后写出的总结。真正的聊天、门票和QA评价被作为证据来支撑,因此对话的基础就是实际发生的工作,而不是记忆中的印象。

谈话要点

会前同意,所以队友不会走入出奇.

固定证据

会场所附的聊天,门票和QA评价. 披针存储了参考文献——类型和代号——而不是副本,所以总是会指向现场记录.OpsIQ 在接受之前,不核实身份。

行动项目

每一个都有所有者,并且有到期日。一个超过日期的项目显示为逾期——一个衍生状态,而不是必须记住的状态。

私人笔记

教练自己的笔记。 被教练的队友永远不能读到它 — — 而不是作为经纪人,也不是作为经理,也不是主人,支票在所有其他许可之前就已经运行,不能被推翻。

谁能看到一个会话

教练,队友,以及任何有管理团队表现许可的人,其他人,包括同部门的其它队友.

审计

每个创建,更新,被针,解接和完成都记录着变化的事物,由谁负责.

💡
教练是故意与得分和金钱分开的。 课程不会改变任何人的指数,也不会产生奖励,也不会出现在领导板上。

奖励和奖励

记录的活动转换成有您设定的现金值的符号。 支付路径会故意缓慢, 并且记录每个步骤 。

1
设置符号值

多少个符号等于多少钱, 以及每项活动的价值。

2
授权供资上限

对于一个已关闭的日历期, 完整的管理员会声明它可能支付的最大符号。 保存设置表不会授权预算, 也不能更改已经授权的上限 。

3
检查预览

接收者、 保留者和任何不符合资格的理由。 公开的证据纠纷会阻碍这一步骤 。

4
定稿

分配被永久记录在它背后的证据中。 任何分配的时间都无法被取消, 并且重新直接运行。 签发符号的时间必须先倒转 :OpsIQ 写一个针对每个钱包的补偿性条目, 并且从不删除原始内容, 因此分类账中仍然显示发生的事情和原因, 只有这样才释放出时间段。 如果有人已经兑现了超过回收金额的折现, 以及姓名和金额, 则拒绝 。

⚠️
资格要求客户提供经核实的反馈。AI质量分数可能补充这种判断,但永远不会取代它,而显示为无分数的队友没有资格。每个贡献者的上限为:25% 因此,一个数量非常多的月份无法承担整个预算。
💡
账户所有人不参与奖项或象征性奖励,也没有任何切换:他们授权资金上限,并完成所有拨款,而且上面没有人可以批准他们自己支付的费用。 他们的工作是像其他人一样在董事会上衡量、评分和排名。

其他人默认参与,团队领导和包括共同所有者。要让某人离开,在团队和部门中打开他们,并关闭“Takes”奖项和奖励选项。他们的作品仍然得分并显示;从此他们不再是候选人,任何已经定稿的作品都未触及。

⚠️
没有人会为自己批准钱 因为能够参与的人 也是能够批准支付的人 OpsIQ 拒绝付款或信用进入您的钱包, 支付您自己的债权, 结束一个付款期限, 并完成一个会赢的奖项。 另一位完整的管理员或所有者必须这样做 。 支付所有债权都会跳过您的钱包并报告为跳过而非失败 。

谁能看见和做什么

查看团队业绩

工作空间的董事会、现场状态、能力和质量概览。

管理团队业绩

目标与分数,出品,质检记分卡与评价,辅导,征程,以及随身携带同事识别数据如逐个记分历史和授奖历史等读取.

查看团队奖励财务

余额、现金价值、索赔说明和付款参考——与履约证据分开,因为其与工资相接。

仅全管理员

每一个货币都变异:支付奖励、支付或拒绝索赔、授权预算、最终确定、取消或撤销分配以及设定象征性现金兑付率。 这些不能通过许可来授权。

公平使用它,你觉得呢?

业绩指数是管理证据,而不是自动就业决定。 在采取行动之前打开数字背后的源头对话,并权衡案件的复杂性、时间安排、休假和无障碍需求。 单一困难周看起来根本不像一种持续模式。

设置

您的网站( 工作空间)

网站( 工作空间) 允许您管理多个网站 OpsIQ 每个系统都有自己的跟踪、AI、连接器和团队访问权限。

站点
网站站点屏幕:工作空间列表,每个站点都有其域名,类型,连接器,状态徽章和一个开口按钮,外加Add-new-site.网站工作空间网站+ 添加新站点Sshop.acme.com电子商务 Shopify 连接器活动打开Hhost.acme.com东道主 · WHMCS 连接器活动打开Bblog.acme.com内容 ^ 没有连接符设置打开1MULTI-SITE每个工地一个工作空间2ISOLATED数据从不混合3PER-SITE拥有设置连接器( C)
真实站点屏幕:每个站点都是自己的被隔离的工作空间(拥有域名,连接器和设置),从一个列表中添加并打开.

创建网站

1
转到连接的网站

导航到连接站点.

2
添加新站点

输入名称、域名和描述。

3
复制站点密钥

每个站点都获得部件片断的独有密钥( site_ xxx) 。

4
独立配置

每个网站都有自己的AI,连接器和设置.

我能有多少网站?+

要看你的执照计划 检查一下执照细节

设置

许可证和计划

 OpsIQ 许可证管制特征、场地限制和AI信用余额。

许可证
许可证中心密码 OpsIQ 许可证中心:计划,活动状态徽章,口罩牌照密钥,AI-信用计数器,和"力量-远程检查"按钮.许可证中心工作空间OpsIQ 许可证中心计划商业版状态活动OPSIQ-••••-••••-2F9CAI 学分$68 左边强制远程检查1PLAN & STATUS活动,一看2KEYHMAC 本地标注3CREDITSAI 平衡限制( L)
真正的许可中心:你的计划与活动状态,被遮住的密钥,你的AI信用平衡,以及一击力重新验证.
许可证密钥

输入设置 > 许可证。对照 OpsIQ 许可服务器。

许可证心跳/ 验证

OpsIQ 通常读取其已签名的本地许可缓存, 并在需要时刷新验证。 当您需要即时结果时使用强制远程检查; 诊断识别 DNS, HTTPS 或服务器时间问题。

计划

确定特性可用性和限制。

场地限制

工作空间的最大数量 。

AI 学分

如果使用管理AI,你的信用余额在这里显示.

过期

期满前续约,以避免服务中断.

我的执照过期后会怎样?+

追踪、机票和CRM继续。AI 特性暂停,直到更新。数据被保存。

设置

配置文件、密码和两个要素认证

每个管理员可以保持自己的身份,工作偏好,密码和两个因素的认证.

产品屏幕
我的档案剖面描述页将个人细节,语言/时区,相机/签名,密码和两个因素认证分开.我的档案工作空间简 况完成TIMEZONE欧洲/雅典2FA 双向外已启用现场工作现场姓名和电子邮件个人身份编辑语言和时区日期和接口编辑幻相和签名答复和小组的存在编辑密码和 2FA账户保护安全( E)1UPDATE PROFILE身份和地点2SECURE LOGIN密码和 2FA3SAVE应用到此管理员
剖面描述页将个人细节,语言/时区,相机/签名,密码和两个因素认证分开.

配置文件设置属于已签名的管理员, 并且不会更改工作空间品牌。 使用一个独特的密码并启用两个要素认证。 更改电子邮件或认证设置可能需要重新验证或更新登录 。

设置

通知的首选

通知首选项控制在产品或电子邮件中传送到管理员的操作事件。

产品屏幕
通知的首选通知页提供每项事件申请和电子邮件选择,并附有一份最新通知清单。通知的首选工作空间IN-APP打开邮件选择UNREAD4现场工作现场分配的车票应用程序和电子邮件打开客户回复应用中打开SLA风险应用程序和电子邮件打开AI 批准书应用程序和电子邮件打开1CHOOSE EVENTS只有有用的信号2CHOOSE CHANNEL应用程序或电子邮件3审查最近的通知
通知页提供每项事件申请和电子邮件选择,并附有一份最新通知清单。

首选项覆盖售票分配、客户回复、 SLA 警告、聊天交接和AI 批准事件。 保留紧急操作信号在某个地方启用; 关闭电子邮件并不一定会关闭内应用通知 。

设置

安全概览

"安全概览"是第一个用于评估块,登录攻击,威胁会话,安全趋势和事件完整性的屏幕.

产品屏幕
安全概览安全概览将当前风险卡合并,a 14- 日行趋势,攻击者名单,事件信号和完整性状态。安全概览工作空间ACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3现场工作现场自动锁定7- 每日总数和来源趋势最近攻击者IP、国家与理由审查安保活动风险和行动结果种子链式完整性坦佩尔事件链有效1READ HEADLINE目前接触2OPEN EVIDENCE攻击者和事件3ACT 青蒿素综合疗法封锁、调查、出口
安全概览将当前风险卡合并,a 14- 日行趋势,攻击者名单,事件信号和完整性状态。

使用标题卡进行分解, 然后打开相关的审计、 失败登录、 被屏蔽 IPs 或 为 JavaScript 记录级工作的出错页。14- 一天的趋势比一个高峰更有用。在使用永久障碍之前,应对来访者、要求和认证证据进行调查。

设置

Tamper 不言而喻的审计记录

审计日志记录了谁在何时、对哪一方提出异议、在何种风险级别以及是否成功。

产品屏幕
活动审计审计页提供可搜索的不言自明的篡改活动,包括行动、行为者、风险、目标和结果。活动审计工作空间事件18.2kHIGH RISK21INTEGRITY有效现场工作现场启用连接器[email protected] · Shopify成功成绩API 已取消密钥[email protected] • 关键 19成功成绩设置已更改[email protected] • 大赦国际成功成绩权限被拒绝[email protected] • 出口已封锁1FILTER行动、风险和行动者2信息目标和结果3EXPORTCSV 或 为 JSON
审计页提供可搜索的不言自明的篡改活动,包括行动、行为者、风险、目标和结果。

通过行动、风险和行为者过滤; 导出 CSV 或 为 JSON 用于调查的散列链帮助检测缺失或被修改的审计行,但不会取代受保护的备份和限制数据库访问。将审计输出视为敏感,因为它们可能识别用户、记录和安全行动。

业务

诊断

诊断将子系统检查转化为平正英语健康结果并指导下一步行动.

产品屏幕
诊断诊断组对部件、人工智能、门票、集成、现场情报、背景任务进行健康检查,CRM自动化、许可证和储存。诊断工作空间卫生13WARNING2失败1现场工作现场部件灯塔和聊天端点健康,我们不爱背景任务心跳迟到3⁄4 ̄ ̧漯B电子邮件出局测试失败失败连接器书记官处和事件接收健康,我们不爱1REFRESH运行当前检查2OPEN WARNING读取证据3FIX AND RETEST确认回收
诊断组对部件、人工智能、门票、集成、现场情报、背景任务进行健康检查,CRM自动化、许可证和储存。

页面检查站点速度,分级/关键词/后链接/本地数据,AI和动作网关,票务,爬行者/审计,集成/活动收录,背景任务,CRM它故意报告操作者可读的原因,而不是披露原始秘密。

改变后,重新刷新和确认受影响的子系统恢复健康。 绿色诊断页是必要的,但不足以发射;同时完成发射前核对表。

设置

安全和出入

OpsIQ 包含多个安全层以保护您的管理员、数据以及 API 进入。

如何运作
安全和出入启用控制旁的安全屏蔽:两个要素,OIDC SSO, SCIM 2.0,OAuth2 PKCE,CSRF/CSP,,, 中华民国主题 互联网档案馆的存檔,存档日期2013-12-21., 互联网电影数据库(IMDb)上"CRF/ CSP"的资料(英文) IP 防火墙,利率限制和秘密保险库双因素( TOTP)OIDC 单点登录SCIM 2.0OAuth2 PCE 数据交换系统公司社会责任基金+公司社会责任方案IP 防火墙费率限额秘密金库
警卫

安全特征

管理员认证

带有可选 2FA 的电子邮件/密码.

登录锁定

尝试失败太多后临时锁定 。

IP 屏蔽

块 IPs 或CIDR从访问跟踪网站。

威胁分数

基于行为的威胁得分 高威胁的访客可以自动被封禁

HTTPS 执行

所有连接都需要。 HTTP 重定向到 HTPS 。

HSTS 头

严格运输安全 防止降级攻击

保护公司社会责任基金

所有管理形式包括CSRF的符号.

SS保护

所有用户输入被逃脱. CSP头限制脚本执行.

SSF 保护

外出网络用户屏蔽私有/ 内部 IP 地址 地址 请留言 地址

建议设置

1
启用 2FA

给所有管理员的账户

2
强口令

最低 12 字符,混数。

3
审查账目

删除前团队成员的访问权限 。

4
监视失败的登录

每周检查可疑模式。

5
不断更新

快速应用更新安全补丁 。

设置

角色和权限

角色访问控制让您控制每个团队成员能做什么.

角色权限( L)
角色和权限逐个角色能力矩阵:所有者拥有一切;全管理员缺乏计费和危险区;代理员只有范围票.角色权限( L)工作空间设置烧伤危险图表拥有者完全管理员探员scoped13 ROLES业主 完全管理人 代理人2GRANULAR每页+每个部门3DEFAULT-DENY被遗忘的路线被封锁
角色矩阵一览:所有者得到一切,全权管理一切,除了开账单和危险区,特工只获得他们的放范围票.

默认角色

拥有者

包括许可证、危险区和安装管理

完全管理员

除了执照和危险区之外,其他一切都行,可以管理团队

探员

响应指定的部门门票和聊天,查看分析。没有设置、团队或安全访问。

我能创造自定义的角色吗?+

目前没有,三个内置角色加部门任务可以控制颗粒。

设置

已封锁 IPs

管理 IP 无法访问您跟踪的网站。

已封锁 IPs
已封锁 IPs被封锁的...IPs 屏幕:一个块 - a IP/CIDR 表格在一个屏蔽地址表旁边,每个条目、日期、理由和一个解屏按钮。已封锁 IPs工作空间屏蔽一个 IP CIDR / 数据交换中心( CIDRA)203.0.113.0/24理由(可选)被封禁的地址203.0.113.9军 12 * 野蛮势力解开屏蔽45.12.0.0/16军 10 垃圾邮件解开屏蔽102.89.6.2军9虐待解开屏蔽1IP 或 CIDR 范围2LIST何时, 有道理( W)3UNBLOCK一击
真正的被封锁 IPs 屏幕: 屏蔽单个 IP或 CIDR 范围,并管理列表,其中每个列表都有其日期、理由和一击解块。

如何挡住

1
转到安全 > 被屏蔽 IPs

2
添加一个 IP 或 CIDR 范围

示例 203.0.113.42 或 为 203.0.113.0/24

3
添加一个原因

文件原因:垃圾邮件、滥用、刮取等。

屏蔽会影响合法用户吗?+

如果客户共用一家公司 IP 或VPN, 屏蔽这个 IP 堵住上面的所有人 使用狭小的块

设置

登录失败

所有未成功的登录尝试 OpsIQ 管理员。

登录失败
登录失败失败的日志屏幕:账户列表/IPs 包含失败计数,上次尝试的时间,以及每行一个块按钮.登录失败工作空间登录尝试失败账务/ IP失败最后一个行动[email protected] · 41.62.10.472米前,我刚说[email protected] · 102.89.6.2318米前,我刚说未知 ・45.12.9.71226米前,我刚说[email protected] · 88.21.4.921h 刚才1WATCH登录尝试失败2COUNTS按账户计算/ IP3ACT 青蒿素综合疗法挡出行中
真实的登录屏: 每个账户/IP 以失败计数和最后的尝试 从一行堵住凶猛的源头

每个条目显示的内容

日期/时间

当尝试发生时。

电子邮件

使用的电子邮件地址 。

IP 地址

试取之出处.

国家

地理位置.

原因

密码错误, 锁定, 或者找不到 。

警告标志

多次尝试, 相同的电子邮件

密码猜测。 确保启用 2FA 。

多次尝试, 不同的电子邮件

自动攻击 封锁源头 IP.

不寻常的国家

如果你的团队是本地人 外国企图就有可能是攻击

设置

AI 安全分析员

安全网页上一个选择进入的分析层:判决、事件简介、每日摘要、每周一次的姿态检查、问安全,以及0- 隐藏屏蔽政策,它从不运行在访客请求的路径。

每个安全网页记录所发生的情况,但读取它仍然需要判断。AI安全分析师补充说,判断是存在的,而且几乎是一无所成:它从来不坐入信标或登录路径,决定性规则解决明显案件而不使用AI呼叫,判决被缓存,分析师的最佳输出是决定性规则,然后永远以零符号执行。打开特性 设置→警卫; 全部默认关闭.

上面写着

判别芯片+ 解释

已封锁 IPs 和失败的登录行显示一个有信任分数的良性/ 可疑/ 敌对芯片。 解释打开推理、 使用的事实, 并单击一击块/ 释放动作 。 Cached 24h,所以重新审视一个 IP免费的。

事件简介

相关事件组合成一起事件(login wave, URL 扫描、自动挡板破裂),带有一个平版英语时间表,并有一个建议下一步。持续攻击会折叠成同一事件。

每日摘要

一天一次:昨天与你的基线、块块、事件和唯一的事情。 平静的日子将发出一个决定性的全无信号。

每周检查姿势

星期一硬化核对表(2FA缺口、锁定门槛与实际攻击量对比、警报关闭),每件物品都具有严重程度、努力程度和精确的固定。

询问安全

安全概览上的提问框,由您从运行的状态解答。 深服务器问题被交给管理员工程师聊天而不是猜测 。

政策建议+自动驾驶

分析师提出混凝土块规则作为批准/解除卡;核准的规则以活打计数器在零符上执行. 任择自动驾驶只自动批准最安全的规则.

设置

AI 安全分析师(安全_ai_启用)

主开关。 启用判定芯片、 解释和询问安全 。IPs 到达模型, 分批为一个呼叫。

事件简介(安全_ai_事件)

将事件组合成事件, 并写出每个新故事。 运行在现有的小时安全卡通上 。

每日文摘( 安全_ ai_ digest)

钟和"概览"每天重播一次 静悄悄的日子一无所获

每周检查姿势( 安全_ ai_ 姿态)

星期一在概览上加硬化核对表,该核对表具有完全的决定性意义。

策略自动驾驶( security_ai_ autopilot)

让分析师激活其最安全的建议, 无人考虑: 仅可逆的有时间限制的块, 单 IPs 或范围不超过 /24, 从未共享/ 移动/ 私有, 封顶 10 每小时,总是经审计和可撤销的。

💡
每通电话都贴上安全标签,在AI Config中写着自己的月封顶→Cost Guardrails (默认为 300k 令牌) 。 如果被击中, 特性会降低到决定性的读取。 屏蔽、关闭和提醒从不依赖于这个预算。 分析师永远不能删除数据、 更改设置、 触摸审计分类账, 或永久禁止 。
业务

编程和自动化

OpsIQ 使用一款产品调度器来运行电子邮件投票,票务自动化,分析滚动,保留,AI队列,CRM工作,报告和接通工作.

产品屏幕
编程和自动化一个产品卡通 提供心跳; OpsIQ 决定哪些内部工作到期。编程和自动化服务器心跳声每分钟RUNNERcron/all.phpHEALTH设置现场工作现场统一产品跑道opsiq/cron/all.php所需车票和电子邮件队列短期排定工作活动分析和保留内腔计划连接器订阅者宣布的克龙事件范围d1INSTALL ONE LINE运行产品排程器每分钟2CHECK CRON SETUP确认 CLI 心跳3USE DIAGNOSTICS调查工作迟到或失败
一个产品卡通 提供心跳; OpsIQ 决定哪些内部工作到期。

所需产品

为运行的同一服务器和 PHP 环境添加此单行到 crontab OpsIQ:

OpsIQ 产品 crontab 条目
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

替换 /path/to/opsiq 。当主机需要时,例如使用 PHP 的完整 CMI 路径 /usr/bin/php8.4.

不使用顶级 /cron.php 产品工作。 在这个寄存器中,跑者属于本手册以外的一个单独的非产品服务。OpsIQ 产品运行器是 opsiq/cron/all.php.

统一调度器驱动的是什么

车票和AI队列

处理适当的自动复制、升级、批准和其他排队的产品工作。

输入电子邮件

投票者配置了信箱,其中投票是选取的收受方法.

分析和会议

集合会话,在预定的会话到期后刷新会话总量.

CRM与参与

运行已启用的评分、生命周期、工作流程、竞选和计划报告任务。

保留和维修

做好清理,档案,期满和廉洁工作.

连接器

仅为安装、启用和配置的连接器发送连接器用户和投票。

校验 cron

  1. 打开 设置 - 编程设置 并证实产品跑道的存在。
  2. 使用 现在就跑 一次,然后确认管理 和投票心跳更新。
  3. 检查 诊断 用于后心跳, PHP CMI, 数据库或文件路径问题。
  4. 检查 /tmp/opsiq-cron.log 或手动运行失败时选择的日志路径。

保持连接器处理器短,能分解并工作空间范围. 批量长同步并存储光标/检查点,以便下个运行能够安全地继续.

🚫
当产品停止时,按时间计算 OpsIQ 即使普通的管理员页面可能仍然在装入,但工作会停止或延迟。
业务

东道部署行动

一个主持人 OpsIQ 部署使用相同的产品屏幕和工作流程,而主机操作员管理服务器层。商业注册、计划、账单和账户门户程序不在本手册之内。

产品屏幕
东道方部署维护基础设施的托管操作改变;不会改变客户的使用方式 OpsIQ.东道方部署工作空间PRODUCT UI一样 OpsIQINFRASTRUCTURE操作员管理WORKSPACE DATA隔离现场工作现场应用程序运行时间前一頁、网络服务器和数据库管理产品按托管操作员排定校验备份和更新提供方政策和证据审查OpsIQ 设置网站、AI、团队和连接器钉1OPERATE OPSIQ NORMALLY使用相同的产品导航2VERIFY SERVICE HEALTH使用诊断和状态证据3KNOW RESPONSIBILITY将产品设置与主机工作分开
维护基础设施的托管操作改变;不会改变客户的使用方式 OpsIQ.

主办运营商通常管理什么

  • Web 服务器, PHP 运行时间, 数据库服务, TLS 和储存。
  • 统一产品 cron及其服务器级日志.
  • 应用程序更新,基础设施监测和托管协议所定义的备份过程.

痷琌 OpsIQ 管理员仍在管理

  • 网站和部件安装、AI设置、知识、邮箱和客户支持工作流程。
  • 团队进入,各部门,安全控制, API 键、连接器、自动化和数据保留设置。
  • 通过诊断,审计日志,连接器测试以及真实的端到端检查来进行产品核查.

业务检查

不要假设管理服务意味着每个产品集成都是健康的。 请与托管运营商确认最新的备份证据和保留政策, 并使用 OpsIQ 更改后诊断 DNS,电子邮件,AI提供者,网站或连接器.

商业上线、订阅、计费和客户帐户管理仍然不在此部分的范围之内。OpsIQ 手册。

业务

自我接待 OpsIQ

自办的 OpsIQ 安装运行在您控制的基础设施上。您负责运行时间、数据库、TLS、产品折叠物、备份、更新和监测。

产品屏幕
自营自我托管可以控制基础设施 让你的团队负责所有操作依赖自营服务器PHP8.4+DATABASEMySQL 5.7+SCHEDULER每分钟现场工作现场运行时间扩展卷起,出自"Mysql","mbstring", json所需额外延长xml,打开后,拉链,内接后,gd所需数据库选项MariaDB 10.3+ 与 InnoDB 组合键支助运输HTTPS和出入口供应商接入校验1PREPARE THE SERVER匹配运行时间要求2INSTALL AND CONFIGURE使用专用数据库和 HTTPS3ADD PRODUCT CRON运行 opsiq/cron/all.php (韩语).
自我托管可以控制基础设施 让你的团队负责所有操作依赖

最低软件合同

PHP

ưμ㼯A 8.4。需要的扩展:卷曲、 pdo_mysql、 mbstring, json, xml,打开后,拉链,内接和gd。

数据库

MySQL 5.7+ 或 组合键 MariaDB 10.3+ 使用 InnoDB. 创建一个专用数据库和最不偏爱的应用程序用户.

网络服务器

Apache 或 Nginx 配置到此选项 OpsIQ 前置控制器,静态资产和需要重写.

高压电源

管理会话、部件流量、API 键、网络呼和提供者的电话。

出入境

允许 DNS 和 HTTPS 访问 AI,电子邮件,连接器和许可端点。

文件访问

网络和CLI用户必须能够读取应用程序文件并只写到所记录的运行时间/存储位置.

克龙

运行 OpsIQ 产品排程器每分每分,应用程序配置和数据库访问与网络进程相同。

安装顺序

  1. 上传发行到预定文档根并保存所提供的目录结构.
  2. 创建数据库和应用程序用户,然后输入数据库、条形文字 URL 和许可证设置。
  3. 运行安装器/设置流程并创建第一个所有者账户 。
  4. 启用 HTTPS并校验重定向、 cookie 和公共部件/API 路径。
  5. 添加统一 OpsIQ 产品括号 :
自行托管的产品
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. 打开设置 - Cron 设置和诊断; 运行调度器一次并解决每一个失败的依赖性 。
  2. 在添加生产数据之前配置备份,恢复测试,日志保存和更新程序.

安全更新

  1. 修改文件前, 阅读释放注释并检查所需的 PHP/ 扩展 。
  2. 备份数据库和应用程序/配置文件,然后证明备份可以在测试位置被恢复.
  3. 部署新文件而不删除安装配置或运行时间数据 。
  4. 运行所提供的迁移/飞行前程序,并验证登录、部件跟踪、机票、电子邮件、AI、连接器和克龙。
  5. 保留上一个发布和数据库备份,供文档回滚窗口使用.
🚫
顶级寄存器 /cron.php 不是那个 OpsIQ 产品调度器。opsiq/cron/all.php. (原始内容存档于2017-09-29).
⚠️
不删除. schema_cache.json 作为例行维护。 只有在产品指令明确要求重建计划时, 才会删除它 。
业务

生产指南

运行的核对表和最佳做法 OpsIQ 生产中。

生产指南
生产指南连接启用核对表:自定义域和 SSL,AI培训,连接器和克龙,备份和保留,以及团队角色.启用清单工作空间临ぃ璶帝自定义域 + SSL 配置AI 接受关于你内容的培训测试连接器 :\ cron 运行后备计划 · 保留装置分配和审查的团队作用1GO-LIVE发射前核对表2实录领域 · SSL • 备份3CONFIDENT绿色的船
连接启用核对表, 因此没有遗漏任何内容:域名 + SSL,训练AI,测试连接器和克龙,备份和保留,以及团队角色.

临玡

配置 HTTPS 配置

SSL 安装, HTTP 重定向, HSTS 启用 。

运行 Cron

通过诊断页验证.

AI 测试

以顾客身份聊天,检查准确度和语气

已安装部件

所有网页上都使用 Live Feed 验证 。

已配置备份

每日自动数据库和文件备份。

记录出错

PHP 错误日志启用并监视 。

应邀参加小组

所有成员都有正确角色的叙述。

知识基础已具备

起码5-10 条款。

每日:检查仪表板,清票排行,即时检查AI对话.

周刊:审查AI Insights,更新KB,检查团队表现,审查安全.

月刊:审查分析趋势,审计连接器,更新AI培训,验证备份.

业务

发射前核对表

在发布或首次生产启动前运行源码门并完成真实产品检查。 可用的命令不是在您环境中传递的证据 。

产品屏幕
释放核查发布视图显示需要运行的门;它不会按照通过的方式预先给它们贴上标签.释放核查服务器罗马ưμ㼯A 8.4SOURCE GATES本地运行OUTCOME循证现场工作现场需要的扩展套房前检查PHP 语法扫描所有工程的 PHP 文件AI 评价和PHP股存在依赖关系时运行静态和浏览器检查配置时运行1RUN THE CHECKS抓取实际输出2FIX EVERY REQUIRED FAILURE不以假设来取代证据3TEST THE PRODUCT校验真实的用户行程
发布视图显示需要运行的门;它不会按照通过的方式预先给它们贴上标签.

源码和出行门

从安装根运行寄存器检查,并保持其完整输出与放出记录.

飞行前一级出击门
php tools/preflight.php
扩展放出闸门
php tools/release_gate.php

飞行前检查 PHP 8.4 运行时间和所需的扩展,执行 PHP 语法扫描,运行AI 评估船门和完整的 PHBUnit 套件,并在安装这些工具时运行 PHpStan/Node 检查。扩展的闸门还包括烟雾、清洁站/schema 和浏览器在配置其环境时的端到端检查。

跳过检查不是通过。 请记录它为什么无法使用, 安装缺失的依赖性, 或在释放前正确的 CI/ stage 环境中运行它 。

产品检查

1. 认证和作用

签名为每个预定角色;核实允许和拒绝的页面/动作.

2元件和跟踪

在私人浏览器中装入一个真实的站点; 验证信标流量, Live Feed, 访问者和会话记录.

3聊天和大赦国际

提出具有代表性的问题;核实知识的立足点、安全性、升级和AI的历史。

4入场券

通过每个启用的录入路径创建,指定,回复,升级,关闭并重新打开.

5电子邮件

测试出入境的发送, 以及每个配置的入入境邮箱或网路路径 。

6. CRM和分析

创建控制下的接触/交易/转换,并核查仪表板、漏斗、分数和报告。

7连接器

运行连接测试, 一个读取, 一个安全写入/干运行, 以及每个启用连接器的网络hook/ poling路径 。

8. API 和网络呼号

核查窄范围、速率限制、一等功率重试、签名和重复处理。

9缩写。

运行统一产品调度器,确认所有 Cron Setup/Diagnostics 中所需的心跳.

10(a) 安保

验证2FA,CSRF/会话控制,审计分录,密钥吊销和工作空间隔离.

11。备份和恢复

将当前备份恢复到单独的测试环境并验证数据和配置.

12. 可观察性和后退

确认日志/警报,保存请求的ID并证明回滚程序.

⚠️
只有在每个必要的大门和关键业务的旅程之后,才部署有目前的证据来证明确切的释放和环境。
开发者

网上推第三方网站

浏览器按下通知(包括 OpsIQ 推动运动(Push Campaigns)需要一名服务人员从南方生产总公司获得服务。OpsIQ 从您的部件加载 OpsIQ,因此第三方站点无法注册 OpsIQ 直接的工人。 在站点的域中主机一个小文件, 以便推到站点。 运动会通过支持的两种方法来传送 。

如何运作
网络推OS式推力通知上方有两种送出方法卡:Built-in VAPID和Pusher Beams.店铺你的车在等... 10% 今天关机了现在内建( VAPID)无第三方主机文件推放电线使用您的账户接待工人
网络推

为什么要这样

浏览器只允许页面从自己的来源注册服务人员。部件从您自定义的源头中加载 OpsIQ 部署,所以它不能在客户站点上安装推手,直到您在该站点的源头上托管工人,部件静悄悄地跳过推手(没有出错,没有订阅). 您下面有两个选项;OpsIQ 推动运动通过两种方式发表。

备选办法A——自办网络推(VAPID,无第三方)

1. 从你那里下载工人 OpsIQ 部署 : https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. 上传到您的 网络根 所以它可以到达 https://yoursite.com/opsiq-push-sw.js部件 自动检测此路径 页面的源头和注册,不需要修改片段。 (它使用狭义的范畴,所以它永远不会替换您已经运行的服务人员。)

可选 : 如果您必须按非标准路径主机, 请将部件指向它 之前 片段。只有在相同来源时才被接受 :

可选 ^ 只有在文件不在网络根时
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. 单位 OpsIQ,生成 VAPID 密钥(Settings → Client Chat AI → Advanced → Web Push). 部件然后向访客请求通知许可并订阅它们.

CDN/Cloudflare_背后的? 请确定 /opsiq-push-sw.js 返回 HTTP 200 (如果是的话,请清除缓存)404 在上传之前; 缓存 404(将屏蔽注册).

备选方案B-推手灯(管理型供应商)

1. 单位 OpsIQ 设置将驱动提供者设置为 推放电线 并进入你的圆柱 实例标识 财务报告和已审计财务报表 密钥.

2. 现场的Beams服务员是 /service-worker.js复制 https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.js,或将此行合并到您的现有根工作人中:

Beams工人,主机 https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. 就那样,部件自动装入了"取出"SDK 并订阅每个访问者对每个地点的利息 opsiq-site-<your-site-key>不需要其他电线。

运动如何产生效果

推动运动通过 两者 方法:自办VAPID的访客获得加密的网络推取,通过推放Beams订阅的访客获取BeAMs的出版。每个访客通过他们所订阅的任意方式得到联系,这样您就可以在一些网站运行同源的VAPD,在其他网站运行相通的Beom。

需要HTTPS系统 用于服务工作者和 Web Push(本地主机可以免试) 。管理员聊天信箱已经对操作员提醒使用相同的Beams 利息机制。

业务

解决问题

共同的问题和如何解决这些问题。

常规

空白页面+

检查 PHP 错误日志。 原因: 旧 PHp( 需要) 8.4+),缺少扩展名, DB 连接失败,文件权限错误.

显示零+

检查: 部件已安装? Cron 运行? 日期范围正确吗 ? IP 被排除在外?

大赦国际

大赦国际没有答复+

检查: 提供者已配置 ? API 密钥有效( 使用测试连接 ) ? 预算已用尽? 工作空间 AI 配置正确吗 ?

AI给出错误的答案+

检查: 最新知识库? 快速清除 ? 连接器查找返回正确数据 ? 在 AI History 中审查对话 。

AI慢一点+

取决于:提供者 API 速度,上下文大小(大KB = 更多符号 =更慢),网络空闲. 试用更快的模型.

跟踪

部件缺失+

请检查date=中的日期值 (帮助) 页面来源中的脚本? JS在控制台中的错误? CSP屏蔽? Ad阻断器?

未知国家+

未配置 GeoIP 。 使用 Cloudflare (自动)或 MaxMind GeoLite2 数据库.

车票

电子邮件不创建票+

检查: 邮箱连接? Cron 运行中? App 密码更改了吗 ? IMAP 设置正确吗?

自动重写不工作+

检查: 启用? 部门允许吗 ? 配置了 AI? Cron 运行吗? 人类先回答 ?

连接器

连接失败+

检查: 证书正确吗? 密钥过期了吗 ? API 可从服务器访问吗? 碱基 URL 对吧?

已连接但无数据+

检查 : API 密钥瞄准镜 。 启用了 Webhook 同步吗 ? Cron 正在运行 ?

业绩

慢行页面+

选中: 数据库性能 (SHOW PROVIST), PHP 内存( 增加为 1GB),启用缩写,缩短保留期。

业务

部件不记录访问

当部件不正确加载或 Live Feed 保持空时使用此焦点检查 。

部件不是日志访问,验证站点密钥,在私人浏览器中加载页面,检查被屏蔽的信标或部件请求的浏览器网络/控制面板,审查内容-安全政策和广告阻断器,确认站点活动于 OpsIQ。可见的聊天泡沫本身并不能证明分析信标被接受。

参考文献

词汇表

整个用语的定义 OpsIQ.

行动

AI可以通过连接器或平台完成一些事情.

探员

团队成员,有限访问,或AI代理.

BYOK

带上自己的钥匙,你自己提供人工智能 API 键。

连接器

将外部平台整合到 OpsIQ 的插件.

CSAT

顾客满意分数。

发牌

收入机会CRM.

部门

线路和出入控制门票类别.

升级

将一张票搬到不同的部门,或者从AI转到人类.

GeoIP

访客位置检测 IP 地址,请问...

手递

把谈话从AI转移到人类身上

身份标志

签名签名, 显示网站访问者的身份 。

知识库

文章AI用来回答问题.

来客显示购买意图。

领先分数

0-100 数字表示转换可能性。

生命周期阶段

顾客所在的地方:铅,出自"前","客户",有"危",Chorned.

托管 AI

作为《公约》一部分提供的大赦国际 OpsIQ 计划。

管道

视觉交易板阶段。

非洲区域局

角色访问控制。

会 议

在超时窗口内的一系列页面浏览.

站点密钥

跟踪网站的独特标识符。

SLA

服务级别协议,目标响应时间.

调试

AI 文本的单位。大致4字符 = 数字1符号。

信任层

控制AI自主的安全系统.

网络呼号

HTTP 回调事件通知 。

部件

JavaScript 密码嵌入在您的网站上。

工作空间

一个有自己的追踪器,AI,连接器,和团队的网站,和"站"一样.

参考文献

找点人帮忙

如果本文件没有回答您的问题:

行政助理

点击“问” OpsIQ 在管理员中。可以访问此文档和您的平台数据。

支助票

包括:你尝试过的东西,发生的事情,你期望的,以及任何错误的信息.

电子邮件

电子邮件支持您的许可证密钥和问题描述 。

有效支持请求提示

包含页面

哪个管理页面( E)URL 或名称).

包含设置

精确设置名称和当前值 。

包含错误

精确的带有代码的错误消息 。

包含步骤

你做了什么,一步一步来。

包含预期对实际

会发生什么,而发生什么。

💡
您的要求越具体, 回答就越快。 “ 它不起作用 ” 需要调查 。 “ 在 AI 配置上点击保存会给出错误代码 ” 502" 得到一个直接的答案。