电子商务商店
存储追踪每个游客从降落到购买,让AI回答"我的订单在哪里?"使用直播. Shopify/WooCommerce/ BigCommerce 数据. 使用 AI 自动重写管理支持票。 运行批发和 B2B 线索的交易管道 。 将收入分配给交通来源和运动 。 用回收工作流程监控推车的废弃 。
这是完整文件,用于 OpsIQ。设置产品,运行支持,配置AI,管理CRM,安装部件,构建连接器,调用 REST API,接收webhoks,软件包市场应用,并运行自备部署.
什么都行,你这帮混蛋 OpsIQ,在一个地方:每个屏幕是如何工作的,如何连接自己的系统,以及如何在屏幕上建起。从任何地方开始,区域都遵循与管理员侧边栏相同的顺序。
使用 Portal 架构的专用管理员和开发者指南,页面,组件,预览,帮助中心,身份, SCIM,规范释放,扩展,迁移和认证.
管理中的每个屏幕:分析,直播,票房,CRM、知识基础、网站情报、促销和客户账户门户。每个网页都做什么,数字是什么意思,当它们看错时该怎么办。
网站小部件、电子邮箱、入站和出站 webhook,以及适用于以下平台的连接器库: Shopify, WooCommerce, WHMCS, Zendesk, Stripe, Slack 和 Gmail。
连接器构建器,用于无编码连接器、动作和触发器,如果您不愿使用连接器,则使用 REST API 包含每个动作、范围和错误代码。
作用和权限、安保、克龙、诊断、备份以及托管和自托管的部署。
以侧边栏顺序读取屏幕部分。每个部分都打开页面的目的,这样您就可以在有需要时立即停止。
添加设置、 安全性、 诊断性、 Cron 和 Production 。 这些是决定其它是否继续工作的章节 。
从连接器开始,然后是连接器构建器,然后就是REST API 和网友。你应当依部就班地诵读,你必定看见一切迹象。OpsIQ 可以和另一个系统交谈。
OpsIQ是一个完整的AI- First业务操作平台。它取代了您的分析器,实时聊天,帮助台,CRM, SEO工具包、集成中间软件和开发者平台,其中每个工具都共享相同的客户环境。8-12分离SaaS产品,您安装OpsIQ一次,从一个屏幕操作所有东西。
每一个页面载重、点击、滚动和导航事件都会被实时捕获。看看现在的网站上是谁,他们正在浏览什么网页,花费了多长时间,以及它们来自何处,都没有任何第三方饼干。
每个访问者的全部历史都包含设备、浏览器、操作系统、国家、城市、参考者、UTM参数、登陆页和身份分辨率。会话组的页面查看行程,以便您看到访问者所走的整个道路。
时间线式的回放 。 请确切地看到用户所做的 : 鼠标移动、 点击、 滚动、 页面转换、 并形成互动 。 用它来诊断 UX 问题, 理解下拉点, 并验证转换流量 。
实时访问者活动。 请查看页面浏览、 聊天开始、 格式提交和意向信号每隔几秒钟更新一次 。 按国家、 设备或参考器过滤以聚焦特定的流量段 。
页面按访问、 约定时间、 弹出率、 转换率、以及支持活动排序。 请确定您最出色的内容和需要改进的页面 。
国家、城市和区域的地图分解,设备和浏览器的分发、交通源分析、搜索引擎查询器跟踪和市场渗透。
跟踪访客意向信号(定价页面访问,重复返回,文档浏览模式,支持互动),以识别可能购买,churn或需要帮助的访客.
在您的网站上直接运行拆分测试 OpsIQ。创建变量、设定流量分配、定义转换目标并衡量统计意义。不需要外部测试工具。
抓取客户端 JavaScript 自动查看错误消息、 堆栈跟踪、 受影响的浏览器、 频率计数以及触发错误的页面。 调试前端问题, 不另进行错误监测 。
每个可被跟踪的事件(页面浏览,自定义事件,聊天互动,表单提交,购买)都包含有完整元数据的可搜索可过滤日志.
追踪订单、收入、退款、续订、以及交通来源、活动和游客旅行的属性转换。
由行为模式识别的高意向访问者. 分数线索基于页面访问,现场时间,回回回频率,支持交互,以及自定义信号. feed引导直接进入CRM管道.
自动爬行您整个网站, 以发现页面、 检测断开的链接、 找到缺失的元标记、 检查图像替代文本、 验证空格 URLs,并绘制您的站点结构图。每天、每周或按要求运行的时间表。
综合技术分析:页面速度分数、移动响应能力、核心网络维生素、SSL 证书状态,重定向链条,重复内容检测,爬行深度分析,以及结构化数据验证.
评价每一页的内容质量、字数、可读性、关键词密度、标题结构、内部/外部链接比率和新鲜度。找出内容薄、重复的页和内容差距。
语义搜索您整个网站内容。 询问自然语言关于您内容的问题, 并获得AI- synthemated 答案, 以及源页面引用 。
监视搜索引擎在谷歌和其他引擎中的目标关键词的排名。跟踪位置随时间而变化,与竞争对手进行比较,并查看哪个页面排列了哪些术语。
以您的内容、 竞争者分析和搜索量数据为基础, 发现关键词机会。 获取新内容主题、 长尾变异和内容优化目标的建议 。
监视您的输入链接配置。 查看哪些站点链接您, 跟踪新的和丢失的链接, 分析主锚文本分布, 并识别链接构建机会 。
对于有实际位置的企业: 将本地搜索的能见度直观地显示在一个地理网格上。 查看您的排名如何因位置、 距离您的业务和搜索意图而变化 。
连接您的 Google 业务简介 OpsIQ。同步评论、文章、QQA、相片和商业信息。从内部管理您的英镑列表。OpsIQ 回应审查,发布帖子,并监督见解.
自动的SEO和分析报告(每日、每周、每月),包括排名变化、流量趋势、发现的技术问题和内容性能。白标签输出可供各机构使用。
AI在您的网站上解答客户问题 24/7使用您的知识库、连接的平台数据(订单、账户、订阅)和自定义培训提示。支持多个 AI 提供者: Claude ()Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google)和格鲁克(xAI).
管理员面板内部的AI副驾驶,帮助您撰写出票回复,起草客户通信,分析支持趋势,在连接的平台上查找客户数据,并通过连接器系统执行动作.
AI 是基于您的知识库文章、 FAQ 条目、 产品文档和连接的平台数据。 它不会产生幻觉。 它从您的实际商业信息中解答,或者在不确定时会升级。
当AI无法解决一个问题,检测出挫折感,或者客户要求人类时,它会自动地将完全对话的上下文交给你的团队. Configable definit/timout auto-return back to AI.
为客户界面AI和管理员界面AI编写单独的指令提示。控制语气、边界、升级规则、被禁话题和特定商业行为。支持每个工作空间配置。
每一次AI对话都记录了全部请求/答复细节、象征性使用、成本跟踪、供应商使用和模型版本。 审查对话,以查明培训差距并改进AI的准确性。
对AI对话模式的自动化分析. 见常见问题,解析率,交接频率,客户满意程度按话题,以及AI需要更好培训的领域.
每个相接站点/工作空间都可以使用自己的AI供应商,模型,温度,符号预算,以及培训提示. A SaaS公司可以使用克洛德来做主要产品,而GPT-4o可以使用副品牌.
两个AI模式: 管理AI(包含在你的计划中,没有)API 或带出自己的密钥(使用自己的密匙) OpenAI/Anthropic/谷歌/xAI 音乐 API 键,用于完全控制模型选择和成本。两者都是一等的,每个特性都使用两种模式。
设置每月象征性预算、 每位对话限制和低余额提示。 每个提供者、 每个工作空间和每个谈话的跟踪支出。 防止使用硬顶的逃逸成本。
与部门、优先事项(低/中/高/紧急)、状态、SLA跟踪、内部笔记、客户答复、文件附件和线性对话等完全的服务台。不需要外部服务台。
AI自动按部门和优先级对进站门票进行分解。 启用自动重写安全门票。 AI在可配置延迟( 默认) 后起草并发送回复 : 2这样人类才能先介入
连接邮箱( Gmail, IMAP,或提供商专用的)自动从入境邮件中创建出票。对出票通知邮件的回复更新出票线索。
在您的网站上嵌入一个客户端的出票门户。客户可以提交出票,查看其历史,回复开出出出票以及检查状态,所有都标注在您的设计上。
将重复的门票合并成一线. 合并门票在主题线上显示[Merged],所有对话历史保存在幸存的门券中.
人行代理接手一票后,使用"回AI"让AI恢复自动再版的该票,当人行部分解决后有用,但客户有AI能够处理的后续问题.
由收件箱视图提供的AI辅助出票管理. 副驾驶建议回答,总结谈话历史,建议优先/部门任务,并可以在连接的平台上执行动作.
实时客户聊天由统一的收件箱管理。 查看所有活跃的对话, 客户身份, 对话历史, 以及AI的建议。 多位代理可以合作谈话 。
基于访客行为的触发聊天信息:页面上的时间, 特定 URL 访问、 滚动深度、 回访次数、 退出意图或自定义事件。 例如: 显示帮助消息 60 秒,在定价页面上。
嵌入在您的网站上的自定义聊天部件。 支持 AI 聊天、 直播代理聊天、 文件提交、 知识库搜索和访客身份。 响应性、 可访问性和品牌性 。
聊天和票务互动后收集客户满意度评级。设计调查时会提出自己的问题、评分尺度和后续提示。结果反馈到团队业绩和AI的洞察力。
聊天结束后,有已知邮件的访客可以收到一封带有AI摘要的被处理内容的有名邮件并点击"Wes it easy"一击"是/否. 每条线索一次,签名单用链接,每封发送记录,结果在回馈页面上作为自己的信号登陆在聊天中星旁边.
每个带一个人的反馈项目都显示:姓名、电子邮件、点击到他们整个客户行程以及CRM联系人,并按其实际历史单击Email或AI-草稿答复。
单独的 AI 撰写助理,负责 电子邮件草稿、 票单回复、 公告和客户通信。 使用自己的即时( 不是聊天大脑) 来撰写专业的商务文件 。
显示您全部内容的单一屏幕CRM状态:管道值、交易速度、即将完成的任务、风险交易、代理活动和AI建议。CRM主页是您每天的起点。
管理客户联系人,其信息有完整配置:姓名,电子邮件,电话,公司,标签,生命周期舞台,对话历史,票房历史,购买历史,以及自定义字段. Link contact to company for B2B关系管理.
视觉 Kanban 风格的交易板上可自定义的相继阶段。 将交易拖放到相继的相接阶段, 设定值, 指定所有者, 跟踪关闭日期, 并查看每个相继步骤的管道值。 支持多条管道 。
AI分析每一项交易并提供指导:风险信号(经过了安静,提到的竞争者,预算问题),次好的行动建议,赢概率,以及建议的后续时间.
报告包括按阶段、所有者、来源、换算率、平均交易规模和销售周期长度分列的预测。
AI-动力探矿从您的访客数据中识别潜在的客户,引导信号,以及连接的平台活动。 建议拓展目标,起草初始信息,并评分领先质量。
自动多步骤的跟踪序列: 电子邮件、 等 、 电子邮件, 检查响应, 升级。 定义新线索的序列、 被搁置的交易、 购入后检查和重新接触活动 。
跟踪客户生命周期阶段(铅、前景、客户、突起),自动过渡。
AI代理 持续清理和丰富你的CRM数据 : 复制联系人、 填充缺失字段、 验证电子邮件、 标准化公司名称、 和旗下陈旧记录 。
自然语言CRM配置:告诉AI你的销售过程是什么样子,它构建了您的管道阶段,自定义字段,交易模板,以及自动化规则.
自动审计您的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和简单的签名方案、平面图(平面、页面、光标和链接标题)、列表/错误转换、多行动上下文和市场包装。
连接器BuilderAI 帮助您构建连接器:描述您想要的并推荐动作,写请求处理器和地图 API 响应。自动处理认证、页码和错误处理。
一般应用 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工具在更新后重新签名 。
连接器动作的解析模糊比对系统。定义查找规则和 OpsIQ 匹配用户查询到使用模糊分数和智能Rank算法的平台实体。 例如: find_country ("germ") 匹配德国与 88.9% 自信,你应该相信
将军OpsIQ API发布每个注册JSON操作为可发现的命名动作。使用元. 动作进行实时的完整和准确的打字合同; 连接器包通过统一的ActionExecutor来声明自己的供应商行动。
预建的工作流程配方,将多个连接器动作结合到共同的业务工作流程中来. 例:"当新订单被接入时, Shopify,创建出票,更新CRM,并发送 Slack 通知".
连接者声明与AI知识库同步的知识主题. 平台特定帮助文章,设置指南,和故障排除步骤在AI没有人工知识条目的情况下自动提供给AI.
一个名字 JSON API 覆盖每个注册管理员 JSON 操作,与API-键认证,工作空间隔离,范围,速率限制,一能写作,OpenAPI,以及生成的Postman收藏.
所有重大事件的出网选择:订单、发票、订阅、门票、聊天、线索、用户注册和推车弃用。15 连续失败。
每个出站的网络hook都与 HMAC-SHA256. 验证您的接收端上的签名,以确保网络huk的真实性。 Stable event_id 用于一能处理 。
JavaScript SDK 用于包含身份解析、自定义事件跟踪、程序聊天控制和页面特定配置的跟踪部件。安装 React, Vue, Next.js 的食谱。WordPress, Shopify 静态 HTML.
用于通用框架的服务器侧 SDK 和插件. WordPress 插头, WHMCS 模块,以及通用的 PHP/Node.js 集成库。
推动自定义事件 OpsIQ 从您的后端: 购买、 签名、 特性使用、 错误或任何商务事件。 事件出现在访客时间表中, 并输入分析语句和 AI 语句 。
构建事件所触发的自动工作流程:新票,聊天开始,访客身份识别,交易阶段变更,或自定义事件. Triggers执行连接器动作,发送webhooks,更新记录,或通知您的团队.
视觉 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系统之间迁移的数据可移动性。
OIDC( 美国)OpenID Connect),全程运行的单笔签名:发现,授权,召回,JWKS签名验证,用户信息,域名允许列表,JIT提供,以及状态守护. SAML 配置支持.
内建DSAR(数据主题访问请求)处理:在所有系统导出并删除客户数据. 联系层数据擦除覆盖会话,门票,聊天,CRM同意管理和保留政策。
特定区块 IPs 或范围从访问您的站点或管理员。在可配置失败的登录尝试后自动关闭。失败的登入日志 IP,时间戳和用户代理。
HTTP 严格运输安全,权限政策头,以及安全的饼干配置. 自托管的部署可以通过服务器配置添加 CSP 头.
SSRF 守护屏蔽到私有/元数据 IP 区域。Async 发送可防止慢端点阻碍您的应用程序。自动失效后 15 连续的失败可以防止死点的资源浪费。
工作空间之间的严格数据隔离,访客,票房,聊天,CRM记录,以及AI对话被范围化到工作空间,跨工作空间数据泄露在查询层被防止.
支持月、季度、半年、年度、两年期和终身计费周期,货币正常化用于多种货币网关,在收款后进行FX转换以准确报告收入。
构建用于计划任务的Crun系统:报告生成,数据清理,订阅续订,AI培训更新,连接器同步,以及webhook重试. 健康诊断有警告指标.
配置访问者会话、聊天记录、AI对话历史和事件日志保留时间。自动清理旧数据以管理存储并遵守保留政策。
系统健康仪表板显示克龙状态,数据库连接,AI提供者状态,连接器健康,webhook送出率,以及存储使用. 配置问题和性能瓶颈警告.
追踪每个游客从降落到购买,让AI回答"我的订单在哪里?"使用直播. Shopify/WooCommerce/ BigCommerce 数据. 使用 AI 自动重写管理支持票。 运行批发和 B2B 线索的交易管道 。 将收入分配给交通来源和运动 。 用回收工作流程监控推车的废弃 。
监视测试的签名和特性的通过并重放会话 。 跟踪文档页面转换的路径。 自动支持 AI , 植入于您的 API docs. 管理订阅收入和客户关系管理系统的扩展交易。 连接您的计费平台( Stripe, ) WHMCS)用于实时核磁共振跟踪。使用CRM生命周期剂检测和防止churn。
向客户端提供白标签分析及支持门户。 从一个管理员处获取多个客户端的跟踪线索。 使用 CRM 管道管理前景和项目线索。 为客户端平台建立自定义连接器, 使用连接器构建。 创建标有品牌的 SEO 报告, 并创建网站智能。 重新出售市场连接器作为增值服务 。
深处 WHMCS 与 80+ AI 搜索订单、服务管理、DNS 自动重温常见的托管问题,使用知识库文章。跟踪服务器状态页面的操作。用AI分类管理技术支持票。使用计费周期梯级,每月到终生托管计划。
抛出 40-70% 以您的知识库为基础,使用 AI 聊天重复提问。 途径 IP 分解 。 跟踪团队在解析时间、 SLA 合规度和 CSAT 的运行情况 。 请使用 AL 来起草专业答复 。 用 AI 对AI 的见解来监测支持趋势 。
全站智能套件:爬行,技术SEO审计,内容分析,SERP排名跟踪,关键词研究,回接监控,以及本地SEU网格. Google Business Profile 管理. 客户的定期白标签报告. A/B测试在跟踪部件中被构建. 运动归属遍及所有频道.
开始只是跟踪和聊天, 可以免费添加。 然后在获得支持量时添加入场券。 在开始销售时打开 CRM。 在您采用时连接平台 。OpsIQ 从一个人做所有事情到一个 50- 人员行动组与RBAC,各部门, 和每名特工的性能跟踪。
企业 SSO 与 OIDC 进行集中认证。多工作空间隔离,用于单独的品牌或分区。每个工作空间的AI配置,有不同的提供者和模型。自定义连接器开发与市场分布。审计线索, GDPR 遵约工具和数据保留政策。
网站全面分析 访问者追踪,会话回放,页面排名,地理智能,意向漏斗,转换归属,事件,A/B实验,JS错误跟踪,都方便隐私,都在一个平台上.
AI有权力的客户聊天,以知识定位,多提供者AI支持,自动向人掌权,主动聊天规则,对话历史,CSAT调查,以及从聊天中创造出票.
原产地售票系统与部门,优先,SLA,AI分版,自动重回可配置延迟,电子邮件摄取,入票嵌入,入出票合并,收件箱副驾驶,并返回AI能力.
AI-First CRM,拥有四个专门的AI代理(Steward,SDR,保留,分析员),Trust Dalic自主控制,管道板,交易导师,预测,序列,生命周期管理,以及自然语言的CRM配置.
站点情报系统有自动爬行,技术SEO审计,内容分析,AI搜索,SERP排名跟踪,关键词研究,回路分析,本地SEU网格,以及计划白-标签报告.
连接器 SDK 与 25+ 预建的连接器、连接器构建器(无编码/AI辅助/全码), OAuth 流程,webhook自动注册,一个大型的连接器动作定义目录,只有在相关连接器安装,启用,配置和验证,SmartLookup, market, 以及签名的软件包时才能执行.
完整的 GBP 连接器:审查管理,邮报出版,QQA管理,相片上传,业务信息同步,洞察力跟踪,以及AI 驱动的审查响应,全部来自内部 OpsIQ.
由注册驱动的电子邮件模板,包含可视化编辑器,活预览,可变芯片,全局布局控制,以及所有自动化通信的每个事件定制.
内设团队绩效:解析时间,工作量,SLA合规,CSAT按代理、重开费率、最繁忙的时数、实时存在跟踪和每个部门分解。
原生的 。DSAR 处理、所有系统的数据消除、同意管理、保留政策和审计线索,都建在平台上,而不是紧贴上。
OpsIQ 运行在管理下的基础设施上。产品操作相同;基础设施、更新和备份由主机操作员处理。本手册记录 OpsIQ 运行时间,而不是营销或商业账户流动。
安装 OpsIQ 在您自己的服务器上对数据、品牌、更新和集成进行全面控制。需要PHP 8.4+, MySQL 5.7+ 或 组合键 MariaDB 10.3+, HTTPS, 以及 OpsIQ 统一括号。支持 WHMCS 集成为外加模块。完全数据主权。
跟着 30- 一分钟设置指南,以获取跟踪,聊天, 和基本AI工作在您的网站。
学习如何读取访客数据,设置会话回放,识别线索,了解交通规律.
运行你的第一次SEO爬行,检查你的技术健康, 并设置SERP级别跟踪 你的目标关键词。
设置部门, 配置自动重读 AI, 连接电子邮件摄入, 并训练您的 AI 处理常见的问题 。
组织联络人,建造管道,配置AI代理,设定信任拨号级别,让AI指导您的交易.
连接您的电子商务/ 帐单平台, 构建自定义连接器, 设置网点, 并通过 REST 集成 API.
遵循这些步骤,以获得 OpsIQ 运行中。每个步骤都以上一个步骤为基础。到最后,您将会有访客跟踪、人工智能聊天和基本的票务支持。
输入您的驾照密钥 OpsIQ 管理器。 转到设置, 输入为此安装提供的许可密钥, 点击激活。 您应该看到绿色的“ 主动” 徽章 。
设置并填写您的商业名称、 行业、 时区、 默认货币、 支持时段。 这些信息被AI 用于回答客户问题, 以及分析时区报告 。
转到 AI 配置并选择您的提供者。 选项: Claude ()Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google) 或 Grok(xAI) 。 请输入您的 API 键,如果您使用自己的密钥,或者在您的计划中可用时使用管理AI。单击“测试连接”进行校验。
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.
如果您使用 Shopify, WooCommerce, WHMCS,或者另一个支持的平台,去连接器,找到您的平台,输入证书,并点击测试连接。这使AI访问命令数据、客户配置和支持上下文。
前往团队,点击邀请,输入他们的电子邮件和角色(Owner、Full Admin或Agent). 代理只能访问您指派给的部门。所有者和Fuill Admits看到所有的东西 。
复制连接网站的片断并粘贴在您的网站上。 这样您就可以立即跟踪 。
转到 AI 配置, 选择一个提供者, 输入您的密钥并保存。 AI 现在正在您的网站上活动 。
你现在有访客跟踪和人工智能聊天 你可以加票CRM,然后连接器。
转到知识库添加5-10 有关您常见问题的文章。AI用来准确回答客户。
转到入场券并至少创建2部门(如"销售"和"支持"),各指派出团队成员.
前往AI训练并写一个客户AI提示,描述你的业务,语气,升级规则.
打开您的网站, 并作为一个客户与 AI 聊天。 请检查答案是否准确, 音调是否正确 。
建立一个邮箱(Gmail, IMAP,或者提供商连接器),所以客户电子邮件会自动创建出票.
启用安全部门的自动复制票。设置一个2- 耽误一分钟,人类可以先介入。
每日检查 Dashboard。 请查看访客数、 弹跳率、 顶端页面, 如果跟踪连接的话, 销售量 。
打开AI CRM 并让OpsIQ从您连接的平台导入联系人。请检查管道板。
请检查AI History周刊。 查找错误的答案、 错过的问题和增加知识的机会 。
创建一条规则: 如果访问者在价格页面上 60+秒,显示聊天信息,询问是否需要帮助.
如果使用一个没有内置连接器的平台,则使用连接器构建器来创建一个.
连接 OpsIQ 使用外出网标进行售票、聊天和销售活动。
是的 人工智能提供者是可选的 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交易辅导(风险信号、最佳行动、赢概率)、收入预测、探矿代理(SDR)、自动后续序列、生命周期和留存管理、数据管理代理(dedup、丰富、验证)CRM(自然语言设置),CRM配置, 用于CRM健康检查、信托电话(自动驾驶/副驾驶/每名代理人手册)、4个专业代理(斯特沃德、特别提款权、保留、分析员)CRM API与网络呼喊。
自动化网站爬行,技术的SEO审计(速度、移动性、核心网络维生, SSL,再定向,结构化数据),内容审计(字数,可读性,关键词密度,标题结构),AI动力语义搜索,SRERP排名跨引擎跟踪,关键字研究并附有机会评分,回路分析和监测,本地SEO网格可视化,Google Business Profile同步(回顾,帖子,QQA,相片,见解),计划报告(日/周/月)和白标签 PDF 各机构的产出。
客户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浏览,支持交互,以及带有转换概率的自定义信号.
可搜索事件历史:页面浏览,自定义事件,聊天,购买,格式提交并附有完整的元数据并过滤.
分拆测试:创建变体,分配流量,定义目标,测量意义,并宣布胜者,全部来自内部 OpsIQ.
前端错误抓取:消息,堆栈痕迹,受影响的浏览器,频率,受影响的页面,以及趋势跟踪.
收入仪表板:订单、续签、退款、按来源的归属、竞选业绩、期间比较和趋势分析。
领跑管理:分数,源归因,CRM状态,联系方式,行为信号,和管线通路.
满CRM:指挥中心、联系人、公司、交易、管道板、辅导、预报、探矿、序列、生命周期、数据管理员和健康。
支持收件箱:部门,重点,SLA跟踪,AI分解,自动回存,内部注释,文件附件,合并,以及状态管理.
活口对话:AI与人聊天,交接,合作,对话历史,客户身份,和CSAT相收.
电子邮件管理:入站邮件到出票,AI辅助回复构成,模板选择,和邮箱配置.
提供者设置: 选择 Claude/GPT-4o/Gemini/Grok, 输入 API 键或启用管理的AI,设定模型,温度,以及每个工作空间的符号预算.
即时作者:客户迎面和接地的提示,升级规则,调子准则,被禁话题,和边界配置.
谈话审计:完整的请求/答复日志,信使使用,每个谈话的费用,提供者,模型版本,以及解析结果.
模式分析:常见问题,解析率,交接频率,按主题分列的满意度,以及培训差距的识别.
AI培训内容:文章,FAQ条目,产品docs,连接器知识,以及自定义条目. Semantic and keyword search for AI slooting.
集成枢纽:已安装的连接器,健康状况,动作盘点,证书管理,市场浏览器,和连接器构建器.
站点管理:跟踪片段,站点密钥,部件配置,域名设置,以及每个站点的工作空间隔离.
用户管理:邀请成员,分配角色(Owner/Full Admin/Agent),设置部门访问,管理权限.
行动衡量标准:分辨率、工作量、SLA合规,CSAT重开费率 最繁忙的时数和趋势分析
配置:企业身份、AI设置、跟踪、安全、品牌、保留、电子邮件模板、账单、进出口、诊断和危险区。
计划管理:许可证状况、计划特征、使用指标、续约日期以及升级/下级选项。
登机之旅将新的装置变成工作 OpsIQ 工作空间,并且可以离开和恢复,而不会失去进展。
行程存储每个工作空间的完成量。返回登入时应当显示已完成的步骤,而不是强制重启。
分析中心将支持、聊天、AI、访问者和代理报告带入一个可输出结果的经枣滤的工作空间。
使用分析枢纽进行跨团队审查;在需要记录级调查时,使用专用访问者,票房,CSAT,AI历史和团队性能页面.
Dashboard 是您的日常指令中心。 它在一个视图中显示流量、 销售量、 支持负荷、 AI 活动和转换指标。 每天早上打开它来了解一夜之间发生的事情, 今天需要注意什么 。
您的网站上现在的人数。 此数据将更新到 15 秒( 可配置) 。 如果访问者在活动阈值内加载了页面( 默认 : 90 (第2行,第3行) (中文(简体) ).
有多少不同的人在选定的日期范围内访问您的网站 。OpsIQ 以浏览器指纹、饼干和(如果有的话)认证身份组合识别访客。
新访客首次访问您的网站。 返回的访客已经见过。 高返回率意味着您的内容会带回人们。 极低的返回率可能意味着您不会保持利息 。
仅查看一页后离开的访客百分比。70% 在登陆页面上通常表示该页面没有满足访客的期望,内容错误,负载缓慢,或者移动体验差.
访问者平均花费在每一页上的时间有多长。10 在内容页面上显示的内容没有涉及。在页面中显示的很长一段时间可能表示混乱。
IP解决 OpsIQ 根据威胁分数、野蛮武力企图或手动块,识别为潜在恶意。单击可查看被屏蔽 IPs 列表中选择一个选项。
相关销售来源的收入(美元)Shopify, WooCommerce, Stripe。如果销售显示为零,请检查您的平台连接器是否已经连接并同步。
显示访客在选定日期范围内的行图。 查看模式: 交通高峰( 运动、 媒体提及)、 水槽( 周末、 节假日) 和持续趋势 。
访问者来自以下地点: 直接、 Google、 社交媒体、 电子邮件活动、 转介站点。 请用这个来了解哪些营销渠道在起作用 。
Chrome、Safari、Firefox、Edge等。如果浏览器的回弹率异常高,你可能会有 CSS 或 为 JavaScript 兼容性问题。
显示每周小时访客活动的网格。 请用此网格来决定何时安排支持班次、 何时发送通知、 什么时候进行升级 。
少数访问者有国家、网页、设备和来源。 在竞选期间,他们可以快速抽查。
点击 Dashboard 右上角的取日期器。 预设: 今天、 昨天、 最后7天数, 最后一个 30 天数, 本月, 上月, 自定义范围。 当您更改范围时, 所有仪表盘卡和图表都会更新。 日期范围位于您配置的时区( 在设置中设置) 。
检查 : (1) 特定登陆页有变化吗? 转到顶端页面并按弹出率排序 。 (2)运动是否将流量发送到错误的一页? 请检查顶端源头是否有新的裁判员。 (3) 移动中站点是否断开? 检查浏览器断开的移动回弹速率 。 (4检查威胁柜台和访客详情,看看可疑的图案
检查 : (1) 跟踪部件已安装吗?查看您的网站源代码并搜索 OpsIQ 脚本. (正文).2) 站点密钥是否正确? 将脚本中的数据站点- 密钥与连接站点中的密钥进行比较 。 ()3CDN 或缓存是否服务于没有脚本的已死页? 清除您的 CDN 缓存 。 (4) 广告阻塞器或CSP头封堵了脚本吗? 请检查浏览器控制台是否封锁了请求 。
这是B2B交通模式,您的访客在上班时间工作专业人员浏览。1(b) 安排工作人员工作日工作时间。2星期二至星期四上午发送电子邮件活动。 (3)周末维护窗口安全.4考虑只在高峰时段提供现场聊天。
到访客那里去,然后通过时间窗口过滤。 请检查 : (1) 他们是真正的访客还是bots?看看会话持续时间,页面浏览,浏览器的多样性。 (2如果是真的,他们登陆的是什么页?3)检查裁判 URL 可能有人与你联系过 Reddit, Hacker News, 或一个受欢迎的博客。 (4如果是机器人交通,则检查威胁并考虑封锁 IP 范围。
OpsIQ 它使用浏览器指纹和饼干,而GA则使用不同的饼干模型。瓶子过滤、广告阻塞率和脚本加载顺序也会造成差异。10-20% 差异是正常的。
仪表板是设计为 OpsIQ 管理。外部报告时,请使用REST API 用于拉动分析数据,并在自己的仪表板或BI工具中显示。
这算数 IP 解决 OpsIQ 已根据威胁分数、重复失败的登录或手动块标记或屏蔽。单击计数器可查看细节并管理块。
访问者日志显示您所跟踪的网站的每次访问。 每行都是一个访问者的一页载荷。 用它来调查个人访问者的行为, 发现竞选流量, 并诊断追踪问题 。
访客的 IP 地址。如果 IP 在设置中启用了匿名化。 单击可查看此选项的所有访问 IP.
探测到的IP使用 GeoIP 数据的地址。MaxMind GeoLite2数据库或Cloudflare地理头。 如果没有配置 GeoIP , 则显示“ 未知的 ” 。
访问者加载的页面。 点击可看到完整 URL长 URLs 在表格视图中切换。
在登上你的站点之前, 访客来自哪里。“ Direct” 表示没有裁判员( 书签, 键入) URLs,一些应用链接).
访客设备类型(桌面,移动,平板电脑)和浏览器(Chrome,Safari,Firefox等). 从用户代理头解析.
当页面被装入时, 在您配置的时区中 。
如果访客的身份被识别(通过身份标志或登录),他们的名字或电子邮件就会出现。否则会显示匿名。
过滤特定时间段的访问。 默认: 最后一次7几天时间。
搜索者为 IP 地址,页 URL、裁判员、国家或客户电子邮件。
按交通来源进行过滤:直接、有机、社会、转介、付费、电子邮件。
由桌面、移动或平板电脑过滤。
仅显示第一次来者 从未见过。
在访客日志中,使用搜索字段并输入"夏-发售"。搜索检查参考器 URLs 和页 URLs,因此 UTM 参数将匹配。您也可以通过 Source = 付费来过滤以进一步缩小。
在访问者日志中搜索他们的电子邮件地址。 如果登录的话, 他们的身份将会出现。 将日期范围设定为昨天。 请在下午3时左右查看访问页面。 点击他们的会话以查看完整页面流和任何 JavaScript 错误。
这可能是一个机器人、刮子机或被打碎的脚本。请到访客日志中搜索 IP 选中 : (1是否所有访问都在同一页? (2)用户代理是否是已知的bot?3会期是否总是0如果确认为机器人,请前往安全单位封锁 IP.
原始页面载荷。 每页一行浏览。 最佳的: 调查特定页面, 查找特定来源的流量, 诊断跟踪问题 。
将页面浏览分到行程。 每访问会话一行。 最有利于: 了解用户流量、 测量会话持续时间、 识别转换路径 。
实时活动。 现场显示访客。 最佳的: 监测活动正在进行中, 发现高注访问者, 观看支持机会 。
OpsIQ 默认跟踪所有访问。要排除自己的流量,请添加您 IP对被排除在外者的访问 IPs 在设置 > 跟踪中列出。
GeoIP 搜索需要任一 Cloudflare 地理头( 如果使用自动)Cloudflare)或 MaxMind GeoLite2 数据库文件。检查设置 > GeopIP路径,以确保数据库文件存在并可以读取。
访问者数据按设置配置的保留期保存( 默认 ): 90 之后,旧记录会自动被保留Cron的工作清理。
会话将同一人的多页视图组合成一个单一的行程。虽然访问日志显示单个页面负载,但会话显示人们如何从登陆到退出通过您的网站。
访问者加载第一页时开始会话。 它继续浏览更多页面。 当访问者在会话超时段不活动时结束会话( 默认 : 30 分钟)或关闭他们的浏览器。超时后返回的同一个人创建了新的会话。
登陆页,访客进入你的网站。这说明哪些内容吸引了人们。
出站页面,是访客离开的地方。如果出站页往往是定价页面,访问者可能会将你和竞争者进行比较。
访问者在本会话中浏览了多少页。 更多的页通常意味着更多接触, 但也可能意味着访问者丢失 。
从第一页加载到最后活动的总时间。0秒是弹出(单页视图,没有进一步的交互)。
本会场的交通源(Direct,Google,Social,转介等).
被检测到的国家 从访客的 IP 地址,请问...
访问者在只查看了一页后是否离开。 弹出的会议有红色指示器 。
访客是否在会议期间完成了一个履带转换活动(购买、注册、提交表格)。
搜索者为 IP,电子邮件,页面 URL,或者在会话中担任裁判员.
由新访问者过滤( 有史以来的第一个会话) 或返回访问者 。
由交通源过滤.
按国家过滤以查看特定区域的会话 。
过滤器只显示被标为威胁的反弹会话或会话 。
在会话中搜索他们的电子邮件。 请查看它们的所有会话 :( s)1在购买前他们去过多少次?2他们看了哪页? ()3他们用聊天还是开罚单?4从第一次访问到购买的总时间是多少?这告诉你了高价值客户的典型购买之旅。
在会话中搜索客户电子邮件。 比较最近会话的国名。 如果会话突然从不寻常的国家出现, 则可能是合法的旅行或损坏的账户 。 请检查 : (1在成功登入之前是否有过失败的登录尝试 ? ()2做了吗? IP 在同一会话内更改? 如果可疑,请标出复议标记。
访问者是个人(或浏览器)。会话是该人的一次访问。同一访问者可以随时间而有许多会话。会话在超时后过期。
OpsIQ 使用 cookie、浏览器指纹和认证身份标志的组合。如果访问者清除了他们的 cookies 且没有登录,他们就会作为新访问者出现。
Live Feed 显示您网站上的访客实时。 它会自动每次更新 15 秒( 配置 ) 。 在运动、 产品发布和繁忙的支援期间使用它来观察当前发生的情况 。
Live Feed 民意测验您的服务器在配置的刷新间隔。 每行显示您站点上的访客: 当前的页面、 国家、 设备、 源、 会话长度和页数。 绿色亮点显示自上次刷新以来的新活动。 单击任何访问者行查看其完整的会话细节 。
实时种子更新的频率。 默认 : 15 数值( 以秒计)5-10s)提供更快的更新,但使用更多的服务器资源。30-60s)在服务器上比较容易,但实时较少.
访问者在最后一页负载后被视作“活动”的时间长 。 默认 : 90 秒。如果访问者装入页面,然后读取2几分钟不点击,它们就会在阈值后从直播中消失.
点击暂停以停止自动重新更新。 如果您想要读取细节而不更新列表, 请单击恢复以重新启动 。
这是高诱行为,在现场直播中: (1点击访客查看其会话。 (2如果他们开始聊天,AI将会有他们完整的旅程背景. ("A.3如果他们不买就离开,就会成为铅页的领先者。 (4)考虑建立主动规则,在访客联系出柜时显示聊天信息.
这可能是:(a)1与互联网共享的办公室。检查访问是否像真实的人(不同的网页,合理的会话时间)。2) 机器人或刮刮机。检查会话是否非常短(0-1或系统地点击页面。 (3负载测试。如果您正在运行自动化测试,则排除 IP 从跟踪。
检查 : (1部件脚本是否安装在您的站点上 ? ()2站点密钥是否正确? ()3活动阈值是否通过? ()4) 访客是否使用侵略性的广告屏蔽器来屏蔽追踪脚本?
直播显示所有活动的访客。 对于过滤过的视图, 请使用访问者日志或会话页, 并附带过滤选项。 实时监控时, 直播是故意简单的 。
Top Pages 显示您网站上哪些页面的流量最大。 它会按访问、 接触、 转换和支持活动排序网页。 使用它来识别您的最佳内容, 查找表现不佳的网页, 并发现生成支持问题的页面 。
全数 URL 路径。如果分组被启用,则对相似的页面(例如产品变体)进行分组。
此页面被装入选定日期范围的总计次数 。
有多少不同的人观看了这个页面(一个看同一页的人两次计算为: 1) (中文(中国大陆). ).
仅查看了此页后离开您网站的访客百分比。 高回放在登陆页面=问题;高回弹在"谢谢"页面=正常.
访问者平均花多长时间在这个页面上。 非常短 = 不读取。 非常长的表格页面 = 混淆 。
从此页面开始了多少聊天对话。高聊天从一个产品页面开始意味着产品描述可能不明确。
本页的访客创造了多少张支持票. 高票计数=潜在的UX或内容问题.
以“ 支持票” 或“ 启动聊天” 排序顶页。 查找数量多的产品或发送页面。 最多支持问题的页面可能信息不明确。 修正页面内容并监测支持问题是否减少 。
排序为回弹率下降。 忽略自然是退出点的页面( 谢谢页、 确认页 ) 。 关注应该让访问者参与的页面: 产品页、 定价、 特性 。 这些需要更好的呼叫到行动或更清晰的内容 。
检查 : (1)追踪部件是否安装在该特定页面上?单页应用程序可能不会在路由更改时点燃页面视图。 (2在跟踪设置中是否排除了页面? ()3CDN服务于没有跟踪脚本的缓存版本吗?
地理情报显示您的访客来自国家、城市、装置和来源。利用它来了解您的地理市场,决定语言支持,规划区域营销,并发现可疑的交通模式。
按访客数排名最高的国家。 点击一个国家来钻取到城市一级的数据 。
按国家分列的交通量的可视分类,百分比为5%。
每一个在选定期间有访客的国家,都显示游客人数、会话次数、弹出率和换算率。
点击一个国家,看看该国哪些城市的游客最多。
OpsIQ 以两种方式检测访客位置:(1) Cloudflare 地理头。 如果您的站点落后 Cloudflare,国家检测是自动和准确的。 (2) MaxMind GeoLite2 数据库。 下载免费数据库并在设置中配置路径。 城市级检测需要GeoloLite2-City数据库, 而不仅仅是国家数据库 。
使用 VPN 的访客似乎来自 VP N 服务器的位置, 而不是他们的真实位置。 这是设计上的 。OpsIQ 无法也不应该试图绕过 VPN 。如果您看到异常的国别模式,请考虑 10-20% 可能使用VPN的访客。
检查 : (1这些访问者是否真实? 看看会话持续时间和页面浏览量。非常短的会话,高回放 = 可能的bots ().2他们通过Google找到你了吗?3如果流量是真实的,而且涉及的内容,那么考虑增加印度特有的定价或内容。
请看地理情报的页面。如果西班牙语国家(西班牙、墨西哥、哥伦比亚、阿根廷等)加在一起代表了超过 10% 您的交通流量低, 翻译值得考虑 。 另请检查: 来自这些国家的游客是否以与您的主要市场相似的速度转换 ?
使用小时热映射( 在 Dashboard) 与 Geo Intelligence 组合。 如果 40% 你们的交通是从欧洲来的 35% 从美国,您需要覆盖两个时区。热图显示每个区域最活跃的时间。
调查: (1他们是否在定价页面上出现?也许你的定价对那个市场没有竞争力。2检查你的航运页面是否提到德国。3货币不匹配会导致废弃的退出。 ()4这些访客是否来自单一来源,可能是低诱导流量?
GeoIP 没有配置。 要么设置 Cloudflare (自动添加了地平线头)或下载了 MaxMind GeoLite2 数据库,并在 Sets > GeuIP 路径中设置了文件路径.
OpsIQ 不按国家设置阻塞。使用您的网络服务器或 Cloudflare 基于国家的屏蔽防火墙规则 。OpsIQ 注重能见度,而非网络层面的接入控制.
内特漏斗将访客的会话按他们似乎在做的事情分类:浏览、研究、比较、购买、获得支持或离开。用它来理解您网站的意图平衡,并找出游客从哪里出发。
参观者随意四处找找,短会,几页,没有发现具体的目标.
访问者阅读产品/地物页面,docs,或博客内容. 页面上的时间更长,内容多.
游客查看定价、计划比较或特征表。通常返回的游客。
访问者在报到、推车或报名页上。这些是您的转换机会。
访问者在帮助页面、联系页面或开始聊天时需要帮助。
访问者一页后离开,订婚率低
定价页面足够强大, 可以创建意图。 聊天在购买路径中很重要 : 27% 在购买前进行聊天。退票后的支持票可能表明激活或付款混乱。1(a) 确保AI聊天回答定价问题。 (2调查 18 常见问题的离职后支持票。
使用日期范围过滤器来比较不同时期的意向模式。 例如, 将黑色星期五周五与正常周周相比较。 您应该看到“ 购买” 意图的激增, 并且如果升级造成混乱, 可能还会出现“ 寻求支持 ” 。
OpsIQ 查看页面 URLs,会话行为,以及时间模式。定价页面信号比较意图。退出页面信号购买意图。帮助/接触页面信号支持意图。分类基于Heuristic,而不是AI驱动。
目前没有。 分类是基于常见的网络行为模式内置的。 自定义意图分类在行进图上 。
构建从页面或事件步骤的自定义行程,测量组群保留,并发现访问者最常走的路由.
创建一个命名的漏斗 2改为: 8 。在数小时内设置转换窗口;仅在命令的步骤发生在窗口内时,访问者才会计数。使用步骤之间的放出来选择检查重播、出错、页面速度或消息的地点。
保留团体访问者进入每周组,并显示返回人数。6, 8或 为 12 在比较释放或运动时,保持组群定义的稳定。
路径列表最常见的页面序列。选择路径长度从2改为: 5页面来保留结果可读性。使用它来查找反复在转换前出现的出乎意料的绕道、共同出口和内容。
自定义漏斗是分析定义,而不是自动化。要对完成的步子作出反应,就会产生转换目标、分段、触发或工作流程。
会话重放让您观看访问者在您的网站上所做过的事:他们点击的元素、滚动方式、徘徊地点、以及输入的(带有隐蔽的敏感字段)。 使用它来诊断UX问题、校验错误报告并理解客户的混淆。
从会话页面中查找有所报告问题的会话、高页计数而不转换,或者来自提交支持票的客户的会话。单击重播图标打开时间段视图。
显示事件随时间推移的横向栏。 请点击任何时间点跳到那个时刻 。
每个页面载荷都作为片段出现在时间线上。 您可以看到访问者所走的确切路径 。
点击事件在时间线上显示为点,在页面重建中显示为亮点.
记录了卷轴的深度,这样你就能看到访客读得有多深。
字段焦点和打字事件被记录. 密码和敏感字段的文本输入默认被遮掩.
默认情况下会话重放会话口罩敏感窗体字段。 密码字段、 信用卡输入和带有数据标记的字段 -opsiq-mask从未被记录。 您可以在设置 > Tracking中配置额外的遮盖规则。 如果您的遵守政策需要它, 您可以完全禁用重放 。
在会话页面中查找它们的会话( 通过电子邮件搜索) 。 打开重播。 注意检查页面段。 请查看 : (S)1他们点击了正确的按钮吗? ()2做了一个 JavaScript 出错? (检查JS错误的页。 ) (3)页面是重新装入还是显示错误消息? ()4) 需要的字段是否为空?重播会显示到底发生了什么 。
重放数据会随着流量的增加而增长。使用保留设置来自动清理旧的再播放数据。对于高流量网站,考虑缩短重放保留期(例如, 30 管理存储。
如果设置中启用“ 尊重不跟踪” , 则没有记录带有 DNT 头的访客。 您也可以在跟踪设置中排除特定页面的重放 。
事件日志显示每个事件 OpsIQ 已录入: 页面浏览、 点击、 聊天开始、 票款创建、 销售和自定义事件。 使用它来调试集成、 校验 Webhook 发送, 并了解动作顺序 。
webhooks.events.list; 订阅本表的名称不会带来任何结果。每行显示您的名字 发送 和犬科名称OpsIQ 存储 两者都记录下来:原始名称,以及它所绘制的犬科名称, 因此一份针对犬科分类学的报告 继续工作,无论用什么别名来追踪。
履带式页面载荷。包括URL、标题、裁判和时间戳。 page_view 财务报告和已审计财务报表 view 被接受为同样的事情。
访问者打开聊天部件 。
访客发送聊天信息。 回复部分被存储为 support.chat_message_received.
创建支持票. ticket_create 答复和关闭内容作为“文件”保存。 support.ticket_replied 财务报告和已审计财务报表 support.ticket_closed.
提交了跟踪表格。 submit 被接受为同一事物。
买完就走 purchase_success,以及销售的别名 order.completed, sale.completed, payment.completed 财务报告和已审计财务报表 invoice.paid,所有这些都从连接的平台接受。
退出开始。 相关 : cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.
访客会签到,失败就是... login_failed,存储为 identity.login_failed; 关机是 login_lockout_created.
访客完成报名,线索是 lead,存储为 conversion.lead.
A 类JavaScript在跟踪页面中记录出错。
您可以从您的网站或服务器发送自定义事件到 OpsIQ。自定义事件对于跟踪特定业务的动作是有用的:按下按钮、功能使用、视频播放、下载等。
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
plan: "pro",
billing: "annual",
value: 99
}]);// 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 高价值事件(购买、安全事件)可以配置,保留时间更长。
是的。 在创建实验时, 您选择一个转换事件。 任何内置或自定义的事件都可以作为转换目标 。
实验可以测试两个版本的页面或特征,并衡量其中哪个表现更好。OpsIQ 跟踪印象、转换和统计意义。
给它取个名字,定义您的主要度量衡(转换事件),并设置变体(控制和测试).
OpsIQ 随机指定访问者到变体并跟踪其行为。在实验运行时不要改变实验。
在收集到足够的数据后,检查置信度.95% 自信意味着你可以 95% 确定区别是真实的,不是偶然的机会。
已创建但尚未启动。 您仍然可以编辑变体和度量衡 。
积极为变体分配访问者。 运行时不要编辑 。
达到统计意义或被手动停止。结果为最终结果 。
已经审查了结果,在现行清单中不再需要试验。
开始前先决定您在测量什么。 在看到结果后选择一个参数会带偏见 。
加入你的团队 IP 因此,工作人员访问不会导致任何结果。
试验结束后不要停止 100 每一个变体都需要几百或数千名访客才能取得可靠的结果。
如果改变标题和按钮颜色,你将不知道是什么变化导致改进。
实验结束后,请注意哪个变体获胜,以及你选择执行的原因.
它取决于基线转换率和您想要检测的效果大小。 作为拇指规则: 至少 500 a/ 变体的访客数 20% 效果大小,要小一点,你需要几千个。
是的,但请小心。如果两个实验影响同一个页,它们的结果可能会相互作用。同时在不同的页或特征上运行实验是比较安全的。
JavaScript 错误从您的网站访问者中收集客户端错误。 按钮中断, 失败 API 调用, 或缺少资源在此出现。 用它来查找和修复影响真实客户的bug 。
密码 JavaScript 错误文本( 如 “ TypeError: 无法读取未定义的属性 ” ) 。
错误发生于哪个页面 。
哪个浏览器和设备类型看到了错误。 有些错误是针对浏览器的 。
错误发生的代码位置。 单击以扩展完整堆栈跟踪 。
当这个错误首次出现时 。
最近发生此错误时 。
记录了多少次这个错误.
多少次不同的访客会遇到这种错误。
还没全部 JavaScript 错误需要立即注意。 优先排序为 : (1关键页面出错(退出、注册、登录),(2(b) 会话计数过高的错误,(3)最近出现的出错(代码更改后可能出现回归),(4) 自己代码上的错误(不是第三方脚本).
意思是说 45 真实客户无法完成结账。步骤 : ()1)打开同一浏览器/设备组合中的页面。 (2) 打开浏览器控制台并复制出错. (PDF).3)检查堆栈跟踪以找到确切的代码行. ()4修正错误, 部署, 并监视错误计数为 0 。
对 OpsIQ 全部抓取( G) JavaScript 页面出错,包括分析脚本、聊天部件和广告脚本出错。URL 在堆栈中追踪,以聚焦于你自己的代码。
您无法抑制特定的错误 。OpsIQ,但您可以逐行过滤列表 URL 或错误消息。纠正或忽略浏览器扩展中的错误(它们经常显示为来自未知来源的错误)。
销售追踪将您的商店或收费平台连接到 OpsIQ,这样您就可以看到收入与访客行为。每次购买都是由游客旅行决定的,所以您知道哪些网页、活动和渠道驱动收入。
今天完成订单收入。 刷新您连接的平台上的每一个新订单事件 。
本期收入合计,从这些总额中减去退款。
显示选定日期范围内的每日收入的行图。请查看悬赏(促销、运动)和竖花(问题、季节性)。
哪些交通来源导致购买量最多。“Direct”买家经常在你的网站上挂上记名。“Google”买主通过搜索发现了你。
最新订货的客户电子邮件、金额、货币和购买的物品。
当追踪者看到访客在浏览器中到达购买确认,但还没有连接的平台报告销售,客户行程显示有一行购买(未确认)有琥珀徽章,从未算作收入. 平台确认销售时,确认的购买取代了该行.
销售连接器不依赖于单一的网络浏览器。平台发送的每个支付信号都可以打开销售,而连接器合同 2.3 重新阅读平台自己在时间表上完成的销售清单(每个工作空间默认小时),所以一个网络浏览平台从未交付的销售不能失去销售. 运营商可以根据命令行的要求使用工具/sales_reconcile.php运行.
转到连接器 >Shopify。在您创建自定义应用程序 Shopify admin (Settings > Apps and series channel > development apps). 授予范围:读取命令,读取客户,读出产品。复制了 admine API 访问符号。 in OpsIQ,输入您的存储域名(例如, your-store.myshopify.com)和访问符。单击测试连接。如果成功,则启用Webhook同步实时命令通知。
转到连接器 >WooCommerce。在您的 WordPress 管理员,去 WooCommerce> 设置 > 高级 > REST API。使用 Read/Write 权限创建密钥。复制消费密钥和消费密语。在 OpsIQ,输入您的站点 URL,消费密钥和消费秘密。单击测试连接。
转到连接器 > BigCommerce。 在您的 Bigcommerce 管理员中, 转到高级设置 >API 账户。 创建 V2/ V3 API 账户,可读取命令、客户和产品的范围。复制访问令牌、客户身份证和 API 路径。输入它们 OpsIQ 并测试。
转到连接器 > Magento。 在您的 Magen托 管理器中, 转到系统 > 集成器。 创建一个新集成符 API 资源访问 销售、客户和目录。激活集成并复制访问令牌。输入 OpsIQ 与您的 Magento 基数 URL.
转到 Connectors > PrestaShop。 在您的 PrestaShOP 管理器中, 转到高级参数 > Webservice。 启用网络服务并创建新密钥。 允许访问订单、 客户和产品。 复制密钥并将其输入 OpsIQ 和你的店铺 URL.
转到连接器 > OpenCart。 生成 API 从您的 OpenCart 管理面板中获取证书。输入 API URL,用户名和密钥 OpsIQ。连接器使用 OpenCart 的 REST API 以获取订单和客户数据。
转到连接器 > osCommerce。 配置数据库访问或 API 连接器设置中记录的证书。 OSCommerce集成通常需要直接数据库访问或自定义 API 模块。
转到连接器 >Stripe复制您的图像Stripe限制API密钥从Stripe发光板( 开发者)API键。关键字需要读取客户、充值、发票和订阅。输入其中OpsIQ。为实时事件配置 Webhook 终端。
使用 REST 软件 API 或 Webhokes 从任何平台发送销售事件。发送订单。用客户邮件、金额、货币和项目发送完成的事件。请参见The Eventions API 用于有效载荷格式的一节。
显示哪些频道带来付费客户。 如果 Google 带来了 1000 访客和 50 销售,这是一个5% 转换率。如果电子邮件带来 200 访客和 30 销售,即 15% 电子邮件对每个访客更有效。
重新筹资的订单会分开跟踪,它们会减少净收入总额。如果从特定来源得到的退款率很高,那么流量可能质量较低。
OpsIQ。多种货币企业以每种货币表示收入。规范化报告使用所配置的汇率。
调查: (1)在定价页面访问者上使用会话重放。注意它们如何与定价表互动。 (2)检查顶页的定价页面回弹率和时间。 (3)从定价页面访问者那里检查聊天谈话。他们问什么问题?4)将定价页面与竞争对手进行比较。 (5)尝试使用不同的定价布局的A/B实验.
以源码进行销售和过滤。 搜索活动的 UTM 参数。 您可以看到 : (1有多少访客来自电子邮件。 (2有多少人转换成销售品。 (3与该运动有关的收入总额。 (4)相较于竞选前同期.
检查 : (1)平台连接器连接是否健康?前往连接器并检查状态.2是否启用了 Webhook 同步 ? 如果使用投票, cron 工作会运行吗 ? ()3)连接器是否有权 API 瞄准镜? Shopify,您需要读取命令。
当一个订单通过连接器进来, OpsIQ 匹配客户电子邮件给已知的访客。如果在购买前跟踪到该访客,则销售归因于他们的访客行程,包括交通来源、着陆页和会议历史。
你可以通过REST发送销售活动 API。事件格式在“事件”中记录 API 节。
存储前端是OpsIQ本地商店在Client Chat中提供产品、页面、外观、促销板、退货、客户账户和人工智能辅助销售,
确认您正在配置的网站。 产品、 设置、 页面、 命令和分析器被隔离到工作区 。
常规设置→电子商务是母权威。 Storefront 出版、订单创建和支付仍然分开,以便安全地预览目录。
设定产品类型、价格、货币、库存、变体/选项、介质和满足。在发布前先预览产品和退出选择。
连接网关或添加银行转账、现金或柜台支付。物理货物需要交货区或收货;数字货物需要受保护的文件或代码。
修复每个阻塞器并审查每一个警告,然后完成公共商店的沙盒订单.
新建和升级的商店可接收可编辑的启动文本 关于我们, 条款和条件, 隐私,以及 退款和退款 当这些字段为空时, 现有的商家副本永远不会被覆盖。
[Add …] 快速和 启动时间 发射前通知。选择一个被整理的色彩主题和组成,然后是调制打字,填充/分级,形状,宽度,运动,悬浮和光/暗行为. 预览桌面和手机后再保存.
创建每个页面, 以重排区块。 每个区块都有溢价设计变体。 保留诸如统计、 团队、 奖项或引用等索赔区块, 直至内容属实 。
设定标题,弹道,英雄,SEO并命令块; 预览起草时, 然后公布。 保留了的存储路径, 如推车、 退货、 账户和政策等, 无法重新使用 。
创建至少一个块的模式页。 选择溢价设计、 中/ 左/ 右/ 下方位置、 负载/ 延迟/ 退出/ 点击触发、 背景、 运动、 宽度、 优惠券和一次性访问行为。 测试关闭、 键盘和电话布局 。
链接到页面、产品、收藏、政策、账户/帮助/卡特尔行动、直播模式或安全的外部URLs。标题项目支持一个下放/mega-菜单级别。
启用客户聊天销售, 然后选择客户可以购买的地方。 助理搜索目录并询问服务器是否获得权威引用; 服务器而不是模型创建了签名的订单卡。 确认只通过网络上的卡或社交频道上经过核实的交互进行 。
WhatsApp使者们,Instagram, Telegram, LINE, 短消息和X 使用供应商验证的频道账户作为频道身份。电子邮件仍然被收集以获取收据。连接器命令保持其已签名的通用合同和商家授权总额; Storefront配置不会改变该合同。
检查独特的访客、产品视图、车外加价、离职开始/班顿/完成、转换、确认订单、按货币、购置、设备、国家/城市、顶级产品、恢复和数据质量警告分列的收入。转换使用明确标记的公有系统事件;货币总额从未默默地合并。一个破折号意味着选定的范围无法回答转换问题 — — 而不是零。
使用无记名密钥 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和邮递员使用这些合同。
领跑者是显示购买或支持意向的访客或顾客.OpsIQ基于行为自动检测线索:定价页面访问、回访、聊天互动、退出开始和高参与度。使用铅页面优先跟踪并反馈您CRM输油管。
浏览您的定价或计划页面的访客会积极考虑购买。
多次回来的访客被订婚,但尚未皈依。
开始聊天的访客正在积极寻求帮助,无论是预先购买还是事后购买.
访问者,可到达出票页面,但无法完成购买.
提交联系表,演示申请表,或报名表的访客.
访问者如果浏览许多网页,会期很长,正在深入地研究。
单击任何线索查看其完整配置文件:
姓名、电子邮件、公司,如果知道。匿名线索显示 IP 和地点。
所有来自此线索的会话都有页面流,持续时间,以及源.
他们访问的每一页, 命令的谨慎。
他们怎么找到你的: 有机的,付薪的,社交的,转诊的,直接的。
A 类0-100 根据行为强度,复健度,和页面意向等分.
是否将此线索添加到CRM作为联系人或交易。
大赦国际就下一步应做什么提出建议(例如,“视价3乘以_考虑主动的外联”)。
领先得分高于 80 获得一个“高价值”的徽章。 这些是您最热门的前景。 优先进行外联、主动聊天或CRM管道输入 。
这是一个高诱导。1(c) 检查公司和角色信息的牵头细节。2(c) 审查聊天记录,说明具体需要和反对意见。3创建交易在CRM收集的资料。 (4为销售团队的一名成员分配后续任务。 (5)如果他们回到定价页面,主动聊天规则可以触发个性化消息.
选项:(a)1创建一个主动的规则,提供折扣或资源下载,以换取高意向页面的电子邮件。 (2) 使用聊天部件在匿名访问者开始交谈时询问电子邮件. (3)在您的登录/签名页面中添加一个身份符号,这样返回的访客会自动识别.
分数考虑:访问的复议(最近=高),访问次数(更多=高"),浏览页数(定价/检查出值=高 "),会话时间(更长=高?"),聊天互动(约定=高);回访(多场次=高)。
是的,在CRM配置中,您可以添加根据特定关键词、事件、源或页面模式来提升分数的铅分规则。
OpsIQA. 船舶的完整识别和识别系统CRM获取客户真实性,清理数据,分数线索,导师交易,预测收入,以及行为,将网站智能,支持,票房,产品和支付作为活图. Every AI acts are sourced, explainable, returnable and retrol-control).
你的日常家庭屏幕:收入脉冲,AI发现的,它做了什么,批准排队,下一步动作,代理健康,以及ROI.
人和公司在你们CRM。搜索、过滤、计分和管理配置文件。
视觉交易板 拖放阶段, 赢概率,和AI导师。
董事会职等预测:承诺的,很可能是最好的案例,并有信心间隔和准确性跟踪。
每个客户都处于以下状况:活跃、有风险、扩张准备、续约到期或休整。
用简单的英语描述你的CRM设置. OpsIQ 生成可逆计划,并在批准时适用。
自查页面: schema, 代理, 路由, AI动作, 以及活数据计数.
AI 提案会进入批准队列。 您批准、 编辑或拒绝每个提案。 没有您的话, 任何事件都不会发生 。
AI建议改变时,它显示了当前价值和拟议价值,以人为主的数据具有出处保护.
每一个 AI 动作都会记录在日记上。 您可以点击一次来撤销任何更改 。
AI的每一个建议都显示了它的推理和它使用的数据来源。没有黑匣子。
在左侧导航中单击 AI CRM。 命令中心显示您的当前状态 。
开放CRM健康系统,以验证计划、代理和路线。
如果连接符是活动( I)Shopify, WHMCS 等),自动导入联系人。否则,通过 CSV 或手动创建。
去管道,创建你的第一个管道,有阶段(如:铅,合格,提议,谈判,元,失).
从联系人开始创造交易,设定金额和舞台,让交易教练指导您.
不 客户关系管理系统是可选的 OpsIQ 完美地作为没有CRM的跟踪+支持+AI平台运行。当您准备好管理销售和客户关系时启用它。
是的。 您可以手动创建联系人和交易。 连接器可以丰富CRM有平台数据(订单,订阅,入场券)但不需要.
信任层是控制AI所能做的安全系统. compilway模式(默认):AI提议,人类批准. Autopilot mode (opt-in):AI在低风险,可逆操作上自动行动.
指挥中心是你们的日常简报,每天早上打开看看发生了什么,需要注意什么,下一步怎么办.
管道价值,交易赢/输,新线索,活交易,以及收入趋势,你目前状况的一览.
AI发现的洞察力:交易停滞,风险账户,新机会,数据质量问题和市场信号.
AI(在自动驾驶中)或提议(在副驾驶中):阶段推进,分数更新,联系充实,任务创建.
AI 提案的排行, 等待您的决定。 每个提案都显示拟议行动、 推理和证据。 批准、 编辑或拒绝 。
排行榜 10 今天最重要的事情: 追踪热交易,检查风险账户, 研究新的线索等等。
AI代理商的健康:抓取,数据管理,交易情报,交易教练,SDR,保留. Green=运行,琥珀=需要关注,红色=出错.
ROI跟踪:受AI影响的交易,节省时间,预测的准确性,以及和人工CRM工作的比较.
检查管道的健康和收入趋势,你这个月是否在轨?
批准安全行动,必要时编辑,拒绝坏建议。
阅读AI的见解,有没有交易有风险?是否有新的机会?
从头开始,AI按紧迫性和潜在影响来排序这些内容.
打开指挥中心并检查 : (1) "什么情况 OpsIQ 显示您不在期间的所有 AI 动作 。 (2) "需要批准"显示的提案等待你的审查. (注:3) "什么情况 OpsIQ 查找的"突出显示紧急项目。 (4将仪表板日期范围设定为您缺席的期间,以查看趋势。
密码CRM将您的业务关系组织成四个目标:联系人(个人)、公司(组织)、交易(收益机会)和任务(后续行动)。
一个人在你的CRM。他们可能是客户、前景、伙伴或领头人。联系人有电子邮件、姓名、公司、标签、生命周期舞台和热度分数。
使用搜索栏来查找名称、电子邮件、公司或标签。使用过滤器:生命周期阶段、领先分数、来源、国家、最后活动日期、指定所有者。
点击联系人查看他们的全部简介:个人信息、公司、交易、活动、门票、聊天、网站访问、领先分数和AI的见解。
A 类0-100 从行为信号中计算得分:网站访问,电子邮件参与,聊天互动,购买历史,以及回放. high = hot.
联系人通过电子邮件域名或人工指派与公司联系,一个公司可以有许多联系人.
收入机会。交易有产权、金额、管道、舞台、赢概率、结束日期、指定所有人以及关联的接触人/公司。
百分比的胜出概率。 根据您的历史赢取数据, 手工设定或由 AI 计算。 驱动加权预测 。
绿色(健康)、琥珀(有风险)或红色(已安装),根据活动恢复、阶段持续和接触信号。
指定给个人的后继行动。任务有标题、到期日期、优先级、类型(电话、电子邮件、会议、其他)和链接联系/交易。
AI在发现需要注意的事情时自动创建任务:跟进被搁置的交易,回应有风险的账户,研究新的线索.
转到联系人。 过滤方式为: 领先分数 > 80,国家=联合王国,最后一项活动 > 7以领先分数递降排序,这是你最热的被忽略的线索,优先拓展。
打开联系人配置文件。 点击“ 创造交易 ” 。 请输入交易标题( 如“ Acme Corp - Enterprise Plan ”) 、 金额、 管道和舞台( 如 “ 合格” )。 设定关闭日期并指定给自己 。 协议教练将开始跟踪这个机会 。
管道是一个视觉板,交易从左到右通过各个阶段。拖放卡片进行预发交易。每张卡片显示交易金额、赢概率和健康状况。
管道显示所有活动交易为以列(相)排列的卡片。每个列头显示该相阶段交易的总价值 。
将牌拖到下一个阶段。 赢概率和数值会立即更新。 如果移动失败( 验证错误) , 牌会回到原来的位置 。
绿色徽章=健康(最近的活动,正轨上). 琥珀=有风险(下降,需要注意). Red=停滞(没有活动太久).
点击一张牌打开交易细节面板, 包括联系人、活动、 交易教练简报和快速行动。
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 中 。
交易教练分析每一项交易,并给你一个简短的健康状况、风险信号、关键人物、资格清单、会议准备以及下一步行动的建议。所有事情都是源头的。教练会显示每个索赔来自哪张票、聊天或活动。
为何交易是健康的,处于危险之中,或者停滞。 具体信号:舞台上的天数、最后接触日期、活动频率、竞争对手提及、反对模式。
分类为: 提出的反对, 竞争者提及, 定价讨论, 支持风险指标, 更新/ 扩展信号。 每个信号链接到其源头( 聊天记录、 票单、 电子邮件、 活动) 。
帮助交易(champion)和抵制(blocker)的是谁。基于互动分析和联系角色。
MEDDIC或BANT清单(可配置),显示符合哪些资格标准,以及缺少哪些资格。
在预定的会议之前,教练会制作一个简短的:议程,要涵盖的关键点,要问的问题,要处理的风险,以及要准备的材料.
根据当前交易状态和最近的互动,建议下一封信件或调用脚本 。
每一份声明,教练都会提供与来源的链接:票号、聊天记录、活动日期或网站访问。
打开任何交易并滚动到 Deal Coach 区域。 读取健康状态和关键信号 。
请检查access-date=中的日期值 (帮助) 资格清单. "经济买家"缺失的,计划确定预算持有人并与其接触.
教练建议具体的下一步行动。 点击可以创建任务、 起草电子邮件或安排会议, 全部通过批准队列进行 。
打开交易并阅读会议筹备部分。1(b) 以最近互动为基础的关键谈话要点。2他们上周在聊天时提出的反对意见。3(a) 支持票中提到的竞争者。4问其时间问题。 (5积极处理风险因素:利用这份简报编写一份重点突出、循证的议程。
点击协议并读取协议教练的健康解释。它可能会说:“该协议已经进入了提议阶段, 22 天数(阈值 : 14。上次联系是 11 几天前,主要联系人开通了一张关于数据迁移问题的支持票5几天前 (表 #T -)892)建议:解决移民问题并安排后续电话。“现在你知道要解决什么问题。
局级预测,带有可辨别范围,交易级别变化解释,准确跟踪,以便能证明和解释你的数字.
处理 80% 或更高的赢取概率。这些是您最可能的赢取。这应该是您的最小预期收入。
所有公开交易都以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% 从提案到谈判 你的提案可能需要工作
哪个主要来源能产生最大的赢家 投资更多高赢家
每个销售团队成员的表现:交易胜出,管道价值,平均交易规模,赢率.
沙布(不现实的低概率),过度紧张(不真实的高),以及承诺有风险(高概率交易显示被停滞信号).
打开预测页并检查"有什么变化",报告显示:"Acme Corp deal (Acome Corp agree ()).$15,000 被选定为竞争对手的Lost,Beta Inc 交易($8,000 结束日期推至下季度。$3,000)加上了本周",净变动是.$20,000 + $3,000 = -$17,000,解释从180K跌至163K(其余8K则由其他交易的概率调整来解释).
探矿代理帮助您找到并研究潜在的客户。描述您的理想客户,添加目标公司,让AI研究,得分,并起草第一触摸拓展。
访问 CRM 配置 > 探矿。 描述您的理想客户简介( ICP): 目标行业、 公司规模、 职称、 地域重点、 产品匹配条件和最小适配分 。 例如 : “ B2B SaaS 公司 50-500 以销售品的VP或增长之长为主要联系人。
输入您想要研究的公司域或名称。您也可以让AI根据您的国际比较方案推荐公司。
AI以现有数据丰富了每个公司:规模,工业,技术堆栈,最新消息,以及配有解释的分数.
对于好身材的公司,AI起草个性化的一触即发信息,在排队中审查批准.
每个前景都得到一个0-100 基于五个因素的适配分:
公司如何与你的理想客户状况(行业,规模,地点)相匹配.
是否有证据表明他们现在需要你的产品?
公司规模、供资阶段和收入指标表明预算的可用性。
你的产品与他们的企业有多相关?
您是否能够有效服务于此客户端( 时区, 语言, 复杂度) 。
添加 acme.com AI 返回:适中分数 78/100 原因:B2B SaaS, 120 员工,美国雇员,最近雇用了一个VP of Sales(紧急信号),使用竞争者X(产品匹配)。购买信号:上个月两次访问定价页面(来自网站跟踪)。最佳联系方式是: [email protected] 起草的开页人参考了他们最近的招聘和定价页面访问。
序列自动化多步后续: 组合电子邮件,等取,任务取用,调用,以及网络hook步骤,在您批准初始发送后自动运行.
定义步骤:电子邮件, 等等3几天,电子邮件,等等5天数、任务(如果无回复,则呼叫)、电子邮件。每个电子邮件步骤都有您可以自定义的模板。
将联系人添加到序列中,AI也可以建议从探矿结果中录取。
步骤在计划时间内自动运行。如果联系人回复,序列会自动暂停。
查看打开的费率、 回复率、 换算率和每步不订阅的费率。 使用此选项优化您的序列 。
联系人答复时,大赦国际将答复归为一类:
有兴趣,想谈谈,顺序暂停,任务为后续设定.
存在关切, 但不拒绝。 顺序暂停, 任务会包含反对的细节 。
想要停止接收消息,联系方式会永久被压制.
有兴趣但时间不对。 序列暂停, 创建 snooze 任务 。
联系方式不对 序列停止 联络标志显示需要审查
支持问题,不是销售回应。序列暂停,票制创建 。
取消订阅请求立即被满足,联系人从所有未来的序列中被压制.
工作空间级的每日限制( 默认 ): 1,000 电子邮件)。防止质量发送触发垃圾邮件过滤器。
最大数1每天每个联系人都会收到信息, 防止个人压力大。
超过日限的步数被推迟到第二天,它们从不被放弃或跳过。
序列会自动暂停。 支持比外联优先。 序列可以在支持问题解决后手动恢复 。
不直接在序列内,但可以创建两个序列,并有不同的消息,比较其结果.
下方一页CRM拥有增长引擎的:经常性收入(MRR/ARR),产品目录,铅捕获表,订出链接和铅路由。这里的所有文件都直接写入CRM,因此,提交表格或预定的呼叫是和历史的联系,而不是电子表格中的一行。
从您真正的账单分类账中预测的MRR和ARR。订阅按每个平台的付款进行分组,从付款缺口中推断出计费周期,当逾期付款时订阅失效1.5。客户链接到CRM当分类账携带他们的电子邮件时,自动联系人。
真实的源头,你所销售的东西。引用从目录中提取名称和列表价格,并接受引用后逐个产品滚动成收入。产品存档,它们永远不会删除。
每个表单都会为您自己的网站获得一个主机页面并加上一个被嵌入的iframe代码。提交文件会成为联系人,所有者会收到通知,您的路由规则会指定线索。
共享链接, 让前景选择一个空闲的档位。 时间档会尊重组织者的工作时间、 时区和现有会议。 预订会场、 电子邮件给前景确认并通知组织者 。
领土规则先是运行,然后是实地规则(匹配一个领域,如国家或源代码),然后通过代表池进行圆旋。它同样会引导CONTACTS和DELS,不管交易状况如何:赢的交易仍然需要拥有者来进行委托归属、账户责任和后续,在拥有者或团队的能见度模式下,没有拥有的记录除了管理者之外,任何人都看不见。通过自动化(连接器销售、聊天、导入)创建的记录没有交互创建者,因此它们按照相同的创建规则而不是无所有者规则进行。任何已经拥有所有者的记录都永远不会被重新分配。
转到CRM,然后是Growth Tools, 然后是铅捕捉表单部分。
输入一个名称和一个逗号分隔的字段列表,例如名称、电子邮件、电话、消息。总是需要电子邮件。
复制主机链接, 以在任何地方共享, 或者复制嵌入码并粘贴到您网站的任何一页 。
每一份呈文均为CRM与表格联系。提交活动、所有者通知和自动路由。
隐藏的蜜壶场静悄悄地丢弃了机器人提交.
每小时提交10份划界案 IP 在表格和预订的地址之间。
提交表格并不表示市场营销同意。只有明确的同意框才允许。
预订时,一个档次将对照新的可用性检查重新验证。
使用您销售页面所用的同一商业分类账, 并使用开出帐单的连接器。 在连接新平台后使用开出的开出账单的再同步。
是的,每张表格在自己的地址上都有主机页面独立工作,不管有没有 JavaScript.
一个连接器, 最多20个网关。 连接您实际使用的短消息和WhatsApp提供者, 标记一个默认, 并在给联系人发短信时选择其中之一 。 请检查是否同意 。CRM在联系任何网关之前。
在连接器页面上,打开Message中枢(SMS和WhatsApp)并启用.
在同一抽屉中,或在CRM Growth Tools中,从滴出(Twilio、Vonage、Termii、Meta WhatsApp Cloud、Infobip等)中选择一个网关,粘贴其上。API 证书和连接。您可以添加多个,包括两次使用不同账户的同一网关。
每个提供者条目都显示自己的网页hook URL 使用复制按钮。将其粘贴到网关的发送报告和输入信息设置中,以获取发送状态和回复返回到 OpsIQ.
打开联系人并使用短消息或WhatsApp按钮。如果一个以上提供者支持频道,则选择者允许您选择;否则将使用默认值。
未知的同意不是同意。 除非明确给予短信同意, 发送者拒绝。 whatsApp 包含同样的同意 。
无论设置什么,一个不接触的旗帜会阻碍每个频道.
压制名单上的联系人从未被传出过信息。
一个被封杀的发送会告诉你原因,这样你就可以修正数据而不是猜测.
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也可以列出连接的提供者, 以解释可用的内容 。
生命周期管理有助于保护现有的收入。每个账户都获得一个风险分数、健康分数,扩展分数和推荐的成功游戏本。
显示每个账户所在位置的视觉板:铅、前景、机会、客户、扩展、更新、风险、Churned。
标出高风险的账户。 每个账户都显示顶级驱动程序( 支持悬浮、 不活动、 支付失败) 和推荐的保存播放 。
显示准备购买更多商品的账户:高使用率、功能要求、计划查询。
账号有即将续期的日期。按风险水平和收入价值排序。
丘恩风险通过多个信号并联计算:
处理健康、无活动、最近的损失、接触减少等问题。
公开票数,票量猛增,情绪负面,升级.
登录频率、特性使用、页面访问、API 打电话
付款失败,发票逾期,要求降级,取消页面访问.
对于风险账户:主动接触、解决关切、提供支持、必要时升级。
对于即将续约:确认满意程度,审查使用情况,现值,酌情提供奖励。
对于即时到发的账户:当前升级选项,分享成功故事,演示ROI.
对于未充分利用的账户:提供培训、分享最佳做法、使用户能够使用它们没有使用的特性。
生命周期板将这个账户标为"冒险",有驱动程序:无活性(14 自上次登录以来的天数)和支持高峰(3x 推荐游戏:主动的外联呼吁以了解正在发生的事情。是否有产品问题? 他们评价竞争者吗?早期干预可以拯救账户。
数据管理代理自动查找并修正了数据质量问题:重复,缺失字段,不一致,和陈旧的记录.
同一人的多份记录(例如, [email protected] 财务报告和已审计财务报表 [email protected] 管理者建议合并它们。
联系人没有电子邮件,交易没有金额,公司没有域。建议从可用来源填充 。
交易没有关联的联络人, 没有公司的联系人。 根据电子邮件域名和上下文提出连接 。
"Won"舞台上与 20% 概率,一个标记为"海关"的无交易的接触,一个不匹配行业的公司.
交易处于同一阶段太久,或接触其生命周期阶段与活动不相匹配。
前往CRM并找到数据管理器部分(或从CRm Health打开).
绿色物品是安全的:明显的重复,明显缺失的数据。批量批准这些物品。
琥珀项目需要你的判断:可能重复,但有细微差异,拟议阶段变化,公司连接。请检查每个版本。
管理者提议合并: 保留记录与更多活动, 合并其他记录的交易和活动。 审查建议, 必要时调整幸存的显示名称, 并批准。 两个记录的历史都保存在合并的联络人中 。
构建我的CRM允许您用简单的英语描述您的CRME设置 。OpsIQ 生成一个经验证、可逆的计划,并在批准时应用。没有编码,也没有手动配置点击。
请输入您CRM设置的平版英语描述 。 例如 : “ 创建具有阶段的更新管道 : 即将到来、 接触、 谈判、 重用、 丢失。 当他们两次查看定价时, 得分会更高 ” 。
OpsIQ 显示其创建内容的预览:管道、阶段、阶段概率、评分规则、生命周期规则。审查每个项目。
单击 应用执行此计划。 每一次更改都会记录为捆绑, 您可以在一次点击中撤销 。
如果有问题, 请单击 Undo 将整个捆绑还原。 您的 CRM 返回到以前的状态 。
创建带有自定义相,默认概率,并有腐烂阈值的命名管线.
基于行为而提高的领先分:"在查看定价时得分较高","在访问职业页面时得取分较低".
自动推进生命周期阶段:“移动到 SQL 当他们要求演示,"当交易获胜时,移动到客户。"
添加字段到联系人、交易或公司:文本、数字、日期、选择、复选框、URL 电子邮件
定义MEDDIC或BANT对照教练成绩的成绩表。
类型:"创建更新管. 90 日出数( E)10%), 60 日出数( E)25%),联系(40%),谈判 60%),续订(100%),Chorned (英语:0%。设定腐烂阈值为 14 日子,"。" (笑声) OpsIQ 生成计划,您审查,然后单击应用。管道立即出现在您的管道页面上。
构建者只生成它知道如何验证的动作。 如果您要求在其能力之外的东西( 例如“ 融入我的习惯 ” ) API 它将拒绝这一请求,并解释它能够做些什么。
是的,每个建筑我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 Health是一个自我诊断的页面,可以验证你的CRM设置正确并顺利运行.
数据库表格存在,并有正确的列。如果移出失败, CRM Health 将标出它 。
所有CRM代理(Capture, Data Steward, Disease Intelligence等)都注册注册并健康. Green = 运行,琥珀 =需要注意,红色 = 有错误.
CRM API路由和AJAX端点是注册和可调用的。
密码CRM动作目录在动作登记簿中注册。如果缺少动作,CRM以再入会而自取自愈.
联系人、公司、交易、任务、活动和事件总数,可用于核查进口和不断获取数据。
第一次过后CRM设置, 打开CRM健康并核实所有检查都是绿色的。如果有琥珀或红色,请点击项目进行诊断解释,并提出修正建议。
初始设置后,重大更新后,以及每当CRM行为似乎是错误的时,检查. CRM Health 仅通过打开页面就能自愈许多问题(如缺少行动注册).
CRM揭露了一个完全公开的REST 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(列表可用事件类型).
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
}当创建或更新联系人时, 已解除。 这是要订阅的联系人事件; 没有单独创建的事件 。
当接触者移动到不同的生命周期阶段时被解除.
当联系人状态改变时, 已开火 。
转换记录到联系人时被解除。
添加标签到联系人时被解除 。
被删除的联络人, 以请求隐私时解除。
当交易被创造的时候,他们就被解除了。
当交易进入不同阶段时,就被解除了职务。
交易结束时就被炒了
当交易结束时, 被解除了
当一个团体被创造的时候,
当新任务创建(人工或AI生成)时被解除.
联系人回复外延电子邮件时即被解除。
当一个外联邮件弹出时, 被解除了任务。
webhooks.events.list 用于您安装上的权威集, 并带有每个事件的有效载荷。 它来自发送代码本身, 因此它绝不会对实际到达的内容有异议。 完整列表也出现在 Webhooks 部分 。所有 Webhook 事件均由 HMAC 签名,并在失败时重审。 请订阅 a URL 在设置 > Webhooks 中,或自"id"起使用可持久更改种子的民意调查 crm.events.list。
设置一个 Webhook 订阅器opsiq. contact.upsert.将其指向谷歌 Apps 脚本网络应用或 Zapier 网络hookURL。有效载荷包括联系人名称、电子邮件、公司、铅分和源。您的脚本为每个新联系人附加了一行 Google 工作表。
部分保存可重复使用的联系人过滤器CRM观点、外联、宣传和其他有受众意识的工具。
A 现场部分 每当使用时,均从当前数据中重新计算。 被绑住的快照 冻结当前成员名单,当外联对象在批准后不得改变时,该名单是有用的。
选择 全部 当每个条件必须匹配时或 任何 当一个条件足够时。在保存前先检查活计。系统段可以可见,但不受普通编辑的保护。
铅分规则将行为和剖面信号转化为销售和自动化可以使用的一致分数.
AI规则构建器可以将一款平正英语指令变为结构化规则. 激活前,每个规则仍应审查:确认活性或关键词,最小计数,滚动窗口和分数变化等.
正面规则和负面规则可以共存。使用 非核心工作空间 在修改了物质规则之后,现有联系人将在新模式下进行评估。分数可以输入段、路径、探矿和工作流程条件。
领导板利用配额实现情况对代表进行比较,在选定的月份赢得收入、佣金和开放管道。
只有在每个代表拥有现行配额和交易的正确所有人、金额、货币和近距离地位时,配额的实现才有意义。 用领导板来指导与表彰,而不是唯一的质量衡量标准;将它与交易的健康、活动和预测准确性联系起来。
交易批准要求经理签收后,才能标出高价值交易的中标.
启用策略并设置关卡1职等2阈值。 0 当一个非管理者试图在门槛上或以上赢得交易时 OpsIQ 创建批准请求,而不是默默地改变阶段。
管理人员和正式管理人员不受该政策的阻碍,每项决定都应保留请求人、核准人、时间和可审计性的理由。
生命周期规则当当前数据匹配保存的条件时,会自动移动各阶段之间的接触.
每个规则都有源站级,目的地站级等,活动旗子,优先级和分段式过滤. 预定的生命周期任务首先评价更高优先级,并在第一次对接接触后停止.
规则应该是相互理解的。 避免两个在同一个运行中可以将相同的接触向相反方向移动的有效规则。 在激活前, 测试过滤器对某一段进行测试 。
工作空间活动流将客户和操作事件结合起来,这样团队就可以在不打开每个模块的情况下调查所发生的事情.
按事件类型、日期、联系人或客户状态(包括付费客户)过滤。种子是已记录活动的读取模式;它不取代源票、对话、交易或连接器记录。在采取敏感行动之前打开链接记录。
工作流程对一个事件作出反应,并运行一系列命令行动,包括由克龙恢复的被延迟的步骤.
通过选择触发器创建工作流程,添加步骤并启用它。延迟被存储,而不是被浏览器请求所持有;统一克龙恢复了到期的工作流程运行。
内建起的起步模板包括注册后欢迎,购买后感谢和演示确认. Clone a splate,替换其收件人/内容,然后在广泛激活前用可控记录来测试.
设计要具有一能性的行动。 重试时不得发送重复的移动货币请求或创建重复的记录 。
车票是您的正式支持频道。它们有部门、优先级、SLA目标、附件、内部笔记和完整对话线程。车票可以从 OpsIQ 管理员、票单/封存、电子邮件摄取、聊天升级、连接器或 API.
客户通过电子邮件、聊天升级、入住票位或管理员创建信息发送信息。该票会获得独特的ID(例如T-)12345).
AI读取主题和主体,指定优先级(Low/Normal/High/Engent),建议一个部门,并检测情绪。如果能够进行分解,就自动发生。
代理打开出票,阅读上下文(客户简介,连接器的平台数据,前作出票)并写出回函. AI可以起草回函,代理在发送前会编辑.
问题解决后,代理关卡出票,通知客户,如果客户在关闭后回复,则自动重新开票.
将票移到不同的部门(例如从将军到比林),当初始路线错误时有用.
将票子分配给特定队员,指定代理人在他们的"我的门票"视图中看到出票.
仅写一张只向工作人员可见的纸币,用于:调查结果、退款理由、工程背景、先前的承诺。内部纸币从未在客户面前出现。
合并同一客户的重复出票,合并出票主体获得[MERGED]标签,两张出票的信息全部保存在幸存出票中.
插入一个预写回复模板。 variables like {{customer_name}} 财务报告和已审计财务报表 {{ticket_id}} 自动替换。
让 AI 改进您的回复草案: 调整语气、 缩短/ 长度、 修改语法或翻译。 您在发送前要查看结果 。
设置为 Low, Normal, high, 或 emergency。 优先级会影响 SLA 计时器和排序顺序 。
设定为打开、 待决、等待客户、 解析或关闭 。
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 门票也一样
非紧急问题、 特征请求、 一般反馈。 目标首个响应 : 24 小时。
标准支持问题。8小时。
影响客户业务 目标第一反应: 4小时。
服务下降,安全事故,数据丢失,计费错误。目标第一响应: 1一小时。
SLA计时器在票单创建时开始,在状态为"等待客户"时暂停。如果SLA目标被错过,罚单被突出,可以任意升级。
绝不,内部笔记严格只限员工使用,不会出现在客户票端、电子邮件通知或任何客户表面。
票子自动重开并返回活动队列,球队接到新回执通知.
是的, 使用锁线选项来防止客户和AI添加新的回复。 可用于解决争议或结束调查 。
您支持操作的操作行为控制室: SLA 政策带有升级梯子、 公务时数日历、 强制状态流、 CSAT 设置和企业功能交换器。 从入票页( 操作栏中的服务工作室按钮) 打开它 。
每张新票都会从最具体的积极政策中获得首回和解答的截止日期:部门+优先级比部门,优先级好,默认级好。在等待或搁置的票位上,截止日期会自动暂停。
一项政策可以确定最多可达6个步骤,而不是一项违约行动:例如,对受让人发出警告。75% 窗口中,提醒管理者 100%,重新指派到 150% 每张罚单 每一步都点火一次
上班时间到了,SLA只在工作时间内会点燃时钟,所以每周五晚开出一通车票不会被周六所违反. 命名的日历(时区,日,时,节)可以附加在不同地区的球队个人政策上.
限制管理员可能做出哪些状态变化的矩阵,并设置 Zendesk 样式的预置。自动化、入境电子邮件和客户原产机票回复总是免予执行,因此严格的矩阵永远不能堵塞管道。在关闭前可选择要求经批准的签注。
代理商要求签收机票(超过门槛的退款,政策例外)。指定批准人或任何正式管理者都用说明决定;请求者永远不能批准自己的申请。等待批准时,会作为信箱上的标语出炉。
链接票作为关联,重复,父子或封存;将回复分出新的链接票(合并倒数,不给客户发电子邮件);跟踪申请通知的出票,以及可选的CC后续邮件地址在出票回复.
启用实时收件箱后, 代理商在数秒内通过现有的通知流出现新票和回复。 在一张票上, 代理人看到还有谁在观看并获得警告旗, 当队友已经写回信时。 一击的“ 索赔” 按钮会将票分配给自己 。
运行规则可以匹配AI 分类信号:优先级,类别,情绪和升级风险,加上您门户网站请求表中的自定义域值。使用这些条件的规则在启用特性之前一直处于休眠状态.
表格只规范行政管理信息系统的行动。 客户提供的回复、电子邮件回复和自动化被故意免除,因此严格的政策永远不能将客户锁出或中断管道。
否。用单一违约行动保存的政策不会改变。阶梯只取代您定义步骤的政策上的单一行动。
自动重回让AI自动回应新出道的门票. 升级后,AI发现特殊需求时会将门票移动到不同的部门,两者都跨出本土出道门票和电子邮件出道口出道道门.
从任何来源(电子邮件、聊天、门户网站、API).
OpsIQ 等待所配置的延迟( 默认 ): 2这让人类特工们有机会先做出回应
如果在延迟期间有人类代理回复, 自动重写将被取消。 如果不是, AI 将生成回复 。
AI读取票子,检查知识库,连接器上下文,以及客户历史,然后写出回覆. 答复被发送(或排队作为草稿进行审核,视设置而定).
设定哪些部门可以接受升级(例如比林可以从通用升级,技术可以从通用提升).
在自动复制前,AI将票意分类:计费,技术,退款,滥用等.
如果票意向与升级部门相匹配,则票被移动,内部注释解释了原因.
答复是利用目的地部门的知识和人工智能培训生成的。
开关,打开引擎,可以自动复制票
哪些部门可以接收自动复制。在开账单前,先从低风险部门(通用,销售)开始。
等待AI回复的时间( 秒) 。 默认 : 120 秒数( E)2准备到0即时回复。
可选择为工作时间与下班后时间设定不同的延误。
如果人类代理先回复, 请取消自动重写。 默认: 打开 。
启用基于票意的自动部门路由.
哪个部门可以升级为。
升级时要设置什么状态( 如 Open, 待定) 。
是否增加内部注释解释升级原因.
从电子邮件(通过邮箱投票或MX接通的发送)中创建的出票方式遵循了相同的自动重写和升级规则。AI回复作为电子邮件回复发送给客户。如果配置,电子邮件草稿会到草稿队列审查。
只有在您为比林部门提供自动校正。 我们建议您在对AI进行全面计费知识的培训和彻底测试后,才能从自动校准开具账单开始。
如果客户回答说答案是错误的,那么人类代理人应该介入. 审阅AI历史来理解AI为什么给出错误答案,然后更新知识库或AI训练以防止它再次发生.
是的,将发送模式设定为“草稿”而不是“自动发送”。自动复制草稿将在发送前出现在草稿排队供人审查。
入网门嵌入了门票,使您可以在任何网站添加出一款售票管理界面。客户可以查看其出站门票、创建新出站口并回复,但无需输入。OpsIQ 管理员。
将售票门户在您页面的窗口内打开。该门户将占用其容器的全部宽度。
显示一个浮动按钮,在面板中打开出票门户。类似于聊天部件。
需要签名的身份证明。客户只看到自己的机票。
<!-- 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>对于认证模式, 您的服务器会用网站密钥签署一个短命的代号。 此代号告诉 OpsIQ 客户只看到自己的门票。这是标准的 HS256 JWT:任何JWT 图书馆的功能。这个秘密永远不会进入一个页面。
<?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=// 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正在响应的对口,您可以随时点击"Join"来接任.
专为您安排的对话
商议客所等应答.
已完成的对话。 可按关键词、日期和客户搜索 。
当你从AI那里接过谈话时,遵循这三条规则:
介绍一下自己,我是支援队的莎拉
让你看看谈话 "我看到你问了命令状态"
告诉顾客接下来会发生什么 "我现在正在调查这个,几分钟后会给你一个答案"
使用每次对话的顶端的AI切换。 当AI打开时, AI就会产生响应。 当关闭时, 只有人类代理才能回复。 即使关闭和返回时,AI也会记住对话的背景 。
在设置中配置营业时间。在营业时间之外,AI可以: (1继续对客户作出回应,(2)显示"外出"信息并创建后续的入场券,或(3) 完全禁用聊天并显示出票表。选择适合您支持模式的行为。
与顾客的情绪强度不符,承认他们的挫折而不采取防卫.
答复前要收集相关信息:订购细节,账号状况,前出票情况.
如果情况涉及退款、法律威胁、滥用或安全,则升级为高级小组成员,而不是试图单独处理。
是的,在谈话中用内部笔记与其他特工沟通 这些笔记对客户来说是永远看不到的
对话移动到存档站。 如果客户稍后发送了新消息, 将创建新对话 。
连接WhatsApp,Facebook Messer,Instagram DM,Telegram和LINE,所以客户已经发送您到的邮件与您的网站聊天在同一个收件箱中,由同一个AI助手回答.
每个频道一旦连接,其行为都相同:一个客户信息成为聊天信箱中的谈话,你的AI助手用与您网站聊天相同的知识和指令来回答,任何代理都可以接手。关于您的AI,每个频道不需要配置.
一击。 打开连接器→Facebook Messent & Instagram DM,单击 Connect, 与管理您页面的Facebook账户签名, 并选择该页面。 当您的页面链接到一个Instag拉姆专业账户时, Instaggram 将随之而来 。
点击您的提供者提供它的地方: 打开信使中心连接器并使用 Connect WhatsApp, 然后跟踪 Meta 的引导签名来选择或创建您的 WhatSApp 商业号码。 否则将粘贴来自任意一个的证书 。20网关.
2分钟。 消息在 Telegram 中@ botFather, 发送/newbot,选择一个名称和一个以“bot”结尾的用户名,然后将它给你的符号粘入“Telegram”连接器。OpsIQ为您注册网页。
创建消息API频道 at developers.line.biz, 粘贴频道密钥和访问令牌, 然后复制 WebhookURL显示于OpsIQ进入LINE,并切换自己的自动复制机关闭.
在信使中心增加一个供应商(Twilio,Vonage,Termii等),并注明其证书和发送号码.
连接频道不会启动它。跳转到 设置 → 客户聊天 → 高级 → 通讯通道,在主切换后切换单个频道。每个频道都有自己的AI自动重存开关,这样在打开其余频道之前,您就可以先试听一个频道。
在连接器中,使用连接器抽屉中的指令.
点击测试。 它会给提供者打电话, 告诉你如果有什么问题的话, 什么是错的 。
设置→客户聊天→高级,打开主开关,然后打开频道
从另一个账户中发送信息, 包括您的页面、 号码或机器人。 它应该在数秒内出现在聊天信箱中, 并获得 AI 回复 。
消息平台限制企业在客户写作后回复的时间.OpsIQ显示每次谈话的剩余时间,并为您执行规则。
24小时后,您只能发送一个已核准的模板,在同一个高级标签中配置。
24正常答复小时;代理答复时间最多7几天后,梅塔的人类代理津贴。
没有设置平台窗口 。
答案来自您的 Page、 数字或机器人, 和人类的回答完全一样。 您的 AI 指令控制着语气以及它是否识别自己 。
是的,打开聊天信箱中的谈话并点击 JUN。 AI停止, 你输入, 客户看到他们一边有连续的线程 。
在连接器上使用断开连接。 信件历史被保存; 新信件只是停止到达, 而平台被告知停止发送 。
号。 页面属于一个工作空间。 连接它会移动到其它地方, 第一个工作空间会停止接收信件, 所以故意断开, 而不是重接到别的地方 。
这些例子显示训练有素的客户AI应该如何处理常见的情况。 使用它们来测试你的AI培训并找出差距 。
大赦国际应当:(a)1查一下顺序 #ORD -5523 (通过连接器。)2报告目前的状况,如有追踪信息,则予以报告。 (3如果命令被推迟,应承认延误,并提供估计时间表。 (4如果连接器没有运输状态,则不创建运输状态。
大赦国际应当:(a)1(b) 知识库对现行定价的回答。2)解释月费与年费的差额. ("明细表")3如果答案不在知识库中,那么就说吧,并提议将其与销售联系起来。 (4不发明不在知识库中的定价。
大赦国际应当:(a)1冷静地承认挫折感。 (2询问订单号或账户电子邮件。 ()3解释退款过程。 (4创建支持票或升级为人类代理。 (5不承诺退款,这需要人类的批准。
大赦国际应当:(a)1(c) 确认关注。2收集有关细节(电子邮件、指控日期)。 (3(a) 解释账单问题需要人审查。4) 制作带有详细内容的计费部门票.5确定High的优先级。
大赦国际应当:(a)1如果客户语言得到支持,则以客户语言响应。 ()2回答关于从知识库向法国交付的问题。 (3),如果不支持该语言,则以默认语言回复并注明哪些语言可供使用.
大赦国际应当:(a)1如果配置为后小时AI,则回复和帮助. (A.2)如果下班后创造出票,请说:"我们的团队目前已经下线了,我为你创造了一张支持票,有人会在营业时间跟进. " (B).3)提供票号.
大赦国际应当:(a)1实事求是地描述出你产品的长处。 (2不要对竞争者说坏话。 (3如果知识库中有一个比较页,请与它链接。 (4)如果客户询问你没有的特征,请诚实.
大赦国际应当:(a)1必要时提出澄清问题(例如,哪些特征最为重要)。2(b) 根据知识基础建议一项计划。3解释为什么该计划符合他们的需要。 (4)提到他们可以从一个更小的计划开始,以后再升级.
大赦国际应当:(a)1(如果有的话,请以礼貌方式解释目前的晋升情况。)2不创造或承诺不在知识库中的折扣。 (3如果客户坚持,则主动提出将其与销售团队联系起来。
大赦国际应当:(a)1提供知识库的分步指示。 (2)包含准确的页面路径和按钮位置. ()3如果特性需要具体计划,请注明。 (4如果该特征不存在,请诚实地提出替代方案。
当一个直播聊天需要一个真实的人时,AI会回答两个问题:由哪个团队拥有这个对话,以及应该告诉谁. 两者都配置在设置,客户端聊天,支持流,在AI的路由部门下.
板上的两个盒子是白名单。只有向右移动的部是AI能够前往或打开门票的部。左侧的任何东西都看不见,即使部门存在并且有人员。在您工作的时候,开始缩小和增加部门。
这是大多数人期望配置的,不需要。当AI升级聊天时, OpsIQ 你管理过这个名单,在团队和部门页面上 票价上涨和聊天量上升都跟着它
部门下属的每个在职管理人员都会收到自己的副本,暂扣和停用账户都会跳出。
使用时没有队员附着,所以升级仍然会到达某人.
发送是不可能的,路线面板上标出这个部门红色,AI没有告诉访客一个人类被通知.
完全由一个部门负责。 它接受AI无法自信地定位的聊天,它是最后的手段,而不是正常的路径。
账单的措辞是指开具账单的部门,托管和错误的措辞是指技术部门,购买措辞指向销售部门。
如果关键词没有结果,模型会读取对话,从被启用的部门中挑选.
只有在两个都空出时, 全面检查部门才接受聊天。
如果包罗万象是销售部门 而访客没有显示购买信号 OpsIQ 寻找一个支持或技术部门代替,所以普通的支持问题不会在销售中积累.
如果升级邮件被发出,AI会告诉访客已经通知了团队。如果无法出场,AI就会说一些诚实的话,请他们把消息留在聊天中。它不会声称在没有发送电子邮件时有人被提醒。
没有人被附在其中。 Open Team and Departments, 附加至少一个活跃的管理员, 然后重新装入设置页面。 面板读取了 活 。
是的,一个部门之前保存的自定义地址仍然会取代团队名单。新的设置应该将人员附加到部门,所以有一个单一的维护地点。
检查一下是否是销售部门 如果是的话 访客没有显示购买信号 OpsIQ 故意前往支助或技术部门。
OpsIQ 可以连接到电子邮件邮箱, 从收到的电子邮件中自动创建门票, 并将回复作为电子邮件发送。 它还提供了AI 起草的回复, 供人类审查 。
IMAP (大多数提供者), Gmail API (Google 工作空间),或 Microsoft Graph (外观) 365).
主机、端口、加密( U)SSL/TLS),用户名,密码或应用密码,文件夹(通常是INBOX).
将邮箱映射到售票部门 电子邮件地址: [email protected] 在"支持"部门创建入场券.
转到 Google 账户 > 安全 > 2- 步入验证并启用它。
转到 Google 账户 > 安全 > App 密码。 选择“ 邮件” 和“ 其他( )OpsIQ)),复制该文本. 16- 特征密码
转到电子邮件 > 邮箱 > 添加。 设置主机 : imap.gmail.com,端口 : 993,加密: SSL,用户名 : [email protected],密码:应用程序密码.
点击测试连接。 如果成功, OpsIQ 将在所配置的间隔时间开始新邮件投票。
在 Outlook 设置 > Mail > 同步电子邮件中,确保 IMAP 已启用。
如果启用了 MFA,请创建应用程序密码。否则,请使用常规密码。
主机 : outlook.office365.com,端口 : 993,加密: SSL,用户名 : [email protected].
单位 cPanel > 电子邮件账户,单击您的电子邮件账户 IMAP 设置。
主机: 通常 mail.yourdomain.com 或您的服务器主机名, 端口 : 993 (SSL)或(或) 143 (STARTLS),用户名:完整电子邮件地址.
当自动复制设定为“ 草稿” 模式时, AI 生成在草稿队列中出现的回复草稿。 您可以 :
读取草稿并检查准确性.
发送前修改文本、语气或内容。
批准草案并作为电子邮件答复发送。
不宜删除的,删去草案.
如果置信度足够高,自动发送功能也启用了,那么在可配置的延迟后会自动发送草稿.
检查 : (1邮箱是否连接并健康? 在 Email > 邮包中查找绿色状态 。 (2工作在运行吗?3电子邮件是否被过滤或移动到除INBOX以外的文件夹?
是的,每个邮箱都可以被映射到不同的部门 [email protected] 前往支持, [email protected] 去比林大学
CSAT测量票和聊天满意度,表面不满意的反应并比较AI和人类的结果.
车票调查在关闭后安排(通常情况下) 24 积极的反应是:4或 为5。使用减号队列表示数1或 为2并在联系客户前阅读出票/交谈.
聊天反馈单独报告AI解析和人手处理的对话,低样本大小不应用于给代理或模型排行.
电子邮件平台页面允许授权的操作员向所有现役特工,被选中的特工或部门发送一次性信息并审查发送历史.
此页面用于内部操作消息, 而非客户营销。 请选择最小的正确受众, 预览名称和地址, 然后发送。 交付使用配置的外出电子邮件路径并记录结果 。
如何配置 OpsIQ 发送电子邮件, 将输入信件转换为票面, 并证明发送域已准备好 。
完整的管理员可以选择首选的电子邮件连接器; OpsIQ 返回到配置中 SMTP/ 酌情发送邮件。 请从名称/地址中设定一个可识别的地址, 发送测试并检查 24- 小时成功/失败的衡量标准。
一个 IMAP 邮箱需要名称、电子邮件地址、目标部门、主机、端口、安全模式、用户名、密码、文件夹、投票状态和证书验证选择。使用 投出来 以在等待克龙之前核实摄入量。
在同一服务器上,一个邮件管可以直接传递生的RFC822消息. 一个远程邮件服务器可以使用它的符号将生的邮件传送到受保护的入站端点,两种路径都输入相同的去发,去线和出站口管道.
SPF/DKIM/DMARC 检查是配置出域的咨询证据。绿色检查不能保证收件箱的放置,但在发送生产信息前应当固定失败。
支持"门户工作室"设计并发布客户端支持体验,而不需要外部图像资产.
使用模板作为起点,然后配置主题、布局、导航、知识搜索、票单、助手、脚印、品牌、票证行为、自定义 CSS 和一般设置。在发布前预览桌面、平板电脑和移动。
知识-gap队列收集客户问题,AI无法自信地回答,以便团队能够提高覆盖范围.
打开一个空白读取原题和相邻的对话,然后选择正确的固定:更新一条已有的文章,创建一条新的知识文章,添加一个商业事实,正确的连接器数据或更改升级指令. 标记它只有在评价或真实测试返回一个可接受的答案后才能解决.
状态管理网页使用组件、当前状况和更新来沟通服务健康和事件。
持续使用组件 。 当事件影响客户时, 发布初始通知, 随事实变化而添加加时标的更新, 并用简洁的解析摘要结束 。 请不要将状态页作为内部调试日志; 敏感诊断属于 OpsIQ 和服务器日志。
AI配置是您选择您的 AI 提供者,模型和成本控制的地方 。OpsIQ 支持多个提供者: Claude (Anthropic),GPT-4o (中文(简体) ).OpenAI), Gemini (Google),和克罗克(xAI). 你可以使用你自己的 API 密钥( E)BYOK 或管理AI,如果有你的计划。
强推理,注意事实,善于遵循复杂指令. 模型:克勞德-相生网-4-20250514 克劳德...3.5-sonnet. 最佳服务:支持对话,技术问题,详细分析.
快速,有创意,有良好的通识. 模型:gpt-4o,gp特-4o-mini. 最佳:快速响应,有创造性地写作,有广泛的知识问题.
善于实际问题,多语种支持. 模式:gemini-2.0- 闪亮,gemini-1.5- 最佳的:多语言支持、事实观察。
快速而简洁的反应。3最好快一点,快回答,随便点
你自供养 API 键。您直接向提供方支付费用。完全控制模型的选择和使用。
A. 与《公约》有关的其他事项 OpsIQ 计划。API 使用量与你计划的AI信用余额相抵
在那个 OpsIQ 管理员,导航到设置 > AI配置。
从下拉中选择您的 AI 提供者 。
如果使用,则 BYOK 输入 API。对于管理AI来说,这是自动处理的。
选择要使用的具体模型。 较小的模型更快, 更便宜。 较大的模型给出了更好的质量答案 。
点击“ 测试连接” 以验证 API 键和模型正在起作用。绿色标记意味着成功。
单击“保存”以激活您的AI配置。
设定AI 符号的每月最大开支。 当预算达到时,AI 特征是优雅地降解(缩短回复,不自动复制)而不是完全停止。
单个对话的最大值。 防止运行中的谈话消耗过多的信用 。
当您的AI信用余额下降到阈值以下时( 默认 ): 50,000),在管理器中出现警告。在 AI 配置中设置此选项。
AI 配置是每个工作空间。 如果您管理多个站点, 每个工作空间可以使用不同的提供者、 模型和预算。 除非被覆盖, 工作空间会继承全局默认值。 要配置每个工作区域: 切换到工作空间, 则转到 AI 为配置并保存设置 。
转到 console.anthropic.com > API Keys > Create Key. 复制从"sk-ant-"开始的密钥.
转到 platform.openai.com > API 密钥 > 创建新的密钥。 复制密钥开头的“ sk- ” 。
转到 aistudio.google.com > 获取 API 密钥。 为您的工程创建密钥, 复制密钥 。
转到 console.x.ai > API 钥匙 创建和复制您的钥匙
如果测试失败:(1检查一下 API 键正确(没有额外空格)。 (2)检查您的账户是否与供应商建立了帐单。 (3)检查模型名称是否有效.4如果使用"管理AI",验证您的执照是活性的.
没有任何一个最好的提供者,克洛德在支持对话方面是出色的。GPT-4o是快速和多功能的。Gemini 处理好多种语言。请尝试每种语言,并查看哪些语言能为特定使用情况产生最佳效果。
是的 改变供应商 API。当前对话历史被保存。AI将使用新的提供者来进行所有未来的对话。
AI的分解优雅:回复变得更短,自动重写暂停,管理员显示的警告差. Core track,入场券,以及CRM在没有AI的情况下继续工作.
一组选择进入控制,它使客户聊天更聪明(其原因贯穿客户的账户,就像人类代理)或更便宜(它发送AI较少,或者回答的步数更少)。每个控制都是默认和独立的,一个开关永远不会改变任何其他行为。大多数控制生活在设置 > 客户聊天 > 行为之下;少数控制在设置您的AI并训练您的AI上。
一个普通的聊天员从一个角度回答一个问题。 代理模式 ,助理可以一次进行几次只读账户检查并交叉引用,例如“我是否有张门票,我的余额是否足以让我下次续签?” 用一个解答的数学来回答。它只为已核实的客户进行账户或退款问题;其他一切都是正常的单接答案路径。
每个回合最多只读浏览几个,在回答前交叉引用。当您有一个连接的平台时打开(WHMCS, Shopify, Stripe, Zendesk等). Off=今天的单向行为,不变.
复杂转弯(低/中/高)的模型原因有多难。从低起步;大多数支持问题在那里处理得很好。
平分一个更强大的模型,只用于复杂的代理转盘,所以日常聊天都停留在一种轻而便宜的模型上,只有硬转盘才能支付深度. Blank=你的普通客户聊天模型.
一个很小的规划步骤决定了要拉哪一个检查和是否需要知识库,然后用一个主调而不是几个步骤来回答。在代理模式下的一个子切换。除非代理模式被打开,否则无法启用。同样的回答质量,对多部分问题的调用更少。
保留一个较旧消息的短长运行摘要(名称,票/发票号码,金额,决定),因此助理在非常长的聊天中保持一致,而不将整个记录稿再发。最好支持重,长的线程;对等的代理模式.
将小打字( “我的开口票” 、 “ 无报酬的空话 ” ) 作为要用的词来读取, 因此找到正确的信息而不是漏掉。 每个连接的平台都可用。 默认关闭; 用于移动重的聊天 。
只有在问题涉及客户账户时(余额、发票、票、服务),才附上客户账户的快照,在一般问题上跳过。在不损失质量的情况下,成本将减少。当需要时,助手仍可现场获取账户。
”嗨,“谢谢”和“OK”不会触发一个知识库搜索,这些回复从不使用它。任何有真实内容的信息仍然正常搜索。
标出单个回复可以持续多久。回复长度是呼叫中最昂贵的部分,所以一个合理的封顶(大约) 500)是单个最有效的聊天成本控制。只降低您的全球限制,永远不要提高。
模型在回答( 最小到高) 之前会怎么想 。 保持客户聊天速度最小/ 低; 保留更高的设置进行分析和代理驾驶 。
每个AI表面(活聊天,票子草稿,摘要,分析,管理员副驾驶,升级,站点情报等)都可以运行在自己的模式上. 速度重要的光线,质量重要的强力. lank on a survement = 提供者默认该任务.
管理员副驾驶可以保留有界限的工作内存,只装入问题需要的工具(lean survey)而不必每个转弯都装入.
您的指示每转一次都会被发送, 因此长度是经常性成本。 压缩按钮会重写一个槽, 用更少的单词来表达相同的话。 如果它会丢掉任何内容, 它会拒绝重写 。{variable} 或规则, 并报告它所保护的, 所以它永远不会默默地改变意义。
显示什么 OpsIQ 已经知道您每个插槽的业务,所以您可以删除您在自己的指令中重复的内容 。
否。 每个控制默认和独立关闭。 打开一个只增加其行为; 关闭它返回到它以前的确切工作方式 。
每日在光线模型上聊天并给一个更强大的代理模型打针。 如果您有连接的平台, 请启用代理模式, 然后先规划, 再进行长对话内存。 然后是上下文, 跳过 KB 并加一个回覆盖。 最后压缩您的指令。 每次修改后请注意一些真正的聊天 。
管理员AI聊天是一个工作工程师, 而不仅仅是一个问箱。 它可以在网络上研究修正程序, 保存您的操作程序库, 巡视您的服务器, 并移动文件。 大部分都是通过聊天来驱动的; 您配置的前置内容是您使用的哪个网页搜索提供者, 在设置您的AI页面上 。
代理在工作时搜索网络中的文件、 错误消息和当前信息。 此选项使用 DuckDuckGo, 它不需要密钥和设置 。
保存了您的程序库(“我们如何在这里做X ” )。 代理在完成一个棘手的工作之后写下一个, 下次再跟踪它, 因此, 诀窍在聊天结束后就一直存在。
排好只读巡逻,"每天早上检查磁盘空间和错误记录,然后告诉我" 发现的就在你管理员的铃声上
询问日志文件并获取私人下载链接, 或将一个文件从一个连接的服务器复制到另一个服务器。 both caped at 5 MB.
代理网络搜索使用什么。默认是 DuckDuckGo: 无密钥,免费,每个安装都有工作。 Brave Search, Tavily and Serper.dev (Google results) 通常返回更好的结果,但每个需要一个 API 如果按键提供者因任何原因(坏键、配额被用掉、网络出问题)而失败,则该搜索会自动回到 DuckDuckGo ,所以搜索永远不会变暗。
您所选择的提供者的密钥, 仅是勇者、 Tavily 或 Serper 所需要的。 一旦保存它, 它就会被蒙上面罩, 并且再也不会在页面上显示; 粘贴一个新的来替换它。 一个键盘提供者只有在提供者及其密钥都保存时才会活动 。
当代理刚刚完成一个任务时, 您会想再次做同样的事情, 请说“ 保存它为名为 “ 夜行清理” 的运行本。 从此以后, 它会在每次工作时看到该运行本的名称, 当你要求使用名称( 或者描述它) 时, 它会拉起步骤并跟踪它们。 您可以随时要求它列出、 更新或者删除运行本 。
任务是代理自己经常进行的工作:每小时一次,每天固定小时,或每周一次。任务只按设计读取,但不能修改服务器、数据和网络,而是永远不能改变任何内容;调查并报告。任务结束后,发现结果会作为通知寄到您的管理员铃上。说“现在进行晨间巡逻”,以触发一个需要时的检查,或要求代理人员列出、暂停或删除任务。
询问一个文件( “ 从网络服务器上获取今天的错误日志 ” ) , 以及代理器用私有下载链接进行分级和回复。 链接只对签名管理员有效, 并且一天后过期 。 文件封顶 。5 MB;对于任何更大的,请代理先在服务器上进行压缩或修剪.
代理服务器也可以在两个连接的服务器之间复制一个文件, 最多可达 5 MB。目的地的写法被像其他任何更改一样对待:在询问模式中,您先获得批准卡,现有文件会被备份,副本可以被反转。为了安全起见,文件内容在应用副本时会从源重读,而不是从聊天中取出.
AI Training 是您教授 OpsIQ 如何行为的地方。 您会写出定义个性、界限、知识焦点和升级规则的提示。 把它看作为新的辅助代理撰写培训手册。
控制 AI 在聊天部件中如何与您的客户交谈。 这是正确处理的最重要提示 。
控制 AI 如何协助您的管理团队使用操作仪表板。 它处理内部查询和动作执行 。
客户AI的提示应该覆盖这些区域:
AI是谁?给它一个名字,角色和个性。例如:"你是Luna,一个友好而有知识的客户支持助手Acme Store".
它应该如何沟通? 例如:“专业但温和。使用简单的语言。避免用词。使回复简洁(2-3”).
其知道和不知道的是什么?例如:“你知道我们的产品、定价、航运和回报政策。你不知道竞争者的产品或公司内部的决定。 ”
何时应该交给人类?例:"在顾客要求退款,提及法律诉讼,报告一个安全问题,或者三次问出同样的问题时,向人类代理人升级".
硬边界。 比如:“永远不要承诺退款,永远不要分享内部定价公式。永远不要构成不存在的产品特征。永远不能提供医疗、法律或财务建议 ” 。
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
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
从身份、语气和关键界限开始。不要试图在第一天覆盖所有内容。
读取AI给出错误或次优答案的对口.
添加关于反复出现问题的具体规则。 例如:如果AI继续承诺退款, 加入“ 永远不要承诺退税, 说你会升级到计费团队中去 ” 。
如果大赦国际不能回答一个问题,就把答案添加到知识库中,而不是试图将所有问题放在即时。
即时定义了个性、界限和规则。知识库提供了事实信息(产品细节、定价、政策 ) 。 AI既读了两者,但即时塑造了行为,而KB则提供了答案。
提示是每个工作空间。 如果您需要不同的部门不同的AI行为, 请使用知识库提供特定部门的信息, 并在提示中提及部门的背景 。
AI History显示AI与客户和管理员的每次对话,用它来审计AI的表现,找到错误的答案并找出培训差距.
当谈话发生时.
如果知道姓名和电子邮件,否则 IP 以及国家。
聊天部件,自动复制票、电子邮件草稿或管理员AI。
谈话全文:客户留言和AI回应.
对话消耗了多少个符号。 高符号的使用率可能表明AI给出了过多的动词答案,或者对话绕了圈子。
任何在谈话中执行的AI行为(查清订单,创建出票等).
如果CSAT被启用,客户对这次对话的满意度评分.
搜索特定话题以查看AI如何处理它们. 例: 搜索"退款"以检查AI是否遵循您的退款政策.
只显示低评分的对话,以关注不满的客户.
只显示自动复制的票, 用于审计自动回复, 与聊天分开 。
高调对话可能表明问题:AI乱来,绕圈子走来走去,或者没有回答问题.
读完完整记录,有什么不对?是知识差距,语气问题,还是答错?
这可能说明混乱,AI重复了吗?它是否不明白问题?
对于知识差距,请在"知识库"中添加文章. 对于行为问题,请更新AI的快取. 对于反复出现的错误答案,请加入明确的更正规则.
这意味着您的知识库缺少安装指南。 为每个产品的安装步骤创建知识库文章。 在添加后, 测试时询问 AI 安装问题 。
AI Insights自动分析对话模式并显示可操作的结论:常见问题,满意度趋势,知识差距和升级模式.
最常被问到的问题。如果“我如何重置密码?”是#1,您的知识库需要显著的密码重置指南。
CSAT 分数随时间推移而增加。AI满意度是否提高或下降? 突然下降可能表明知识基础的变化会打破某些东西。
AI在没有人类干预的情况下解决对话的百分比是多少? 70% 不错,下面 50% 意味着AI需要更多的培训.
为何对话被传递给人类. 常见的原因:客户要求人类,AI无法回答,敏感话题,账单问题.
AI经常说"我不知道"或给出低信心答案的主题.
每次谈话有多少个消息。非常长的谈话(10+ 消息)可能表明大赦国际不理解这个问题。
这是一个明显的知识差距。1在知识库中撰写一份全面的保修文章,涵盖所有保修条款、索赔程序和排除条款。 (2更新大赦国际的提示,以获取保修信息。 (E.3下星期监控AI Insights,看保修升级是否减少.
A. 行政法大赦国际(问 OpsIQ)帮助你的团队管理 OpsIQ 您可以要求它查阅数据、解释功能、总结票务和执行平台行动。
问:"给我看所有的票,从 [email protected]"或"什么是状态 命令#ORD -5523?"
问:"放大后一回 10 票房"或"本周最顶级的支持议题是什么".
问:"我如何设置自动重读"或"弹出率卡是什么意思?"
问:"为...... [email protected] 关于开账单,或者"关闭票T...12345"
问:"昨日来客多?"或"本月收多少?
AI通过所有相关数据来源查询客户:访问者会议、机票、聊天对话、订单和CRM。返回最近活动的概要,并链接到每个项目。
AI总结道:"今天,你曾经... 245 访客(上) 12%), 8新车票(3 (由大赦国际解决)2新订单共计 $198,以及1聊到一个航运延误".
AI确认:"我会换票T...5523 优先级从正常到紧急。 这将影响 SLA 计时器 。 确认 ? 您确认, 操作已执行 。
本节涵盖常见的客户端AI假想,并附有预期的行为和培训提示.
预期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会搜索相关文章的知识库,并用以生成准确,有根据的回复.
"你有什么退税政策?"
OpsIQ 通过匹配关键词和语义含义来找到"回归政策"一文.
大赦国际阅读了文章,并根据文章内容写出自然语言的答案。
答复的依据是你的实际政策,而不是AI的一般培训数据.
为每个话题分别写一篇文章:回程策略,发运费率,账户设置,密码重置等。不要合并无关话题.
从客户提问开始,然后提供答案。这帮助AI将问题与文章匹配。
"回归必须从内部开始 30 送货的日子比"我们有退货政策"好
数字产品呢?出售的物品呢?包括例外。
每季度审查文章,删除已过时的信息,在价格、政策和程序发生变化时更新。
运输费用、交货时间、跟踪、国际航运和装卸延误。
返回窗口、条件、流程、退款时间表和例外。
密码重置,电子邮件更改,账户删除,以及数据导出.
计划说明、计费周期、付款方法、发票和货币。
如何使用每个产品或特性. 分步指示并有截图.
常见的问题和解决方案,错误消息及其修正.
营业时间,支持渠道,响应时间,升级路径.
隐私政策摘要、服务条款摘要、GDPR 数据请求。
每个连接器都可以为AI提供知识. 当连接器被启用时,其内置的知识文章(产品目录,常见问题,平台特有故障排除)会自动提供给AI. 您可以在连接器的设置中切换每个连接器上的连接器知识或关闭连接器.
知识库有一个可配置的符号上限(默认: 32,000 如果您的知识基础非常大, AI会在本预算范围内选择最相关的文章。 如果AI没有找到相关的文章, 则提高上限; 如果您想要降低象征性成本, 降低上限 。
开始于5-10 包含您最常见的问题的文章。在您通过 AI History 和 AI Insights 找出差距时,多加一些内容。大多数企业需要 20-50 全面覆盖的条款。
目前,文章是手工创建的 OpsIQ。您可以从现有的 FAQ 、 帮助中心或文档中复制复制内容。
纯文本效果最好。 AI 理解自然语言比结构化更好 。HTML 写给顾客解释
评估将关键客户问题转化为回答质量、引用、升级和行动安全的可重复测试。
完整的管理员可以创建带有快速、预期源标签、所需引用、人与人确认规则、升级预期和被禁动作的评价集。直接运行一组,进行干燥运行,或者重放选定的历史 。
监视塔 每日或每周检查时间通过头寸进行,并运行数量限定的案件(每张排定的通行证最多8起)。
语言管理翻译的客户界面文本和在 OpsIQ 使用客户语言。
OpsIQ 翻译运算符进入客户端的文本。 在创建翻译前正确设定源语言, 添加目标语言, 然后在发布前审查草稿 。 “ 遵循客户端语言” 控制响应语言; 翻译部件界面控制其按钮、 标签和系统文本 。
翻译范围可以是只作草稿或现场翻译,在未经人文审查的情况下,不要依赖机器翻译来撰写法律、退款、安全或安全文本。
每个持有自己措辞的地方都列出其信息计数:客户聊天信息,促销,主动信息,聊天流,导游,公告,取笑者泡沫和 调查和表格。调查表面完全覆盖了每个已公布的调查:标题、每个问题、每个回答选项、按钮、欢迎和感谢副本、页染色体和结果页。关键值与问题ID和选项值挂钩,因此重新排列问题或选项永远不会丢失翻译,只重新翻译一个信息。所公布的现场调查默认提供;当您扩大范围时,草稿会加入。
聊天后电子邮件调查遵循了访客实际交谈的语言,条件是您在此提供的语言是;否则它会使用您的系统语言。它的六个可编辑字段也在本页面上翻译,行为在客户端聊天设置中有自己的切换器。
车票和门户信息 包括固定文本操作员一次,每名客户然后用一种语言收到:票证、开出、关闭和反馈确认、每个部门签收和门户欢迎行。 (AI自动检索不需要这些,它已经用客户的语言回答。 ) 电子邮件客户使用自己的语言 启用于 OpsIQ 写作,票子电子邮件按此顺序解决收件人的语言:他们在门户或帮助中心所选择的语言(被带入票上),他们联系记录上的地语,然后是他们写入的语言,通过脚本范围和标记词在本地检测到,没有外部调用。只有语言页面中选择的语言才被使用,所以这个功能是惰性的,直到语言被添加。HTML 电子邮件包装是刻意不翻译的:它是标语,而不是口语。 工作人员发邮件(通知、部门提醒、分析简报、预定报告、每周摘要)总是使用系统语言。
以移动自助服务、证据支持的工作流程、打字整合和对敏感决定的人力控制,运行员工生命周期,从请购到下船。
管理人员、组织、征聘、入职、文件、休假、工资调节、福利、业绩、学习、雇员关系、分析与治理。
使用移动一号门户进行私人记录,请求,文档,入职,时间,薪酬解释,学习,公司信息和权利.
使用被整理的 hr.* 行动及审查 platform.hr.* 通过一个合同进行操作,加上键入连接器类。PeopleOS中生成的索引API一节列出每一个项目及其范围。
PeopleOS HR被列入企业计划。在所有其他付费计划中,它都包含一个附加:账户所有人打开 账户→自动加载( T),选择PeopleOS HR级别,或者开始免费试验,或者直接添加。在招聘、面试和AI活动方面,等级不同。价格和限额由账户确定,而不是写入产品,所以请参见当前级别的标准。 定价页面。舱面表面的模样是 PeopleOS HR产品页面.
一项有效的付费计划。 免费计划不能添加,而仍在其自己的计划中的有偿计划必须等到审判结束。
审判是在您选择的级别上进行。 当没有购买而结束时, 权利将被取消, 并且不收费。 没有删除任何内容: 记录再次出现, 附加的时刻将添加到 。
PeopleOS HR 不出现在侧边栏,命令调色板,设置或应用中的帮助中. 直接链接到一个HR页面会提供加载而不是页面.
当达到分级限制时,页面会给出下一级。编辑或删除已经存在的东西永远不会被屏蔽。
在驾照上加注:OpsIQ账户和安装在它的下一次许可证检查时取回它。
下面的一切都是真实的屏幕;这里不需要开发者.
打开 人民OS组织→HR 主页旗板从主开关开始, PeopleOS HR: 没有 HR 页面或员工表面无法到达。 打开开关是两击确认; 关闭一个是一击。 它下面的 AI 开关( 起草帮助、 应用程序筛选、 自动助理、 AI接见、 自动化发件、 身份验证) 将关闭, 直到您决定为止 。
打开 人民OS组织→设置副驾驶 并说出你想要的 平淡的语言: 休假政策及其天数和通知, 国家的公共假日, 案件类别及其SLA、 费用上限、 登机模板、 月脉冲。 您按其理解和假设得到计划。 在确认前, 任何工作都不会进行; 中度风险步骤需要第二个人; 每次运行都会留下收据。
打开 人民OS组织→前线→登录设计自动安装的门户位于 /hr/<address>; 门户地址 立即重命名它,旧的登录链接继续工作,因为旧地址会向前。在云中,门户是 /hr ,您的工作空间主机,不需要地址。
打开 人民OS组织→征聘。您从批准的申购单上发布的每一份公告都出现在公共职业网页上;链接 打开公共职业页面 招聘的顶端 显示了候选人所看到的
打开 人民OS组织→前线→基奥克 选择 注册一个站台。设备令牌显示一次;打开平板电脑或个人电脑上的站台页(它是 /kiosk )并粘贴。人们会用工作电子邮件和PIN,或者用门户上的短寿徽章代码来计时。取消一个亭会立刻停止设备。
打开 设置→人力资源。每个自我服务能力(记录、请求、文件、休假、工资解释等)都设定给每个员工、管理人员或一个团队和下属团队。每一个修改记录是谁以及为什么,而你关闭的电源则向员工解释,而不是默默地缺失。
打开 人民OS组织→人员 创建个人、他们的就业和他们的经理。只有在该人拥有有效的电子邮件和预定的雇用关系时,才能提供门户访问;邀请从同一屏幕上发出,登机从你安排的旅程开始。
创建经批准的申购,发布工作,通过再清网安全网接,结构审查,安排面试,记录决定,发布报价和聘用等方式接收申请.
建设有证据支持的入行,收集正确的文件版本,请求设备,批准核准的访问模板,并提供无座位门户访问.
实行休假、时间表、薪金解释、福利、支出、目标、反馈、审查、学习、技能、内部机会、继任和员工分析。
提供私人人力资源支助、管理的雇员关系案件、法律搁置、数据请求、纠正、解释、上诉和独立的人文审查。
采用有效日期的就业变更,取消准入,回收设备,对外部提供者进行核对,适用保留并保存必要的证据.
语言人拥有就业记录和经核实的外部身份方面。电子邮件是可变的联系数据,绝不是永久身份密钥。Portal读取自定义;管理员和管理员的意见需要明确的许可。API在路由权限上方设置瞄准层,绝不绕过它们。
使用干燥和自备性API。在发送访问权限前确认该人有有效的电子邮件和意向性雇用关系。
将两个已核实的方块连接到cononial 人并明确解决冲突。 不仅仅因为两个可变的电子邮件值匹配而合并记录 。
每个主要的PeopleOS地区如何运作,以及雇员在注册后看到什么.
保持警棍、就业、工人类型、经理、团队、地点、技能、文件和有效组织结构。
将经批准的请购单改为张贴、申请、结构化证据、面谈、决定、提供和雇用住宿和上诉路线。
指定订购的主人特定步骤;收集,审查,签署,过期,持有并删除带有版本和访问证据的文件.
界定政策支持的休假类型、余额、申请、核准、假日、可用性、日历活动和对账。
解释工资、将核准的工人活动交给发薪部门、调节例外情况、管理福利资格和规范偿还。
操作目标,登机,反馈,审查,校准,学习,技能,辅导,内部机会和接班.
向雇员提供私人支持,同时将冤情、纪律、举报人和密封的案件证据保留在专用许可界限内。
使用劳动力计量、人口统计计划、基准和经验衡量标准,绝不推断缺失的结果是成功。
需要你注意,自上次访问以来的变化, 开放请求,即将到来的事件, 登入进展和公告。
就业、核实记录、文件、许可、隐私请求和纠正请求。
私人谈话、要求、需要雇员和公司自己负责的任务的行动分别列出。
证据支持的入职时间与所有者, 状态,完成和被封杀的工作。
余额、请假申请、可用性、时间表和日历后果。
学习、技能证据、目标、反馈、辅导和内部机会。
雇员可以查阅普通语言的补偿和工资调节信息。
仅限于信息同事选择的目录和组织结构图或政策允许他们分享。
解释、上诉、同意、纠正、查阅和删除请求。
在装入活性记录之前设定管辖权,角色,批准路径,保留,同意和特征控制.
安装适当的签名包,输入最优资格证书并进行连接和符合性测试。
使用确定性数据进行全方位工作流程,并比较预期证据后,才能使实际提供者得以执行。
不同的授权审查人审查提供者、安全、隐私、法律、公平和可获取的证据。
PeopleOS将自动化视为一个被管理的工具路径:政策许可,企图执行,提供者结果和证明是分别的事实.
每个代理都使用注册的打字工具,其目的、权限、风险等级和最大自主性。人类接管、断路器、事件和管辖权变更会停止执行。更正可能会形成一个拟议的数据集,但在另一授权人完成隐私审查之前,不会进行任何训练。
定义组群、最低样本规则、衡量标准、评估者身份和合法发布的评价。缺失的数据仍然缺失;它永远不会转换成通行证。
利用密封决定和政策证据提供解释,向独立的人类发出呼吁并保存结果证据。
释放国政策只与一个被命名的负责任的合法所有人、引用的法律来源和通过测试进行组合。
维护系统清点,风险等级,基本权利影响评估,通知,监事,计量和证据.
hr.interview.room.provision 创建一个会议地点。仅此而已。 hr.interview.room.connect 媒体可以证明是员工
记录、转录和生物鉴别活性是不同的选择,退出适用于选定的目的。
视频合同没有关于情感,注意力,吸引力,种族,残疾或外貌推断的领域或方法.
评审员可以永久接管会场,仍可提供文本住宿途径.
连接器报告加密了传输,主动保留政策和提供者的媒体参考,必须支持可核查的删除.
显示会议内容为提供, AI 的参与为虚假。 请保留访问和文本通融路径 。
将回调记录为提示, 然后查询提供者。 只有认证状态响应可以更新检查 。
使用常规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 。目标管理员路径仍然检查自己的权限。写入需要稳定的一等键;高风险写入需要确认。在不确定的超时后,用相同的键重试瞬态失败并查询恢复状态。
Write. Scope: hr.write. Provision seatless employee access and send the invitation. Required: person_uuid.
Write. Scope: hr.write. Lift an employee access suspension (written reason required) and provision again. Required: person_uuid, reason.
Read. Scope: hr.read. List a person's identity facets and open conflicts. Required: person_uuid.
Write. Scope: hr.write. Link an identity facet to a person. Required: person_uuid, facet_type, facet_key.
Read. Scope: hr.read. Read the organisation tree.
Write. Scope: hr.write. Create an HR person. Required: display_name.
Read. Scope: hr.read. Get one HR person. Required: person_uuid.
Read. Scope: hr.read. List HR people.
Write. Scope: hr.write. Update an HR person. Required: person_uuid, display_name, primary_email.
Read. Scope: hr.read. List job postings.
Write. Scope: hr.write. Create a requisition. Required: title, openings, justification.
Read. Scope: hr.read. List requisitions.
Read. Scope: hr.read. Read courses, paths and enrolments.
Read. Scope: hr.read. Read leave types and requests.
Read. Scope: hr.read. Read HR connector accounts, conflicts and deliveries.
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.
Read. Scope: hr.read. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog. Required: account_uuid.
Write. Scope: hr.write. Release booking slots whose claim never became a booked meeting.
Write. Scope: hr.write. Connect the AI to interview media; refuses unless media really reaches the worker. Required: media_uuid.
Write. Scope: hr.write. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription). Required: media_uuid, purpose, state.
Write. Scope: hr.write. Pause a live interview. Required: media_uuid.
Write. Scope: hr.write. Provision an interview room (a place to meet — NOT AI participation). Required: session_uuid, transport, accommodation_route.
Read. Scope: hr.read. Read an interview room, including whether the AI is actually participating. Required: media_uuid.
Write. Scope: hr.write. A human takes the interview; the AI cannot speak in it again. Required: media_uuid, reason.
Write. Scope: hr.write. Close an agent incident — the same act that lifts the suspension it caused. Required: incident_uuid, resolution.
Write. Scope: hr.write. Run one agent step: gate verdict, execution and outcome reported separately. Required: run_uuid, agent_key, tool_key, jurisdiction, purpose.
Read. Scope: hr.read. What actually happened at a step (permitted, executed, proven, failed, compensated). Required: run_uuid, seq.
Write. Scope: hr.write. A human takes an agent run; no further agent steps are accepted. Required: run_uuid.
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.
Read. Scope: hr.read. List the registered typed tools an agent may use, and open agent incidents.
Read. Scope: hr.read. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it.
Read. Scope: hr.read. What this product may do in one country, per feature, with the law behind each answer. Required: code.
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.
Read. Scope: hr.read. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests.
Read. Scope: hr.read. Why an action about one person is allowed, reduced or blocked, with the rule and citation. Required: person_uuid, feature.
Write. Scope: hr.write. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law. Required: release_uuid.
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.
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.
Write. Scope: hr.write. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing.
Read. Scope: hr.read. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception.
Write. Scope: hr.write. Delete a workforce conversation; refused while it is under legal hold. Required: thread_uuid, reason.
Write. Scope: hr.write. Place or lift a legal hold on a workforce conversation. Required: thread_uuid, on, reason.
Write. Scope: hr.write. Set a conversation's retention class (standard|extended|permanent). Required: thread_uuid, retention_class.
Write. Scope: hr.write. Run the conversation retention sweep; legal holds are never swept.
Read. Scope: hr.read. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys.
Read. Scope: hr.read. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage.
Read. Scope: hr.read. Run the HR release readiness report.
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 合同中没有包含员工信息读取方法。
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.
读取 doc/contracts/PEOPLEOS_HR.md 每个操作员在自营的装置中,API,连接器,webhook和发布规则。
市场包中包含 README.md, DEVELOPER.md, connector_contract.json, hr_profile.json 和一份签名的文件清单。
发射要求是根据证据计算的,包装准备、供应商认证、法律批准、公平评价和无障碍证明是故意分开的。
运行 PHP 语法、 HR PHp Unit, 路由/API等价, OpenAPI/邮递检查, 软件包清单和JSONSchema 验证.
试招,AI审查,面试/视频,上岗,签名,休假,工资单,出入口,通知,模式和连接器故障路径.
驱动桌面,平板电脑和电话布局;键盘,焦点,标签,对比,回流,工具提示,对话框,通知卷轴和独立导航.
使用真正的提供者圆通和删除,法律政策发布,代表性的公平数据以及独立的人类WCAG证明.
与提交者不同的审查者批准连接器并释放证据。如果连接器证明过期,则撤销或关闭连接器。
自授权的软件包签名后文件没有改变。 它不能证明第三方账户的工程 。
行为决定和状态过渡一致。它不能证明是真正的提供者、居住期限或删除。
具体的工作场所账户在双重控制下通过了提供方的五项义务。
已命名表面存在自动和评估人牵头的证据,不是第二人称证明。
所有所需大门同时为绿色,没有证据过期、被撤销、丢失或与实际健康相矛盾。
安装可以证明软件包的存在。 启用它, 保存真正的最小值证书, 通过连接测试, 然后使用真实提供者证据和不同的审查者授予匹配的 PeopleOS 账户生产范围 。
回调可能有效, 但只是提示。 请检查webhook 收件箱、 提供者状态终点和校正结果。 PeopleOS 仅在重新平息后更改权威状态 。
调用元动和过滤器,用于hr.和平台.hr;或/api/v1/openapi.php财务报告和已审计财务报表/api/v1/postman.php.它们是从同一个运行时间登记册生成的。
您的帮助中心是一个自服务器的帮助网站, 由您发布的文章构建。 客户可以在自己的公共页面上阅读和搜索它, 在聊天部件内, 这样他们就可以在打开谈话之前自己找到答案。 它中的所有内容都来自您的知识库, 所以同样的内容可以证明您的AI也赋予您公共帮助的权力 。
一个干净、可搜索的帮助网站 /help.php客户按类别浏览、搜索和打开任何文章。您可以给它自己的名字和风格 。
聊天部件中的帮助链接, 这样客户可以搜索您的文章而不离开聊天。 如果他们还需要一个人, 他们就是一个启动谈话的录音机 。
转到 Config, then Help Center 在您的管理员中打开 启用公共帮助中心.
设置 HelpCenter 名称,该名称在页眉和浏览器标签中显示,并选择视觉样式。您可以关闭顶端导航,以获取一个没有菜单的干净页面。
下一部分会说明如何进行
文章在您的知识库中存在。一旦发表并标出公众名,一篇文章就会出现在帮助中心。有几种方法可以做到:
打开文章,标记所发表的文章,并打开选项在帮助中心显示.
使用该 全部发布 按钮将您发布的全部设定按下一击键,而不是一次一次执行。
已经有FAQs了? 使用 发布全部帮助 把它们变成帮助文章 让他们坐在其他东西旁边
从另一个服务台搬来? 导入 KB 按钮。您有三种方法可以指向您的内容 :
给出您当前帮助中心的地址。 如果它能识别平台( 例如 Zendesk) , 它会读取该平台的精确分类树。 否则它会爬入网站并重建页面的结构, 只导入真实文章并跳过登录、 定价和联系页 。
如果一个平台已经连接到这个工作空间,并且拥有知识库,它就会在下方的下方出现 从连接的应用程序导入。选择并导入,否 URL 或密码。应用程序只有在连接和设置后才会被列出。
没有现场站点可以指向吗? 上传电子表格 title, category,以及 body 列。请输入 Parent / Child 中,在“类别”栏中,构建嵌入式类别。
无论你选择哪一种方式,你都会得到一个 预览: 它找到的文章, 按类别分组, 每篇文章都有一个复选框, 这样您就可以放下任何您不想的。 在单击导入前, 任何内容都不会被保存。 之后您可以 撤销 单击后整个导入,或 重同步( S) a/ 数据为: URL 或 连接应用程序导入到后端以拉出新和已修改的文章。
kb_capabilities 块中 settings.json (类型) kb_source,带有 adapter 和a 数据 base_template),参见"连接器"部分和"平台-连接器参考".干净的帮助中心很容易浏览,也更容易搜索。 与大赦国际一起组织 按钮为您进行清理。单击一次,它读取您已发布的文章,将其排序为明智的分类,并添加标签。当需要时,它会创建一个分类,重新使用已经匹配的分类并跳过任何您已经组织的东西,这样您可以每次添加新文章时,都会再次运行。打开 让 AI 组织到子类 在帮助中心设置中,它也可以在嵌入下文件文章 Parent / Child 分类,在输入有分节的知识库后便变得方便。
您可以在聊天部件内显示帮助中心, 这样人们在给您发信息前会先搜索答案。 在聊天部件设置中, 请选择帮助链接的显示位置 :
部件顶端的小型帮助图标 。
信息框下的一个文本链接,例如“浏览帮助中心”。您可以修改措辞。
以头和下为最能见度.
帮助链接在部件外观设置下有自己的颜色控制。 请打开它 无 或选择一个 实心 颜色或一个 渐变整个帮助体验都遵循了您的部件主题,所以它总是看起来像你的品牌的一部分.
出框时,您的帮助中心已经拥有了它自己的干净、可共享的地址(例如 /help/your-help-center你可以再往前一步,在你的下边服务 拥有域,所以顾客和搜索引擎 把它作为你的品牌的一部分,例如 yourdomain.com/help 或 单 help.yourdomain.com。所有东西都在您的域名上工作:链接、图像、搜索和文章收视率。
单位 配置, 然后是帮助中心打开 嵌入 选项卡并查找“在您自己的网页地址上显示您的帮助中心”。Cloudflare, Nginx 或 Apache),复制现成块并粘贴到您的站点。每个选项都有一个 设置指南 按钮旁边有精确的台阶。
偏好 help.yourdomain.com相同的面板有一个子域选项。Cloudflare 一个子域是最可靠的路径, 它给你一个干净的地址 之后什么都没有。
help.yourdomain.com设定指南会带您穿过其中的一条 DNS 记录和路线。除了单条票,帮助中心有自己的 分析。在帮助中心设置中打开它,它悄悄地记录人们如何使用你的帮助:最受欢迎的文章、他们搜索的内容以及空出回来的搜索(一个现成的可写入列表),自行制定访问国和设备,因此不需要安装的聊天部件来报告。每个数字都显示为 两者 设置您的帮助, 公开页面和窗口帮助,以及组合, 这样您就可以看到每个都实际使用多少 。
帮助中心每个部分(主页上的类别、通俗文章、分类页上的文章列表和更多)都有自己的简单规则。对于每个部分,您可以显示或隐藏,并显示 全部 项 目a 设置编号,该 最新消息或只有你一个人 特性 当规则封了一个列表时,客户仍然会得到一个“显示所有”链接,所以没有什么是真正无法到达的。
也决定了助选的模样: 隐藏,友好的比例像"12 联 合 国 14 找到这个帮助,或者简单的拇指算数。一个最小的选票设置会停止一个全新的文章,显示一个尴尬的“0调出0".
每篇文章都显示 有用吗? 提示。每篇是或不是都算在内, 这样您就可以一看哪篇文章回答得很清楚, 哪些文章需要重写。 同一访客的重复投票被忽略, 所以数数是诚实的 。
您可以修改帮助中心的标题和标签, 以匹配您的语音。 保留任何字段的空白, 并返回到一个合理的默认状态, 所以您只编辑您想要修改的措辞 。
不,它来自AI已经使用过的同一份知识库文章,一次发表一篇文章,可以同时为两者服务。
是的,只有你发表和标注公众的文章才会出现在帮助中心,任何未公布的都不要发表。
是的,帮助链接的部件会从开始对话中 被一个窃听器所包围 所以自控不会困住任何人
现场情报是 OpsIQ'是内置的 SEO 和搜索可见套件。 它将您的网站爬入一个搜索引擎, 跟踪您排行, 研究关键词、 监视回链接和竞争者, 扫描您的本地地图存在, 检查页面速度, 并将其全部转换成客户准备的报告, 由 AI 分析器解释要修复哪些内容并起草修正。 这是一个溢价特性; 当启用时它会出现在侧边栏中的 Site Intelligence 。 每个域的数据都会分开、 爬行、 排名和报告, 永远不会在域中混合 。
现场情报是计划的一部分,在计划上,它的工作原理与PeopleOS HR完全相同:账户所有者打开 账户→自动加载( T),选择一个站点智能级并开始免费审判或直接添加。自由计划,或者仍在自己的计划试验中付费的计划,不能添加。直到它被拥有,套房从侧边栏被隐藏,直接链接提供附加;当达到一个站位上限时,页上提供了下一层;当没有购买的试验结束时,取消权利,不收取任何费用。 定价页面.
一个爬行是 OpsIQ 浏览您的页面, 搜索引擎的方式, 寻找技术问题: 断开的链接、 缺少的标题、 内容稀疏、 页面缓慢、 索引问题。
在"概览"上,点击开始爬行. OpsIQ 排队,并在背景中的页面中工作;状态指示器显示进度。
完成后, 打开议题和页面列表。 每个议题都按严重程度分组, 这样您就能先解决最大的赢家 。
AI分析师制作一个简单语言的简况,说明什么是错的,为什么它很重要,并且可以在申请前生成你审查的建议的修补.
扫描您的页面以获取技术SEO发布并列出每一页及其问题。随时重运行或安排。
添加您所关心的关键词; OpsIQ 检查您所在的站点位置,并跟踪移动时间。
发现要瞄准的新关键字创意,由AI关键字导师帮助优先排序.
查看谁链接您, 刷新列表, 并拒绝您想要与您的网站连接的链接 。
添加相竞域, 比较您的能见度与它们的, 并进行AI相竞分析 。
扫描整个地理网格的本地列表能见度,看看地图上显示的地址,加上Google Business Profile工具.
运行页面速度检查,以便您能够修复会伤害排名和转换的慢页.
生成内容简介和草稿, 目标为您所选择的关键词 。
建立可打印的,客户准备好的报告上面所有的东西。
两个Google连接器将估计转换成真实的数字:
提取准确的查询,点击并印象出您的网站的Google报告,映射您的地产,以及直接从Gooogle自己的数据中获取的地表排名机会.
把你的流量和接触数据 与你的SEO数据, 所以报告显示的能见度和行为在一起。
不需要用手操作所有设备。排行榜的刷新程序包括:再运行爬行、排位检查、关键词检查、回路刷新、局部网格扫描和在节拍上报告生成(根据计划和音量而定,每天或每周)。这些系统通过运行到OpsIQcron, 参见 Cron 和自动化部分。生成的导出报告为可打印、可供客户使用的文件: 各机构向每个客户发送一个常规文件SEO更新,并且因为每个域的数据都是独立的,所以每个客户端只能看到自己的.
抓取、排位跟踪、关键词研究和回路工作,但不会触碰您的网站。对于流量和精确的搜索数据,请连接Google搜索控制台和GA4。
是的,将每个域分别添加;它们的爬行、排名和报告完全相互隔离。
每周为大多数网站提供大量服务; 在内容或结构变化后按需爬行。 请设定一个日程, 这样您就不会忘记 。
自动执行是网站智能中实际应用修正爬行和AI分析师推荐的部分,而不是仅仅建议您。代理严格按照网站智能已经发现的(它永远无法发明变化)进行工作,并走过每个固定的安全循环:一个干跑预览,你的每步批准,活写,自动快照,以及一个证明打开问题计数下降的再活化。这是一个只管理AI功能;它在网站智能部分内显示为自动插入(火箭)动作,直到您打开它为止。
代理只应用过Site Intelligence(或AI分析师)已经推荐的对该域的修饰。
网站地图。xml,机器人.txt,并重定向,可读和头规则在.htaccess(Apache / LiteSpeed)或nginx配置中.
折叠多跳的链条向下移动到单跳直接到决赛 URL,在同一管理下的.htaccess块内,所以速度和链接值停止通过额外的跳出.
缺少或弱的页面标题,元描述,犬目标记和结构化-数据(schema)块.
通过WP-CLI应用的 Yast, Rank Math和SEOPress 标题 & meta,以及图像替代文本 SSH 路径或 REST API 在主机路径上。
添加数 JSON-LD (schema) 到缺少的页。SSH 路径一个小的有管理的帮助器(一个必须使用的插件)打印标记,这样它就可以使用或没有SEO插件;在主机路径上,您的SEOC插件可以携带它。
在现有内部添加一个相关的内部链接 WordPress 内容以拯救孤页并连接相关帖子。每页一个链接,从不包含标题、现有链接或短码,并且总是由您先批准。
起草薄页的完整替换内容( 打开一个 craw 选项, 见下文) 。 每一份草案在任何文件发布前都会经过您审核和批准, 并且保留旧的内容以便恢复 。
当爬行发现速度问题并安装了插件时,打开 W3 总缓存页面缓存, 所以页面服务更快 。
产品和收藏 SEO 标题和说明,页面和博客文章 SEU, + 301 重新定向,通过 Shopify 管理员 API.
每页SEO标题和元描述通过 Webflow 数据 API 2. 关于《公约》第1条和第3条的规定
用于域( 其 craw settings) 的 Site Intelligence 配置面板有两个选项, 可以决定代理线条在时间之前为您排出多少。 两者默认关闭, 并且都使用 AI 信用, 所以只有当您想要完成此任务时才会切换 。
每个爬行也会为它找到的东西写出混凝土固定内容(标题,元描述,备选案文,计划,重定向),因此,这些固定可以随时审查和应用爬行完成的瞬间,而不是在以后提出要求时生成。每次爬行都使用AI信用.
代理可以为薄页起草全部替换内容。 任何内容都不会单独发布: 每张草稿都作为修改内容同时出现, 并同时审核, 批准或拒绝, 保留之前的内容使其可逆转, 并且每张通行证只限几页。 使用 AI 信用 。
对于您自己的服务器上的站点, 代理连接到 SSH/SFTP 使用您存储的证书,直接编辑服务器配置和页面文件,并运行WP-CLI WordPress。当您有 shell 访问并想要对文件进行全面控制时,最好。
对于不允许的平台 SSH 特工完全通过官员工作 API 连接器, WordPress (REST + 应用程序密码), Webflow (数据 API(v2)和(c) Shopify (编)API。主机上没有安装任何设备。
代理通过连接器到达每个平台:
Shopify 财务报告和已审计财务报表 WordPress 连接船与 OpsIQ,只需在连接器下启用它们,并添加商店/站点证书.
Webflow,Wix和Squarespace从Connectors → Complateplace安装,然后以同样的方式连接.
开放自动执行(Rocket)来自站点情报科,它列出了已经发现的可以在此域上解决的问题.
每一次修复,代理都显示一个干燥的diff(确切地说它会写什么),然后才触摸现场。
您批准( 或跳过) 每项更改。 没有您明确要求该步骤, 任何更改都不会被应用 。
经批准后,代理商将现场更改 SSH 或主机 API 并首先保存快照,因此任何更改都可以回滚.
执行每个更改时,代理立即重新检查准确的页面,并显示每一步“固定活”的判断,因此您会看到现场页面上的每个固定地块。最后它会重新绘制整个站点,确认空出问题数。
代理只能执行 Site Intelligence 建议的该域。 它不能任意更改您的站点或服务器 。
每个写入都预览为diff,并且只有在您批准该特定步骤后才应用.
每次写前都会保存快照,因此任何更改都可以被还原.
每个被更改的页面在写成的瞬间会重新检查,并获得一个"固定活"的判决,因此一个固定在直播页面上立即确认,而不只是在收尾再爬行中.
内部链接和薄页内容重写影响较大,所以总是向您展示,供您批准,并且从未自动应用,无论您运行何种模式.
Auto-Implement 运行在管理型AI上;当一个工作空间正在使用自己的(BYOK 钥匙。
AI的指代费通常在您使用时使用,每自动安装会话加一平方元每用费,两者都取自同名管理-AI的入息.
否。 每一次更改都预览为干燥的 diff, 并且只有在您批准该精确步骤后才应用。 每次写入前都会保存一个快照, 这样您就可以滚回 。
还没上 WordPress, Shopify 或 为 Webflow. 这些工作通过其官员 APIs 并且没有外壳进入。SSH 仅仅是两个路径之一,当您希望代理直接编辑您自己的服务器上的服务器配置和文件时使用。
应用所批准的修补后,代理重新绘制站点,并显示前后的开出问题计数,这样您就可以确认修补减少的问题.
不,AI内容重写在您打开爬行选项之前关闭,每通通行证限为几页薄,每张草稿在任何出版物发布前都会被显示给您,供边背边审批。之前的内容保存下来,所以重写总是可以回放的.
编号:Auto-Implement 仅管理-AI并被屏蔽在下 BYOK 它通常从AI管理贷款中为每期支付一笔固定的人均使用费。
调查工作室是创建可编辑调查的工作空间,这些调查可以作为丰富的独立页面、网站部件或内嵌式模块提供。当前产品还提供了主机链接、签名预览草稿、私人邀请、QR共享、响应浏览和调查范围分析。网站部件是一个交付选择;它不是调查的定义。
survey 测量工作室仍然需要独立的多部署结构、签名式测量身份网关、目标/可变接线,CRM外联发送流量和输入 surveys.* API.当前的向导提供独立的页面和链接、 Website 部件和内嵌。 批准的目标流量始于调查类型, 之后会添加 CRM 电子邮件、 私密链接和 QR 部署作为头等舱选择 。
选择NPS, CSAT,CES,产品反馈,后购,取消,入职,网站,活动,网信,支持,主/解,试,证,研究,员工,收录或一般反馈.
当前目录有可编辑的起始器, 并按目的分组。 选择模板创建复制的草稿: 更改您的调查不会改变起始器或另一个调查 。
自定义打开每个问题、设计、行为和交付控制。快速审查会在客户-视图最终检查时打开同样的草稿。没有自动发布或发送。
一个有自己品牌的响应性页面 URL。当每个收件人需要控制链接时,使用私人邀请并到期。在此主机体验中,QR共享点。
迁移后遗留通道。 它可以使用页面、 地理、 设备、 访问者、 日期、 采样、 冷却、 参观和配额规则, 在部署架构建设时仍然有遗留的活化- 移动桥支持 。
位于页面、门户、产品或帮助中心的响应性调查,不需要促进工作室。
今天,工作室可以生成邀请HTML和私人链接。端到端发送从CRM经同意、压制、排期、重试和反应关联的联络人/联系人是经核准的CRM外联一体化目标。
调查页面有调查拥有的主题和页面显示的家族,响应控制,欢迎和完成副本,以及签名的预览草稿。设计者预览预览在编辑器下方是全宽的,而不是一窄的侧式铁路。它使用沙盒框中真实主机运行的时间,并支持桌面,平板电脑和电话宽度;预览流量不会写出回复或分析.
一次调查可以有单独的版本页面,部件,嵌入,CRM电子邮件、私人链接和 QR 部署,每个配置都有自己的状态、设计、受众和分析。每次调查都可以暂停、禁用或删除。
建立来自CRM段和可勘测连接器,将其冻结为不可变的版本,各发出一份签名邀请函,并通过贴有标签的外延电子邮件连接器发送每封邀请函的传送证明。
幻灯片、图像选择、文件上传、签名、地址、电话、标题和丰富文本,有分钟/最大长度、电子邮件/URL/ 数字预设、 自定义错误文本和每问题预填 URL 参数。
和/或条件组,分支规则,一个安全公式引擎凌驾于答案之上,以及带着自己结果页的分数带:一个得分的测验会在其判断上着陆.
访问者语言下放只列出有真实翻译,共享平板电脑的站点模式(bigger目标,自动重置,不重定向),预填链接构建器,以及可编辑的安全-护栏和页脚文本等语言.
发布一个挑战者版本,任何部署时都会有流量分割。访问者会被粘住,回复会被印在实际服务版本上,比较表显示每个版本的响应、完成和平均分数。点击一次即可提升胜者。
每周发一封邮件,带上一封7日调查,最繁忙的调查,反馈脉冲和最新AI简报,通过被绑定的外出连接器发送. 配置到自动传送中心.
调查访问列表限制谁可以编辑,发布或删除调查. 出版批准(four-eyes)需要第二个管理员发布确切的草稿; 编辑重新发送批准内容. 草案共享链接让审查者在不登录的情况下看到真实的草稿.
连接器合同 2.2,输入调查* 和反馈* api/v1,犬科调查. *事件,持久地签有"Slack"和"Google Sheets"中继格式的网络呼号,以及单回音 PDF 输出。
调查分析解释调查本身如何深入人们,并表现。反馈解释了客户对所有允许来源的看法以及企业对此应做什么。 两种产品相互连接,但并不分享或覆盖分析的真相。
由调查工作室的个人调查而不是从全球侧导航输入,它测量合格、暴露、触发行为、开始、完成、放弃、提问和分机摩擦、时间安排、部署/运动/转换结果以及运行时间可靠性。
一份许可时间顺序反馈,供填写完毕的调查表答复、遗留部件反馈、聊天和票务CSAT、票务回复反馈、客户AI-答题评分、知识基础的助选票和核准的外部/海关来源使用。
分析客户意义:原始指标趋势、主题/话题、情绪、情感、意图、紧迫性、请求、投诉、赞扬、旅程/产品/服务/团队细分、批评者和闭环结果。
调查答复在调查存储中仍然具有权威性,反馈储存了可重建的源参考和所生成的信号,然后随需要加载允许的证据,一个已完成的调查答复最多就成了一个反馈项目。
NPS, CSAT, CES, 恒星, 拇指和帮助必须始终保留其原始方法、 尺度、 样本、 日期窗口和分母。 绝不能将它们合并为一个无法解释的平均值 。
升级工作室将您的网站转换为转换引擎。 设计弹出、 横幅、 滑入、 上下行条、 全屏接管、 内置块甚至基于国家的重定向, 然后在正确的时间向正确的访问者显示正确的信息 。OpsIQ 部件已经在您的网站上了, 所以没有额外安装。 您会设计并保存运动; 它们只会在您发布后显示, 而工作室会被打开用于您的工作空间 。
一项推广:一弹出,横幅,栏杆,滑入,全屏,内线块或地心定向等,每个都有一个目标:销售,领跑,报名,聊天,调查,公告.
在视觉编辑器中构建外观。 每一份保存都创建出一个新的版本, 这样你就可以总是回滚。 任何东西都不会丢失 。
是谁看见的: 国家、页面、设备、交通源头、返回对新、时间表和(带有连接器)登录客户。
当出现时:即刻,在延迟,滚动,出站提示,闲置时,点击后,N页后,或从聊天/票务活动.
活取印象,点击通路,转换通路等,放出漏斗,国别/页面/设备分拆出,A/B取胜和AI透视.
开放促销工作室并点击新活动,或从模板展出室中选择现成的设计,在设计者中打开草稿.
拖放 : 以块、 标题、 文本、 按钮、 图像、 徽章、 统计、 倒计时、 形式、 优惠券、 视频、 收视率、 旋转轮等形式。 样式颜色、 梯度和 3D 效果与滑动器一起 。 预览桌面 / 平板 / Mobile, 并使用 Free Movement 将任意位置放置 。
类型符号 {first_name}, {country} 或 为 {company} 进入任何文本。在显示时,它们成为访客的真正价值。
选择谁看到它( 国家、 页面、 设备、 观众) , 以及何时开火( 延迟、 滚动、 退出) 。 请留下一条规则空白, 以表示每个人 。
点击检查以快速进行发射前扫描, 然后发布。 它在数秒内开始运行并开始收集分析数据 。
标题、段落、列表、引文、图像、图标、徽章、统计、分隔和空间器,任何信息的组成部分。
有真实动作的按钮:打开链接,开始聊天,创建出票,复制出出票券,或跳到一页.
倒计时计时器,表格(电子邮件/电话/文本),优惠券揭示和视频嵌入.
旋转到胜利的车轮,刮花牌,NPS/明星收视率和多步漏斗.
柱子,进步栏,社会分量,社会证明计数器,是/不是双步,被试;和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 在选定的国家、城市或时区显示(或隐藏) 。 对特定区域的提议或地理方向来说是巨大的 。
使用等值/ 起始/ 包含/ regex 限制某些页面, 并排除页面 。
桌面,平板电脑或移动式,例如移动上的一个瘦小的栏杆,桌面上的一种模式.
新建,回放,已知(您在客户关系管理中)或匿名;CRM片段,生命周期阶段,铅分数或浏览器语言.
由UTM(utm_source,utm-campaign)或参考站点,例如只从特定广告访问.
开始/结束日期,时间窗口,以及一个人能看多少次(每会话,每天在关闭/点击/转换后).
向一定比例的访客显示并运行变体头相接;同一个人总是看到同一种变体.
启用连接器,可按实取账户状态确定目标,例如客户未支付发票,或主动订户。
选择推广的出现方式: 延迟后立即在滚动深度、退出意向、闲置时、点击元素、浏览多页后、形式- 放弃或聊天/ 票务活动。 开发者可以从自己的代码中发射一个 window.OpsIQPromo.fire('event').
就是这样 OpsIQ 特别升级: 连接一个平台, 如 WHMCS (或任何支持观众的连接器)和工作室可以根据访客的活账户状态瞄准访问者.
在连接器下,启用暴露观众事实的连接器(WHMCS 客户在登录到该平台时被安全识别, OpsIQ 从来不信任输入的电子邮件 。
在“目标定位”运动中,需要登录,并加上诸如未付发票的规则。1,订阅为逾期未交,或账户信用 > 0.
使用诸如 {first_name} 或 为 {balance_due}. "你有过期的发票" 提醒本身。
一个产品块直接从中拉出真实项目(名称、价格、销售价格、图像、链接) WHMCS, WooCommerce, Shopify 或您的语言 OpsIQ 计费,按"保持新鲜"计票,卡片发布后每小时从平台上更新出价.
券块可以在您发布时在您的商店中创建真正的折扣码,所以访问者透露的代码总是在退票时起作用.
真正的订单来自您的平台 与运动的小时匹配(通过使用优惠券代码或由主电子邮件) 所以,你看到的收入来自 实际销售,而不是估计。
社会防控滴答器可以使用真实的近期订单("Ada order Starter Plan... 2h 名字和物品, 从来没有电子邮件或金额。
将流量分成不同设计变体; 让工作室自动宣传统计赢家, 或者将流量交给强盗选择者,
保留一分钱,看不见的访客,这样你就可以证明运动本身会引发电梯.
SAME运动中每个观众(流动访客,大推车,回程顾客)的不同内容,每个部分都获得自己的版本.
变体还可以测试何时出现:即时对延迟出局对出局意图,被测量出头对出场.
以他人用另一场运动("锯木战役A但并未皈依")所做的事为目标,构建多步升级序列.
小型药丸访客在活动结束后可以重新开放,因此封闭的弹出永远不会永远消失.
在设计者中,切换热图来描绘真正的访客点击了您设计的每一个街区.
多步骤运动 确切显示人们从哪里下来, 屏幕显示。
并列开展多达4项运动(印象、点击、转换),强调最佳价值。
每周一都会有一份文摘登入您的通知;📖每周的故事按钮会写一个简单语言的总结,并随想做下一步.
与设计副驾驶聊天来编辑画布("使标题紧急,再加倒计时"),从自己的流量数据中获取竞选想法,翻译每个国家的竞选,或自动固定低的设计分数.
一个指挥部读取您的网站,并提议您真正的品牌颜色和字体;保存和每个拾取者都与它们一起领先.
步骤块每屏编辑时都会获得真实性:每个屏幕的分页,添加或重排屏幕,预览随行.
命名重要版本("劳恩奇候选"),恢复其中任何版本,并在队友编辑同名竞选时看到警告.
在一个视图中,请看到桌面,平板电脑和移动相并并列;切换像素标尺以精确地放置.
每次竞选活动也可以是生物和QR代码的独立主机页面,被捕获线索的电子邮件滴入序列,或者一击一击的网络推取草稿.
发布冻结窗口(change-freze periotions),紧急暂停所有开关,批准,审计线索和版本回滚.
否. 晋升由同一人提供 OpsIQ 您已经安装了部件 。 设计、 发布、 完成 。
编号。设置频率上限( 每日每会话 / 或者在某人关闭、 点击或转换后停止) 。 应用了感知默认值 。
出版、挖掘、归档和回滚仅限于工作空间所有人和正式管理员,任何小组成员都可以创建和设计草稿。
促销设计师是一名响应的块编辑,负责建设,审查,改版和出版竞选经验.
使用块来编译体验, 预览每个支持的视图并插入已核准的个性化变量。 在发布前审查评论和AI- 媒体出处。 保存创建版本, 以便检查或恢复先前的设计 。
模板为Promocil Studio运动提供了一个可搜索,分类的起步画廊.
按类别搜索或过滤, 加载额外结果, 预览完整的体验, 然后选择 使用模板. 新运动仍然是一项草案,在出版前可以在Premo Designer中更改。
促销分析将印象和点击连接到转换,受众背景,连接器动作结果和运动学习.
阅读印象、点击率和转换率。 按国家、页面、触发器和设备分列结果; 必要时导出捕获线索。 连接器动作结果显示,促进承诺的后续行动是否实际运行。 AI洞察力和学习摘要应作为验证假设而不是自动证明。
通知在部件通知区域发布一条消息,并带有可选的目标、时间表和行动呼吁。
选择所有访客,登录访客或新访客;可选的以联系段和页面规则缩小观众. 设置活动日期/活动日期并使用活动旗帜. Premium样式预设和颜色变化演示文稿,但不替换清晰内容.
推動運動出站后会向订阅者发送浏览器通知.
配置 Web Push 键首先在 Web Prush 设置下进行。一个活动可以包括标题,身体,图标,英雄形象,徽章,CTA和最多两个动作按钮;持续通知直到访客互动为止.
目标为观众,可选的接触部分和页面规则。 请立即保存草稿、 排程或发送。 请使用订阅和点击度量标准来判断访问范围。 HTTPS 和正确的托管服务人员需要访问嵌入第三方网站; 请查看第三方网站的Web Push 。
Cookie United工作室设计了您的访客所看到的饼干横幅,定义了对于您的业务至关重要的事物,对每个访客所在的地区应用了正确的行为,并且(关键是)实际上强制实施同意,因此分析和营销标记在访客同意之前不会运行. OpsIQ 部件已经在您的网站上。 这是一个溢价设计工作室; 横幅只显示您对工作空间的许可 。
从一个大型的旗子设计库和全彩系统(透明,固态或梯度)中选择来匹配你的品牌.
精细的文字,按钮标签,政策链接,横幅位置,以及选择被记住的时间.
定义自己的饼干分类和访客所看到的措辞。 您决定什么是必需的。 关键总是在; 其他一切都属于他们允许或拒绝。
扫描您的网站并让 OpsIQ AI 自动检测每个饼干和跟踪器,将其分类,并写出一个普通语言的目的。这可以赋予首选项表和自动屏蔽功能。
选择同意行为如何通过法律(以下),并开启了群域共享,Google Conserv2,并重新同意间隔.
请查看访问者实际选择的现场同意数据(按类别),请查看您工作区。
欧盟/英国游客可以选择进入(在接受之前,没有非必要运行); 美国游客可以“不出售或分享”选项选择退出。 OpsIQ 按地点决定每个访客。 建议。
严格 GDPR 对所有访客来说, 在他们接受之前, 没有什么非必要的。
标记运行, 除非访客选择退出 。
浏览器全球隐私控制(GPC)和Do-not-Track(DNT)信号,无论选择何种模式,都会被尊重.
同意不仅仅是一个横幅,它控制着运行的:
<!-- This tag stays dormant until the visitor grants the "marketing" category -->
<script type="text/plain" data-opsiq-consent="marketing"
src="https://example.com/ads-pixel.js"></script>打开群域共享, 因此此工作区组中接受访问者不会再次被询问其他用户。 他们的选择会包含您设定的天数。 关闭时要严格征得每个域的同意。 Cookie Units 与 隐私与合规 页面对齐, 该页面保留了同意分类账( 每笔赠款的证明和撤销) 。
是的,每个类别执行都停止了源头的匹配捕获,它不是化妆品旗.
旗帜没有, 它通过部件来运送。 只有自动屏蔽第三方标签时, 才能在标记上一次性更改标记( 上面显示 ) 。
在隐私和遵守网页上:每笔赠款的可搜索同意分类账,并通过联系、渠道、行动和日期予以撤销。
主动信息在访客的行为符合规则时自动伸出, 在他们问之前。 您将每个内容构建为三部分的规则: 当它开火时会发生什么, 以及多久一次。 每一件事都通过规则来传递 。OpsIQ 部件已经在您的网站上了 。
显示聊天泡沫或页面上标语, 启动导游, 发送网页推取或电子邮件, 指派到一个部门, 或点出网页。 Tokens like {{visitor_name}} 财务报告和已审计财务报表 {{page_title}} 成为真正的价值。
触发它的缩影: 页/URL,页上的时间,滚动深度,铅分数,返回对新,闲置。没有条件,每个访客的规则会起火。至少要增加一个目标。条件与AND结合。
设置一个冷却点, 以便同一人不会受苦, 例如每届或每天一次。 每条规则都有一次启动/关闭状态 。
只有在不添加条件时,才会添加至少一个条件(页,铅分,还原.),以锁定正确的访问者.
他们合作:主动规则可以启动"导行"(Guided Tour),而Chatbot Flow(英语:Chatboot Fllow)则可以通过主动规则来触发。从一个聊天-信息规则开始,然后将其他规则分层。
聊天室流程脚本在您的聊天部件( greetings, keys answers, guided paths) 内进行分支对话, 没有代码。 流程是一组连接的步子( 节点): 您询问一个问题, 访客选择一个选项, 流程会把它们从匹配的分支中发送。 只有活动流程运行在您的站点上 。
当路径可以预测,并且每次您都想要它相同:预订步骤,返回向导,“哪个计划”选择者,在交接前收集电子邮件。流程从不即兴。
当问题没有限制时, “ 这样做与我的设置有关吗? ” 。 客户聊天AI 回答来自您训练有素的知识。 流水可以随时间推移而向AI( 或人类) 。
当访客首次打开聊天时, 运行为打开消息 。
当访客键入您列出的单词时运行( 如退款、 定价、 取消) 。
一旦联系方式共享, 或对话中设定的时间开始 。
运行为聊天结束(例如评分),或由主动消息规则启动.
单击新流程, 命名它, 选择触发类型( 如果关键字) , 保存。 它会关闭 。
单击“编辑 Canvas”。您添加步骤(信息、带有按钮的问题、分枝)并连接这些步骤的视觉构建器。
对于每个选择,请在下一步画出分行。通过解析、移交AI或转移给人类来结束路径。
单击 Election。 流量会立即在您的部件中运行。 随时禁用, 而不丢失设计 。
两者并排运行。使用流动来获取可预测的路径,而AI来获取开放式的问题;流动总是可以让两者都放弃。
导游是一步步走过,在您的页面部分部分有语音泡沫和聚光灯,引导访客通过登机或新功能,它们完全被设定为主题,并建在一个视觉设计器中,同时进行现场预览。巡演只有在标出主动时才进行。
每个步骤都瞄准一个元素, 并用您的文本显示一个泡。 添加多少个停留, 以命令它们 。
从预设或设计出自己的泡(颜色,梯度,聚光灯)开始,右边有活预览.
将主动规则可选地连接起来,这样,旅游在规定时自动启动(例如返回游客的第一次仪表板访问)。
巡演仅在活动被勾选时才有资格运行。 取消删除它。 NAME OF TRANSLATORS
点击新导游, 命名它, 并选择链接一个主动规则, 使其自动启动 。
添加每站: 选择它指向的元素并写入泡泡文本。 重新排序直到路径流出 。
自己选择预设或样式来显示泡沫。 现场预览会显示访客所看到的。 Name
选中活动并保存。 巡演现在可以运行, 以自己的触发器运行, 或者由主动消息规则启动 。
由他们自己触发,或通过主动消息规则的"被引导的巡演"动作,所以你决定哪个访客看到哪个巡演和何时.
转换目标将您所关心的活动( 输入的网络hook事件、 聊天信息、 票务解析) 转变为记录的转换, 并完全归属。 当活动点燃时, OpsIQ 记录与联系人的转换,并将其与导致接触的竞选活动、部分和来源联系起来。
单击新转换目标。选择算作转换的活动类型,或使用快速启动预设,Stripe购买、Demo预订、《通讯》注册或订阅开始。
给转换一个名称(购买,演示_已订入,注册),并可选择固定值和归属窗口.
救活并启动 从那时起 只要活动点燃 OpsIQ 记录了与联系人之间的转换,并将归属归于上述触摸。
任何被记录的活动:入住的webhook事件(pay. succeed),聊天邮件抓取,票务解析,联系时间线上的任何内容.
自定义 Dashboard 允许您构建自己对重要度量的视图, 而不是只依赖标准概览。 添加您想要的部件, 拖放并调整大小到您喜欢的布局中, 保存它, 并与您的团队共享 。
单击 添加部件并选择要跟踪的参数或图表。重复棋盘上想要的每件事。
拖动部件以重新定位并拖动边缘来调整大小。 KPI 横跨顶部, 下方的图表。 随你怎么说。
保存仪表板,并分享它与你的团队 所以每个人都看相同的数字。
外联 OpsIQ 是因为...1:1和批量的电子邮件引擎: 编写个性化消息或运行一个竞选活动到一个 CRM 部分, 包含回复检测、 发送时间控制、 打开/ 点击跟踪、 跟踪像素和一次点击未订阅。 它符合同意和 CAN- SPAM / CASL 。
写个个性化1:1电子邮件为{tokens}从联系人和CRM.
发送到预定或现在的CRM段,带有封顶和发件时间控制.
重复的外联可使用消息模板 。
答复侦测记录了答复情况,并对答复者进行了自动拦截。
选择一个CRM部件(或上传列表),自动适用禁止和同意。
以个性化符号写入信件; 预览对应于真实的接触.
现在或最好的时候发送。 打开一个跟踪像素记录; 点击和回复被归为正题 。
已排定报表的电子邮件中,有一套选定的计量标准,用于在(每日、每周或每月)时间表中选择的收件人,作为可打印的白色标签 PDF。设置一次,报告会自动在收件箱中通过 OpsIQ 克龙。
选择公制(流量,SEO,销售量,支持.)和日期范围.
每天、每周或每月,您选择时间向一个或多个电子邮件接收者发送电子邮件。
保存和启用。 报告会按期生成和发送邮件, 没有手动步骤 。
隐私与合规页面是向一个负责处理个人数据的审计员展示以下内容的单一地点:同意分类账、管理员访问日志、数据保存和保存政策,以及即时打印 DPA,在一个有标签的视图中。只有完整的管理员才能打开它。
一份可搜索的每一份同意书的记录,并通过联系方式撤销频道(电子邮件、推取、短信、闪存)、动作、来源和日期。您的证据是已同意联系人(或已退出)。
你团队中谁查看、编辑、输出、删除或传递了联系人的数据,以及管理员、联系人、行动、说明的理由和 IP 监管者要求的就是这个
宣布此工作空间的数据生活地点, 设定活动行保存天数( Q) :0 =永远),并记录您的数据控制器和DPO.
可打印的数据处理增编,该增编将填写您的控制器、地址、DPO、居住和保留。PDF.
连接器链接 OpsIQ 向外部平台开放:电子商务商店、计费系统、支付处理器、电子邮件提供者和定制 APIs。一旦连接起来,AI可以查询订单、客户数据、订阅等信息,并在你同意的情况下采取行动。
这些是安装时在场的,只需要他们的证明。
网络托管计费:客户端,服务,票房,发票,域名,服务器.
电子商务:订单,客户,产品,存货,支付,网络呼号.
WordPress 电子商务:订单,客户,产品,券,通货.
内容和用户aWordPress网站。
付款和销售点:订单、客户、目录。
后遗症电子商务:订单,客户,产品.
通过签名的Botble CMS酒店网站OpsIQ桥。没有API.
服务台:入场券,用户,组织,评论.
当地业务:评论、帖子、QQA、见解。OAuth.
日历和活动。OAuth.
邮箱:出入境邮件,地址簿同步.
电子邮件发送:发送电子邮件并管理模板.
电子邮件发送:通过邮件枪发送邮件.
发送进出通话的频道。
Facebook Messer, Instagram DM and WhatsApp. 互联网档案馆的存檔,存档日期2013-12-21.
分析和搜索数据SEO套间。
公司浓缩和大宗客户进口。
这些是已发布的软件包,而不是安装的一部分。 安装一个来自 Connectors, Complateplace , 并被复制到活的连接器文件夹中, 然后它的行为与上面的完全相同 。
付款:收费、客户、发票、订阅、付款、纠纷。
电子商务:订单,客户,产品,类别,品牌.
电子商务:订单,客户,产品,类别,存货.
电子商务:订单,客户,产品,手推车规则,载体.
电子商务:订单,客户,产品,类别.
交易邮件发送。
问题和项目跟踪。
会议、日历和邮件。
5. 签字、探矿、搜索和分析数据。
网站平台.
导航到管理员侧边栏中的连接器 。
浏览列表或搜索。连接器按类别分组。
单击连接器并切换“启用”。
填入所需的字段 : API 键, URL,指使等。每个连接器在设置面板中都有文件记录的具体要求。
点击“ 测试连接” 。 一个绿色结果表示连接器可以到达外部平台。 一个红色结果显示错误 。
选择要启用的特性: 知识同步、 网络同步、 有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.
一些连接器与外部平台注册了webhooks,用于实时事件通知(新订单,更新票等).
电子商务连接器将收入数据输入销售仪表板,以供归属和分析。
是的,你可以拥有Shopify命令和命令Stripe用于在同一工作空间中支付。AI合并了来自所有已启用连接器的数据。
使用连接器构建器为 REST 的任何平台创建自定义连接器 API。或者检查市场,以获取社区建设的连接器。
是的 连接器在云和自办的版本中都一样工作。
每个商业连接器都使用相同的平台中性事件合同. 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 确定受影响的产品或服务实例。
发生在源平台报告的支付或经济活动时间。从不以导入时间取代历史支付日期。
发送源数和有效三字母 ISO 货币。如果连接器设置允许 OpsIQ FX转换,报告转换为工作空间报告货币;否则报告保留了存储或计费平台货币. Connectionr代码不得硬码为报告货币或汇率.
使用新的,续约,升级,退款,信用或未知. 根据发票理由,订阅或服务关系,行项类型,或另一个权威源字段进行分类. 同一客户的重复购买并非自动续约.
销售和转换中只有正向支付的新账、续签、升级或合法未知的商业收据。退款通过退款和净收益分析报告。账户信用、钱包上注、象征性上注和添加基金仍然是计费引导的活动,从未算作销售、转换、订单数量或销售收入。
CRM交易是管道和交易活动,不是商业平台的销售,除非连接的开单或储存平台通过本合同发出已支付的订单或发票。
不需要依赖一个事件名称. 当平台发送数个支付确认(发票支付,订单支付,交易添加,支付完成)时,一旦平台确认销售支付,其中任何一位都可以打开分类账行;销售指纹会将兄弟姐妹倒地一行.
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 揭示权威的生命周期证据。所生成的“销售信息”通过内置和市场连接器使用的同一“商务事件登记规范化器”逐行传递。
lifecycle_type 不是分析标签。OpsIQ来决定销售是否进入CRM管道,所以每个销售连接器 正在做一个管道决定 它是否打算。
开通封闭式交易(新业务).
记录为经常性收入。没有新的商业交易——续约在不同的概率曲线上转换,并混合它们会破坏两个预测。
绝不以任何方式开出交易,退还给客户的钱不是赢家.
仅收入,销售记录在案,但从未到达管道。
不匹配于( E) event_id 并插入自己。 event_id is platform:eventName:externalId,它回答“我们已经处理过这一交货”,不能回答“我们是否已经记录了这一销售”。 invoice.paid 并且再次作为 payment.completed ——薄荷2个ids并两次登陆同一笔钱,没有相撞和警告.
调用共享的写法。 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 与销售本身的生命周期同时并存的,让呼叫者将退款写作退款发生时的自有行。 两者永远无法碰撞,因为销售指纹将退货与出售分开。
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 然后用没有每个连接码的连接器导入历史修复:默认的干运行,在写入前备份并验证行数,通过一个倒数分类账可逆转,它从未将失败读取为答案。
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 行为仍由该连接器设置控制。
{
"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识别此需要"取消订阅(cancel_servation)"动作.
是否允许此动作? 它是否启用了? 当前用户是否有正确的角色 ?
动作需要订阅身份,AI从客户背景中查找或询问客户.
对于破坏性或高影响的行动,大赦国际要求在执行前予以确认。
动作唤起外部平台 API.
AI向客户报告结果.
查找数据而不改变任何内容。 例如: 列表_ 顺序, 获取_ 客户。 安全, 不需要确认 。
创建或修改数据。示例:创建_ticket,更新_顺序。可能需要确认。
删除数据。 例如: 取消_ 订阅。 总是需要确认 。
以行动宣布。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。基本连接器不需要编码。
每个生成 API 连接器可以显示独立的原生 API 阅读和土著 API 写入动作 。 默认动作仍然优先; 本地动作覆盖后加的提供者端点 。JSON,形式, XML 生的多部分活体,有捆绑的花纹,API- 版本头和一能,同时将资质保存在工作空间连接器设置内。
向导有六步, 显示为横跨顶端的标签。 您可以在它们之间自由跳动, 保存草稿 脚印上随时保留你的工作
名称、 swit、 描述和图标, 然后选择合同配置文件: 标准API、商务、服务台、邮箱、站点情报、SaaS桥、当地PHP平台,或 平台没有 API 当平台没有可调用服务,并且 OpsIQ 需要安装桥。配置文件选择了一个完整的能力起点; 您仍然可以调整个人的能力。
选择平台使用的认证模式并填入其字段。 在此输入真实的测试证书: 它们被用于下一步的连接测试, 并且不会在您发布后存储 。
输入 API 基础 URL 和验证端点,然后使用从步骤开始的证书进行实时连接测试2。在定义任何动作之前这样做,如果认证或基础 URL 错误的,你之后写的每一个动作都会因为同样的原因失败,并且会调试错误的东西.
定义每个操作: 名称、 HTTP 方法、 终点路径、 参数、 响应字段映射, 以及下面描述的可靠性设置。 您可以针对活性运行每个动作 。API 从这一步。
映射您平台发送到的 Webhook 事件 OpsIQ 事件,所以发生在您的平台上的事情可以开始工作 OpsIQ.
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>/.
发电机的五种行为让人惊讶。没有一个是虫子;如果偶然遇到它们,所有它们都会花费你一个下午的时间。
分步回答,你先说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" 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 输入生成的连接器和配置文件。json'' 测试块。 几乎没有真正的平台服务该路由, 因此测试连接失败了 HTTP404在每次安装和读取时, 都像一个客户配置错误而不是包缺陷。 设置一个验证路径, 您的平台实际上会回答这个问题。 对于桥连接器, 请用自己的诊断端点来显示它 。 它在一个呼叫中证明了整个链: 桥被部署, 密钥匹配, 桥可以到达数据库 。
现在的能力遵循数据访问的答案,所以这些不再漂移。其他生成的都仍然如此:编辑ContextProvider. php或其他任何已出出的文件,然后在下一次发布时替换它。保护的例外是桥文件——向导只覆盖一个带有自己标记的桥,所以手写一个则留下了。
取消选中一个功能, 然后下一次发布会删除其提供者文件。 手动编辑到任何生成的文件 — Context Provider.php 最重要的是 — 在不发出警告的情况下被覆盖。 复制自定义, 或者通过删除来获取软件包的所有权 。opsiq- 建筑师。json(之后巫师将不再管理它).
向导对它没有控制。 打算作为生产载运的软件包必须在设置中手动改变释放_ 状态 。json——编辑时会断开签名,所以之后会重新签名.
构建器包与此安装的对称密钥一起签名。 这检测到篡改。 它不能证明谁写了包, 而任何持有相同密钥的安装都可以产生相同的签名。 将本地签名的包当作自签名 。
发布拒绝一个已存在的 slot 。/connectors/.它没有看/marketplace_connectors/,因此手写出同一种弹片的一党套件,最终可以被阴影所笼罩.
每个动作都有以下设置: 只需要前四个; 其他控制器可以由谁运行, 以及操作时的谨慎度 。
关键是AI所说的;标签是人类读取的. 关键词与你的连接器弹簧自动相隔,因此两个连接器都可以有一个"list_orders"而不会相撞.
得到,邮, 点, 帕奇或德利特。
附加到基地内 URL。使用时 {name} 用于占位符,例如 /opportunities/{id}/stage
您还选择每个参数的去向 : 体型, 路径, 查询 或 单 头。路径参数填充 a {placeholder}; 查询参数附于 URL.
请说 JSON 响应中的哪个字段意味着什么, 谁是客户名, 是电子邮件, 是命令的总数。 这就是让 AI 读取您平台的数据而不是猜测它的原因 。
您的团队( admin AI) , 签入客户( 客户聊天) 、 两者兼有, 或写入助理。 客户动作只为签入的客户运行, 而身份域自动锁定在他们身上, 这样一客户无法询问另一个客户 。
行动开始前,人类必须批准
将动作标为删除或更改状态。 用于运行前警告 。
管理员必须持有此权限, 才能让 AI 代表他们运行动作; 完整的管理员总是通过。 从管理_ 整合、 管理_ 一般、 管理的_ 帐单、 的管理_ 销售_ 桥牌、 控制_ 知识、 处理_ 出现、 管理和_ 管理- 危险区、 答复_ 聊天、 升级_ 到_ ticet、 发送_ agent_ 电子邮件, 或者没有, 意思是任何认证的管理员 。
可选但值得写作。 它告诉AI何时可以达到此动作, 例如“ 当管理员要求更改交易阶段时使用此动作 ” 。 一个好提示是AI正确使用的行动和它忽略的行动之间的区别 。
可选的班级标签,或者票(一张票读取或查取)或者票_创建(开一张票)。OpsIQ 例如,当一个操作员关掉AI的票意识时, 隐藏票就立刻打开整个班级的门。
可选。 对于返回列表的终点, 数组的点化路径, 例如数据或数据 。
可选。 存在意味着呼叫失败的天体字段, 例如错误. message, 对 APIs 返回的 HTTP 200 失败。
每一个行动都可以对着现场进行 API 从这个步骤,所以你可以在别人使用之前修补错误的路径或字段名称.
触发器的台阶给你一个网球 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向受援方提供网页。这不会重复“促进”运行时间。
何时 OpsIQ 块a IP,拨打您的平台自己的块 API 所以这个街区也在那里被强制实施。
接收被屏蔽的...IP 威胁信号来自 OpsIQ.
每一个连接者都造船 一个简短的参考,描述你的平台是什么,它的行动是做什么的。OpsIQ 当连接器启用时, 管理员 AI 读取它, 因此它理解您的平台, 而不是只看到一个动作名称列表。 这是为您生成的 。
您的连接器总是得到一个通用的呼叫, 以便AI能够到达一个您没有定义输入动作的终点。 在您可以时使用输入动作; 这是逃生舱口 。
合同版本 : 2.4 · 57 capabilities · 8 profiles.
Actions, triggers, OAuth/API-key authentication and optional context/identity mappings. Capabilities: actions, triggers, native_api, ai_brain_aware.
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.
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.
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.
SEO, analytics, search-console, local-search or monitoring provider with scheduled sync. Capabilities: actions, triggers, site_intelligence, seo, scheduled_workers, durable_queue.
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.
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.
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.
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 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 and revenue ingestion. Capability version: 1.2. Mode: generated. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface. Package files: SalesIngest.php.
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.
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.
External ticket/email to OpsIQ ticket ingestion. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.
Reply mirroring to the external platform. Capability version: 1.0. Mode: generated. Runtime methods: pushReply. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.
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.
Staff/customer synchronisation. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface. Package files: SyncImport.php.
Department/team synchronisation. Capability version: 1.0. Mode: generated. Package files: SyncImport.php.
Order roster and order-event synchronisation. Capability version: 1.0. Mode: declarative. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface.
Product, catalog and inventory synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.
Project, issue and workspace synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.
CRM customer roster import. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers, backfillChunk. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface.
Receive and emit security events. Capability version: 1.1. Mode: generated. Runtime methods: securityCapabilities, syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.
Native remote IP/CIDR blocking. Capability version: 1.0. Mode: generated. Runtime methods: syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.
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.
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.
Promotion targeting facts. Capability version: 1.0. Mode: generated. Runtime methods: subscribers. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.
Promotion product/content feed. Capability version: 1.0. Mode: generated. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.
Mailbox bus, outbound mail and address-book sync. Capability version: 1.0. Mode: generated. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.
Receive inbound email. Capability version: 1.0. Mode: declarative. Runtime methods: poll, handleWebhook. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.
Send outbound email. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.
Mailbox connector. Capability version: 1.0. Mode: declarative. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.
AI triage and Inbox Copilot for remote tickets. Capability version: 1.0. Mode: generated. Runtime methods: loadTriageContext. Package files: AiOperations.php.
AI-assisted reply drafting. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.
Connector expertise supplied to Admin AI. Capability version: 1.0. Mode: generated. Package files: ai_expertise_admin.md, ai_api_reference.md.
Native API passthrough. Capability version: 1.0. Mode: generated. Runtime methods: registerActions.
Signed platform bridge (for platforms with no API). Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: bridge/.
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.
Remote sender block-registry synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: blockSender, unblockSender, isSenderBlocked. Interfaces: OpsIQ\Platform\BlockRegistryInterface.
Inbound comment ingestion. Capability version: 1.0. Mode: declarative. Runtime methods: handleWebhook.
Outbound private note. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.
Outbound notification delivery. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.
OAuth 2.0 authorisation. Capability version: 1.0. Mode: generated.
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 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.
Communications/video-meeting provider. Capability version: 1.0. Mode: declarative. Runtime methods: commsCapabilities.
Connector-provided admin/account/public browser assets. Capability version: 1.0. Mode: generated. Runtime methods: adminAssets. Interfaces: OpsIQ\Connectors\AdminAssetConnectorInterface.
Platform-native hooks and lifecycle callbacks. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.
Durable outbox/inbox queue and retry policy. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.
Bidirectional ticket mirror with conflict handling. Capability version: 2.0. Mode: extension. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface. Package files: EnterpriseExtension.php.
Attachment upload/download transfer. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.
Connector-owned schema migrations. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.
Connector-owned scheduled/background workers. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.
Two-way sync conflict strategy. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.
重复试一次失败的呼号多少次,每次尝试的后退都加倍。只有超时, 429s 5xx错误被重审; 4xx是您的要求的错, 重复它只会烧掉你的利率限制。
每分钟有一个上限,所以一个忙碌的触发器不能击打您的平台。0以无所限.
等了多久才能放弃
行动开始前需要人批准 用它来破坏一切
步骤2提供七种模式。选择匹配您的平台的 API 文档,生成器会为它发出正确的 HTTP 客户端。
静态密钥作为固定头发送, 例如 X -API- Key. 您给出了页眉名称, 并且应该显示管理员表单的标签。 这只作为页眉发送密钥; 如果您 API 将密钥作为查询参数,然后使用自定义头或全码连接器。
Token sent as Authorization: Bearer <token>. Common for modern APIs.
用户名和密码, 已编码为授权页眉的基数64。 您选择管理表格上显示的这两个字段的标签 。
公钥加密钥, 请求机构签名。 您会给签名头、 密钥头和您平台所期望的时间戳头 。
服务器到服务器, 没有用户交互和方向调整。 您给出了符号 URL 和可选范围; 管理员提供客户端的ID和秘密。 当您的平台向一个应用程序而不是向个人颁发证书时使用此功能 。
与 PKCE 的授权码流,用于Stripe, Shopify, Slack和快书式的应用程序。您授权URL,标志URL。发布后,管理员点击连接器上的连接,在您的平台上授权,以及OpsIQ存储刷新令牌和薄荷访问令牌。URI注册到您OAuthapp在连接器的设置页面上显示.
免费形式 JSON 上面所有图案的页眉映射没有覆盖, 例如 {' X-API- 钥匙":"{api_key}"","X-特南特":"......{tenant_id}} 每一个占位符都变成管理表上的字段 。
用途抵消和限制参数。100 限制( L) :50.
使用页码。 例如:?page=3per_page= (P) (中文(简体) ).50.
使用来自上一个响应的光标符号 。
使用有 rel="next"的链接响应头.
连接器.php Returnens 是一个实例。 它不声明一个命名的类OpsIQ猎取。下面的方法名称是 Connector Interface 所需要的; 错误的操作是致命的,而不是警告。
<?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);
}
};当你的平台拥有一张票, 镜像到 OpsIQ 从连接器中, 使用您连接器继承的连接器( 为新票创建, 附加备份以备后续) 。 发送并订阅连接器中的通用门票事件 。 subscribers() 方法, ticket.created, ticket.replied, ticket.updated, ticket.deleted自动重写、升级、SLA和CSAT都勾上同样的事件,所以你没有额外的代码来继承它们。
如果你处理 ticket.deleted,您还处理合并。 合并票的删除载数 merged_into 而不被送到一个连接者那里,而该连接者将宣布 ticket_merge;合并后,将一度作为 ticket.merged 而不是关闭合并的车票。 车票合并能力( 2.4).
票总是这样 备忘 ,但开通信息可能由下列人写出: 工作人员:代理开票人代表客户,或主动联系。每个服务台都支持这一点,因此属于通用 ticket.created 而不是每个连接器私下解决的
客户端(默认)或管理者。关闭它和客户被假定。
作者_type=admin时的员工代号,从未出现过客户代号.
特工或部门显示名,回"员工"
代理地址 永远不要给客户地址 客户电子邮件下的工作人员信息是报告和审计错误
这不是化妆品。 消费者读取 author_type 工作人员撰写的开幕词报告为: client 自动复制机可以回答你自己的经纪人写的信息 让你的平台的回声看起来像新的客户信息 然后它作为复制品降落 然后翻转票到 已回答( E)。将您的平台信号映射到连接器的上方 事件常态永远不要在消费者。
当代理者封锁发送者时, 则适用于整个 每隔一段时间 频道( 电子邮件、 聊天、 传送口、 部件和每个连接器双向) 因为块是集中执行的, 在任何连接器看到消息之前。 您的连接器通过不做任何工作来继承它。 没有输入的工作可以执行, 也没有任何方法弄错 。
选择的半边是 出入境: 告诉你的平台被封住。 只有您的平台能够表达等同的东西时, 才会执行 。
包含块_ registry 和 类必须执行 Block Registrict Interface。 旗帜是要求的; 接口是保证的。 注册需要两者。
接收类型( 电子邮件- domain- )ip, 值, 理由, admin_id, 过期 _at, site_ key. 返回 [结果, 细节?, 远程 ref?]。
相同的有效载荷,必须具有"一能"性,解锁从未被阻断的东西是无用的,不是错误.
为了核对,漂移是由客户报告而不是发现的。返回[结果被封 。
应用在您的平台上。 如果您有值得录制的ID, 请包含远程信息 。
已经进入了请求状态
您的平台没有等同的概念, 不是错误 。
你本可以这么做的,但结果却错了。请详细介绍,它会进入审计线索。
衰落是正确答案。 许多平台没有“封堵这个发送者”的概念,只提供AccooUNT中止,它停止了计费、登录和服务,而不只是支持邮件。将“代理屏蔽了垃圾邮件地址”映射到“关闭客户账户”上,会让一个错误点击的块终止付费客户的服务。如果这是您唯一的杠杆,请返回 unsupported 且别取.
下降还涉及平台的情况 能够 做吧,但不会让你的,检查一下 API,不是特性: 仅存在于平台的管理员UI中的杠杆是连接器没有的杠杆.
读取 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 块存在。
Zendesk 不能预先悬停它从未见过的地址,没有事情可做不是失败,当地块仍然会停止出票.
暂停工作人员将一个同事锁在服务台之外,到达一个综合清单的工作人员地址比指示更有可能是一个错误,在您采取行动之前检查一下角色。
合同不能阻止你绘制一个街区图,让破坏的东西,所以每个连接器必须自行决定它会拒绝什么。 detail 操作员可以读取,可以跳出服从。
老实报告 注意这些行有多少 ok。这是正确的结果,而不是空白:一个域块仍然起作用(它被写入时在核心中执行);它完全不能被反射出。返回 ok 你没有做的事情 会告诉一个操作员 块到达你的平台 当它从未离开 OpsIQ.
命令之前,它已经写好了,无论你返回什么地方,都站着。你不能阻止操作员阻止别人。
丢弃被视作不支持和记录。 返回失败, 但细节却有误, 因此原因仍然存在 。
同一区块可不止一次宣布。
Fan-out 与操作员点击同步. QQ 慢工作而不是将请求打开.
永远不要重新封锁到 OpsIQ 从您的处理器。 注册会跳过原连接器, 但第二跳会循环 。
每封公告都会写给 opsiq_block_registry_log (操作,类型,值,理由,管理员,出处,接通器弹出,结果,细节和时间戳)这样一个操作员就可以看到一个块从你的平台而并非从代理中被到达,以及每个连接器对此所做的.
手拿开 attachments 要创建的阵列( )/addReply(). 每个项目都带有三个形状之一的文件:
RAW文件字节的 Base64,用于认证后的文件(多为输入的大小写). OpsIQ 为您解码并重置文件。 最便携的形状 。
公众 https URL (例如 Zendesk 内容_url) 。 必须为 https; 在存储前通过 SSRF / 允许列表检查 。
您已经写过的文件引用( 本地作曲上传者生成的) 。
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).
如果你的平台是一个 单独的应用程序或数据库 (一个托管的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.
如果客户在开票时选择了特定产品,请在提示上盖上印出提示,使代理商看到有重点的服务卡(其余的则使用一击"查看其他产品"模式). 傳出其中任何一個以建立(:
Preferred: the service id exactly as it appears in your IdentityProvider::lookupCustomerServices() list (each service's id). Unambiguous match.
平台服务码,例如: WHMCS S396(服务)396)/ D11(域名)11). OpsIQ 解析可选的字型字母+ id,并与您的服务列表相匹配,并设置一个类型守护,所以域名代码永远不匹配同一码的产品。在每项服务上显示匹配的对应比对以进行精确匹配。
一个域名; 匹配为子字符串, 以对抗每个服务的细节/域.
不需要用手填写六步。用您自己的单词描述连接符 。OpsIQAI起草整个规格,通过向导使用的同一验证器运行,并在将任何内容写入磁盘之前向您显示计划。有两个位置可以完成,它们会生成相同的软件包。
打开 连接器→+ 添加连接符→构建连接器步骤中1你会看到 ✨帮我盖好键入连接器用于什么——平台,什么OpsIQ应读和它应该写什么,以及谁使用它——加上API根, 如果您知道, 按下它。 向导会从草稿中填入每个步骤, 然后按您输入的顺序审查和编辑 。6面板显示为 ✨完善AI,因此可以要求更改("也读取发票"),而无需编辑字段.
打开 询问 OpsIQ 管理器中的任何地方的副驾驶都说出自己想要的东西。你不需要命名动作,也不需要知道向导的存在。
例如:"为特莱洛建造一个连接器,它应该列出我的板和列表,读取卡片,并在一板上创建出一张卡片. 特莱罗使用一个API副驾驶在句子中回答并显示 起草此连接符 。您的信息是简短的,所以将平台、读取和写作放入其中。
还没有写出来。副驾驶起草规格,验证它,并用计划来回答:连接器做什么,它将暴露的行动(写出标记),所作的假设,以及你仍然必须回答的问题——通常需要提供哪些证书。草稿停在身份证下,可供使用。24小时。
副驾驶显示 构建 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.
新连接器已发布但未启用, 它没有秘密。 打开其设置, 输入API键或符号,按 测试,则 启用直到你发现,它什么也没有。
已起草的规格通过完全相同的验证() 向导的出版按钮。 如果它没有通过, AI 会被赋予错误并再次尝试, 最多三次, 然后在验证器的自己单词中拒绝。 草稿永远不会变成包 。
草稿名称为认证模式和设置字段; 它从未发明密钥、 令牌或秘密。 您会在连接器的设置页面上填写这些字段 。
它所不知道的——你的账户ID,你计划暴露的两个终点中的哪个区域——作为对该计划的疑问而不是沉默的假设而回来.
AI被告诉永远不要发明路径,但是没有模式是完美的. 错误的路径发布为在"动作"步骤或首次运行时失败的动作——它从来不是默默的成功.
它生成的是普通的构建器包:相同的生成文件,相同的合同,相同的签名,在向导中可以编辑,从连接器页面中可以删除. 没有单独的"AI连接器"类型.
质量遵循您在设置下配置的模型→AI. 一个廉价的小型模型起草一个正确但平坦的连接器,并询问更多的问题;一个更强大的模型第一次获得更多的端点。在AI配置下修改它;其他的都不用改变。
manage_connectors ——副驾驶说,而不是提供一张点击后会失败的牌.一个可以出售的连接器——商店平台,预订系统,付款网关——宣布其OMN业务中的哪一个答案OpsIQ语法商业角色。 声明它和连接符出现在设置下→客户聊天→通过聊天自动销售; 停止声明并消失。 没有列表可注册 。
commerce_roles.json宣言在自己的档案中保存在包根上—— 档案的存在就是索赔它不能生活于一个 connector_contract.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顾客看到现场倒计时 它们的自身 过期代码会明确地说出这一点,并提供一个新的代码而不是报告无效代码 — — 客户输入正确但旧代码没有犯错误,告诉他们他们已经做了将让他们绕同样的循环。
姓名和电子邮件总是需要的,并且首先收集。 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将整件事当作一行,按其实际价格处理,而不是制造出一个调和无所事事的分解.
以上申报开始作为商店的申报:购买某事,现在支付,它是你的,你可以取消。这四个业务中每一个都是假设某些真正的业务是不会分享的。银行转移资金是无法撤销的。保险人不能说“确认”直到承保人看齐。然后是商人的发票。一个诊所向不是病人的人开具账单。这些企业要么对自己的客户不实,要么根本无法联系。
所以一个交易连接器又回答了六个问题. 每一个都默认读取严格 说什么都不是总是安全的,决不是放任自流的,因为说什么都不是在作者没有考虑这个问题时所做的.
transaction_kindpurchase, booking, subscription, bill_payment, transfer, application, top_up, renewal词汇而不是行为:它决定了客户所读的字眼。拨打电汇“订单”使助理听起来不理解其所主张的业务,也没有多少正确的管道从中恢复。 purchase.
decision_modeimmediate 或 单 deferred选择 deferred 任何涉及承销、信用评估、推荐、录取或委员会的东西。OpsIQ然后说 提交的 而不是说 确认,然后将引用的文字交给别人询问。告诉某人他们的应用在与人类坐在一起时得到了确认,这是聊天助理对受监管的企业所能做的最有害的事情,也是每个零售流的默认行为。 immediate.
payment_timingon_confirmation, deposit_then_balance, invoice_later 或 单 no_payment。这决定是否OpsIQ打开支付页面 完全没有,因此不能从 payment_flow - 上面写着 - 说着 谁 钱拿去,这上面写着 是否以及何时。在发票之后工作,以及不花费提交费用的申请,最后确认,而不是到达一个空或错误的网关列表。
reversibilityreversible 或 单 irreversible金融连接器说的最重要的事情。一个房间可以放出,一个包裹可以回来;完成的转移不能——没有倒数,钱在另一端,唯一的补救办法是要求陌生人归还它。 irreversible 自动强制 cancellation_flow 改为 none 并禁止任何操作员设置不检查身份, 不论这个宣言中说些什么。两个字段不同意不是运行时需要解决的状态,而是由哪个先读者解决。默认为 reversible.
cancellation_flownone, platform_only 或 单 connector_cancel。取消角色已经存在,没有关于谁可以接触到他们的规则,两个错误的猜测在相反的方向失败:猜开而聊天消息取消付费的预订而不引用费用;猜闭而想要取消的客户被告知打电话. connector_cancel 额外需要 cancellation_quote 财务报告和已审计财务报表 order_cancel 恢复了... ...OpsIQ永远不要在说出它的成本之前取消。 none.
fulfilment_presencecustomer_present 或 单 remote_delivery。一个未经核实的电子邮件地址是否花费了任何人的任何费用。酒店客人必须抵达,所以错误的地址会误导收据,房间仍然在那里;一个张贴的包裹、一个提供服务的服务器或下载链接仅凭地址的力量就可以离开。 操作员的“ skip 电子邮件验证” 设置由此可以使用旅馆的推理永远不能被运送货物的连接者继承。 remote_delivery.
minimum_assurance 财务报告和已审计财务报表 disclosure (可选)minimum_assurance 让你要求 更多( E) 身份证明比OpsIQ要求,同样重要的是,银行在进行转让时需要升级的银行正在履行合同。设定合同也使操作者无法跳过对连接器的核实,因为商家自己的风险决定会比操作者的方便程度高。 disclosure 显示措辞 之前 确定按钮,对于费率、收费或冷却权,您必须出示;没有该按钮,受监管的企业将规定的措辞偷运入产品名称。
notify_flowplatform_automatic, platform_triggered 或 单 none。何时OpsIQ支付您自己的退票, 所以无论通常的电子邮件是不会放火的。 记录付款额标志着已经支付的订单; 它不要求任何平台告诉任何人 。 platform_triggered 需要的代码 order_notify 与恢复有关的作用,以及OpsIQ只有在付款回购后,才要求证明已记录了这笔钱。 none 做一个OpsIQ- 附加确认是强制性的,否则付费客户根本听不到任何声音。 none.
这些都不是设计好的,每个都是诚实地为不同的行业 服务的合约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.completed 与 order_id, payment_id/provider_ref, gateway准确 amount_minor, ISO 标准 currency,客户、行项目、频道和 paid_at商家连接器必须坚持通过下列方式提供证据: record_payment 并读回;一个主机检查出连接器会消耗自己的权威支付事件,并且不得收到重复的支付书.
该模型可以选择已申报的产品和数量,但不能选择操作名称、薄荷定单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.
单靠支付能力并不能让客户看到网关。 原生存储支付网关 。它添加了明确的版本合同、地图检查和主动付款查询,并允许列出由提供者托管的检查域。一旦连接器在商务设置下安装、启用和选择,公共商店、存储模式、客户端聊天检查和自动检查中就会出现同样的网关。没有提供商的字片是硬编码的。
{
"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 命名您的自定义动作编号 :
{
"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。上面“你的总数是唯一移动货币的数字”部分中的所有内容都逐字适用:税费和乘数进入你的总额,因为你的总数是签名、显示和收取的。
收下这个 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完全一次订单, 当网关积极验证付款时。 它的运行是同一项可以防止重复的收款, 所以它不能双发您网签 。
自定义集成是工作空间配置: 它服务于您商店, 在您工作空间上。 您想要分配集成的时刻—— 其他工作空间, 市场, 版本、 签名、 付费安装—— 将相同的动作和声明包成连接器。 合同不会改变, 只有包装器会改变 。
有很多真正的平台 船没有RESTAPI酒店CMS,旧的帐单系统,一个有声的内部工具。您仍然可以写完整OpsIQ连接器:连接器发送一个单个的 PHP 文件,操作员将该文件投放到自己的公共网络根上,而该文件是API。本页是整个图案,其中的规则使运行安全,以及每个规则背后的原因。
一个正常的连接器叫别人的API。桥接器会带来自己的连接器。没有其它变化:相同的动作、上下文提供者、相同的身份合同、相同的软件包布局。
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.
旁边是平台自己的索引. php. 没有修改平台代码,没有安装插件,没有东西可以维护跨平台升级.
您的设置 。json声明 Webhook_ help. slippet_template。 连接器页面使其成为可复制的文件, 并且已经替换了他们的活的设置, 所以没有手动编辑的内容 。
您的客户端.php 发送请求时使用 X 中共享的密钥 。Opsiq- 布里奇 - 关键头,基地URL设置是平台站点根。
api_key 启用时,将其发送为 X-Opsiq-Bridge-Key,并绑定相同的已保存值 OPSIQ_BRIDGE_KEY 。只有在您的平台不是其中之一时,或者需要行为时,生成的桥才不覆盖。手写桥对向导是安全的:它只覆盖带有自己标记的桥文件。此文件位于一个共享密钥后面的一股公共网络。 仅此一项事实就驱动了下面的每个规则。 不要放松其中的任何一条, 以简化您的桥 。
不是条款,不是按片段排列的命令,也不是“仅此一次”的原始查询参数。调用者会命名一个表格、一列和一个值;您的文件会构建语句。调取者可以贡献的时刻SQL文本中,一个共享的密钥变为任意数据库执行。
识别符不能作为参数绑定,所以必须检查它们。读取本数据库的正本表格和列列表并拒绝任何未登录的条目。如果一个标识符不是这个方案的真正对象,那么它就根本无法到达查询 — 这才使得每个表格都能安全地曝光。
毫无例外,包括搜索中的值。验证的标识符加上约束值是使表面总计和注入表面为零的对数。
下个街区,这是规矩,人们最想跳过
匹配列名: 密码, 记住_ token, 秘密, api_ key, 私钥, 盐, 符号。 在出站时将值替换为占位符 。 拒绝在路上完全写入 —— 写出原始的密码散列不是操作, 而是脚枪 。 请将操作员发送到平台的密码流 。
绝对不要删除批量删除, 也不要通过过滤删除。 批量去除是数据库如何被消亡的。 如果某人真的需要一个, 他们可以在平台上完成 。
用硬天花板将限制参数粘贴。 运行中的查询不能通过聊天信息丢弃数据库 。
未配置的桥的答案403在布置之前有帮助的桥梁是帮助陌生人的桥梁。
hash_equals, 永远不要; 键在 X --Opsiq-Bridge-Key,而不是查询字符串,所以它不使用访问日志,代理日志和引用页眉.
一种方法,一种形状,没有任何东西可以走私到尸体中。桥所做的一切都是可以被看出来是具有验证参数的GET,OpsIQ是唯一一个打电话的人。
这是一条被争论的规则, 所以这里是全部的推理。 助手应该能够查看整个平台: 因此它有用, 而读数不能破坏任何东西。 写法不同。 此文件坐落在一个共享密钥后面的公网根上。 如果密钥泄露, 不受限制的写入表面会使泄露相当于数据库控制的全部—— 一个新的管理员用户, 一个空置的预定表。 允许列表意味着漏出密钥仍然无法到达操作员从未启用的表格 。
/* ── 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, 上面有安装表的前缀, 而操作员会写出允许列表, 因为它们自然会输入。 比较两种方式或前缀安装时, 都不允许任何和每次写入中断。 而拒绝必须解释自己, 因为阅读它的人是聊天窗口中的管理员, 而不是一个有堆栈追踪的开发者 。
/** 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. */将“ 助手可以到达任意的桌子” 从鲁莽变为安全。 将呼叫者的桌子名称与真正的策略相对应, 容忍一个缺失或额外的表格前缀, 然后返回无效的任何东西。 然后下游的一切都使用一个可以证明存在的名称 。
/** 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));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 程序相同。
{
"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" }
]
}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}在面板看到片段前填好
列表给出了您在一个面板中的几个片段,例如桥文件以及单独的接力钩.
# 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.json 与 transport: 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"
}
}
}record_payment 。只接受服务器验证的提供者证据:精确的顺序、商号、数量、ISO货币、供应商参考、新核实的时间戳和一等钥匙。通过平台的支付/发票坚持它。API,然后返回权威命令或发票重回。在进行重试之前,未知结果必须先进行回收。测试它。 将常数重命名为空并确认每个操作答案403.
hash_equals, 并且键只从头读取 。
而一个前缀错误的正表名仍然能解决.
写着名字被拒绝 并附上解释
带着告诉操作员如何拓宽它的信息.
php工具/sync_connectionor_bridge_spippets. php 一步步地报告.
如果您的软件包传送了桥口文件, 连接器升级操作员也必须将该文件重新调配到他们的网根上。 在面板上和您的变换GELOG中都这么说, 每一份发布都如此 。
只有读取的桥才能说话 SQL。 CREATES 平台上事物的桥梁(订单、订票、付费发票)必须穿过平台自己的应用层,而无心地启动该层是这种模式中每一个微妙的失败都存在的地方。 下面的一切都是在现场融合中艰难地学到的,每个规则都针对一个真正的缺陷,这个缺陷在任何地方都没有产生出任何错误。
列出现,管理员列出,并且它仍然是平台认为它创建的纪录:没有本地参考号码,没有模型钩子,没有事件,没有发票,没有客户电子邮件,也没有工作客户-facing链接. 客户引用了平台从未向找不到的员工发布的参考信息. 通过平台自己的服务创建;如果仅暴露一个支付后服务,则创建它所期望的图形,并在它定义的接合处上交接.
参考格式的两个样本使其看起来容易复制,复制时的阴影写出一个级别:平台改变其方案之日,你的记录都是错误的,没有任何信息警告你。请调用生成器(反射到一个非静态的),并读取存储值,而不是信任你发送的。
在您将您的东西存储在平台栏目中之前, 请找到每个阅读器。 像自由槽这样的栏目可以装入: 在引用集成上, transaction_id 结果成了客户通过电子邮件“查看你的预订”链接解决的标志: 存储在其中的一纸空文摘要悄悄地打破了每个客人链接。 将您的账簿保存在桥上自有的表格中: UNIQUE( 操作, 操作), idempotency_key)是重放的守护符,约束拒绝并行的双胞胎,恢复检查读取了与创建时相同的表格。在开始 Transaction 之前创建该表格: MySQL DDL暗中进行公开交易.
如果您拨打的平台服务已经发送了事件, 自己发送了两次确认邮件并生成两张发票。 如果没有监听, 发送也没有发出任何发票。 失败也不会引起错误。 反射方法、 切开源行并读取它的实际作用: 一个基于名称的猜测, 甚至一个对机体的正则x, 在源头解决之前都错了 。
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.
在您桥上脚本中捕获的请求点, 所以路径( ) , 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
签名的 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,然后重新签名。在所有地方按相同的顺序进行相同的四张检查: 失败关闭没有密钥, 一种方法, 从头部进行恒定时间密钥比较, 然后连接。 唯一的真正的陷阱是比较, 它是一个不同的陷阱 。
// 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)// 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)));
}安全属性不会改变: 所提供调用器的表格或列名必须在插入前与真实的计数符相核对, 每个值必须是一个绑定参数。 只有内向查询、引用字符和呼号条款不同 。
表格: 数据 SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?。列:对 information_schema.COLUMNS 与 AND TABLE_NAME = ?。带有反向引用,将内部任何反向重复翻倍。 LIMIT n OFFSET m.
相同信息_schema 视图,小写名称, WHERE table_schema = $1 (通常情况) public。引用时有双引号,内部任何双引出都加倍。 LIMIT n OFFSET m。注意折叠规则:未引用的标识符被折叠到下大小写,所以在解析一个名称时要比较不敏感大小写。
相同信息_ CHEMA 视图。 引用后加方括号, 将括号内任何收尾的括号翻倍 。 ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.
表格: 数据 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 和以后的电话
没有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;
没有可注入的查询字符串, 所以人们假设没有什么可以保护的。 包括: 过滤文档。 通过调用程序提供JSON直接进入 find() 让一个呼叫者发送 {"$ne": null} 或 单 {"$gt": ""} 中要预留一个值,然后悄悄地选择每个文档。您自己构建过滤器。
// 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();解开电话的拼写,使用下定名。
字符串() 或数字( ) 是防止操作员注射的整个防御。 您期望一个值的文档是 与 偏移 引号等同的 NoSQL 。
排除投影中的秘密形状字段,所以它们不会离开服务器,而不是在之后从结果中去掉.
删除已解决的 _id 。 绝不删除 Many, 也绝不使用受调用者影响的过滤器。
与SQL: 将所收集的文献命名为可以触摸的; 并用解释拒绝其余的文献。
身份探测器是桥的另一半,它也是HTTP。签名块在每种语言中都是相同的: Base64url 有效载荷,HMAC-SHA256那个弦,加入一个点。
这些代码片段创建了一个 PORTAL 传递令牌,这是有意的更严格:它携带 jti 和 single_use:true 并且大约存活时间为 120 因为它在一个旅行 URL桥或小部件身份令牌不携带这两个,并使用更长的exp,从分钟到小时。
site_key, iat, exp和顶级认证的: truth, 加上一个带有ID和用户名或电子邮件的管理员或客户主体。 相同的要求, 相同的签名, 同样的秘密 。
由三部分组成的JWT签署了HS256号工程,两部分的基质64url有效载荷加六分子也签了字。HMAC pHP 引用 。 使用您语言库中自然存在的任意一个。 JWT 库通常是 PHP以外的较短路径。
每种语言都是真的,签名客户端意味着把网站秘密传送给每个访客.
用 PHP 写出桥。 它在包中飞来, 它被漂移检查, 它可以启动平台自己的框架 读取身份探测器的活会话。 没有其它东西能给你们全部三个。
桥船,标志和漂移检查都跟PHP一样,没有放弃任何东西。
通过面板片段交付并在面板正文中这样表示;不要将文件留在桥上/ , 符合度会拒绝包。 连接器在其他方面是完全正常的: 动作、 上下文提供者、 身份和来宾的外观都一样, 因为没有人在乎HTTP 呼叫的答案 。
那么桥图案就不是合适的工具。 一个桥会从自己的主机内部到达一个平台。 如果您只能从外部到达, 您正在写一个普通的API连接器与它所暴露的表面相对。
连接器中缺少的就是这个“工作但无用”的单一最常见的事物。动作让 AI DO 事物。上下文部分让它知道事物。连接器需要两者,而管理员问的大多数问题都通过上下文回答,从不通过动作回答。一个有完美动作的连接器,没有上下文提供者会诚实地报告它看不到任何东西。
以行动宣布。json或按寄存器返回。该模型选择一个,填充其参数,以及OpsIQ执行它。动作是用于动词:取消此预订,打开该票,改变此状态。
由"背景推介"在模型运行前所集成,"本月有多少订单","谁是我最新的顾客", "我们卖什么"都通过上下文的取景来解析,从不触及一个动作.
OpsIQ您的工作是决定每个人在您的平台上的意义并回答它。酒店预订就是酒店的订单; 房间就是酒店销售的东西。 地图, 不要发明。
无论您平台上的交易:订单、预订、预定、工作、货运。待处理的订单是过滤到未完成的列表中的相同列表 。
顾客名册
平台销售的商品:产品,房间,计划,服务.
收入和货币形状的总数,加上按州计数。
当你们的平台真的拥有它们的时候,请使用这些。不要强迫绘制地图,因为未解的段落比错误的一节要好。
声明自己的。 一个提供者宣布了部分( ): ['许可证','gates'] 将这些部分合并到通用的搜索权限列表中, 因此平台特定搜索可以使用, 没有核心更改 。
一个上下文提供者 MUSST 执行接口。 注册类型检查它, 因此仅 LookS 右侧的类被跳过 。 任何地方都没有出错 。
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 接口, 并登记为它本身 。
构建 () 返回一个文本块, 将它缩合到提示中。 为读取器写出它: 标题, 然后每行一行 。
检查一下自己的例外。一个提供商被记录并跳过,但返回'是合同。
生成的上下文 Provider. php ships 段落 (): 数组 { return [;] } 且向导没有字段。 用手填写它, 并记住从向导重印文件。 先复制编辑 。
$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);OpsIQWORDS在动作_id中将一个动作归为一类,它刻意保守:任何无法识别的动作都会被作为写作处理,并需要一张批准卡。请将动词右转并只读出一个运行符.
如果设定了其中之一,动作总是需要批准。 诚实地宣布这些动作——这就是行政主管的批准卡的表面。
添加,创建,开放,更新,编辑,修改,删除,删除被销毁,取消,退款,暂停,终止,激活,批准,拒绝,发送,标记,重置,捕获,无效,关闭,再开,指定,撤销,授予,设置,切换,启用,禁用,发行,生成,应用,充值,支付,提供,更新、升级,合并,移动,转移,升级,旗子,注册,同步,推出,运行,触发,起步,停止,重启等几个功能.
获取,列表,搜索,查找,查看,显示,获取,计数,查取,描述,读取,导出,预览,测试,平移,状态,汇总,细节,最近,历史,检查,日志,统计,计量,概览,收入,分解,报告,分析,平衡,使用,定额,快照,洞察,饲料,草稿,分门别类,分类,建议.
获取,头和选择被读取。
不承认意味着需要批准,这是故意的。
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连接器。
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.
IS 这个平台,它的数据是如何形成的,它的对象是什么,以及那些可以让助手猜测的怪事。写给一个从未见过这个平台的胜任的同事。
可调用表。 对于桥接器来说,这是您的操作,并使用其参数进行词汇,而不是一个 REST 端点表。
大约6,000每个连接符保留字符,以及大约24,000整个块的字符覆盖每个启用的连接符。在每条连接符上,您的文件被切换;在切换符之前要简洁。
这些文件是助理使用您的通用表格工具与错误的段落的回答之间的区别,因为从来没有人告诉过这些工具的存在.
一个签约合同服务于三个表面,连接者的工作是将"谁登录在平台上"变成一个签名的代币.OpsIQ,然后在OpsIQ其形状。连接器从未认证过任何人——平台是这样做的,签名上还带有这种断言。
管理主体。部件在平台的管理面板内加载,每个工作人员都匹配到自己的OpsIQ代理 。 管理部件页面上完全通过 。
客户主题。 这是让登录的客户获得他们的WALE账户而不是匿名查询: 每一个订单,全部细节, 以及任何您允许的自助行动 。
同样的索赔加上jti和单人使用,a120- 第二次生命,因为信使 旅行在一个URL并且必须花费一次。不要手动翻转这个 : 设置、 支持门户每个语言都包含一个已准备好的片段, 当账户区域运行于此服务器时, 平台会为您提供薄荷 。
此处没有可选的,无论其他地方有部分例子可能表明什么。
顶级。 必须是请求的站点密钥, 或拒绝该令牌 。
顶级, 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 登录 ” 。 它读取时完全像会话错误, 而不是: 符号缺少顶级旗帜 。
它现在接受顶级或主体内部的旗帜,因此合同是统一的。旧的核心只读顶级。释放出每个发行时的犬形和您的包。
有两个事情必须是真的 核心必须给被验证的客户盖上印章 你的连接器必须呈递
与管理员的签名符相同, 并带有客户主题。 从平台的会话中读取客户。 如果您的平台将客户签入了与管理员不同的守护符, 请读取您想要的守护符并且永远不要掉回主体之间, 这就是客户如何被交给管理员标志符 。
在一个有效的符号上, 核心标记已验证的对象进入会话。 您的提供者读取一个已验证的身份; 它永远不会认证 。
检测客户端( ) 返回OpsIQ形状。它必须执行OpsIQ\Platform\Identity ProviderInterface,或注册默默地跳过它——与上下文提供者相同的陷阱.
还有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执行它一边,而您的平台也必须执行它另一边。一个锁是远离泄漏的窃听器;两个锁是合同。
在客户聊天之前OpsIQ用 VERIFIED 访问者身份替换每个身份形状的参数:客户端_id,客户端d,用户端-id,用户口号,用户行号,客户口号_id取经验证的数字ID;客户端-识别器,客户点_dentification,账户_dnition取为字符串;电子邮件,客户机_邮件,客户头_email,用户去取经核实的电子邮件。无论建议的模式被丢弃。
取出你得到的ID, 并加入到每篇书写和每篇文字的 名称中。 绝对不要相信请求中的引用。 询问他人订单的签名客户必须空出, 而不是禁止。
称它为客户_ id, 不是 cust 或 ref. a 参数OpsIQ无法识别它不能锁定的参数。
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.
{
"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的序列 。
工作的地方,没有安装
安装下载,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.
设置。json和连接器_合同。json。如果弹片、版本或能力集有异议,则会比较它们,但失败。在您在场时添加一个 ChangeGELOG.md 条目——这是需要的文件。
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.
php 工具/ resign_all_connectioners. php — 签名覆盖了文件散列,所以任何编辑都会使其无效。 在每个文件最终完成后, 签名是最后的 。
播种者在构建ZIP时会给每个包签名,并且运行的背景是无法从设置读取密钥——所以它必须来自环境.
重新设置连接器更新软件包。 它不会触摸位于操作员的网络根部的复制件。 请告诉他们, 在面板和更改日志中。
# 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/ConnectorsZIP 是从签名人自己的文件列表中构建的, 因此您包文件夹中的一个偏差文件不会被运出。 这是刻意的: 一个用于搭载客户的未签名文件 。
费普,json,js,(笑声)css,md,txt,, (中文(中国大陆) ).html, ssh, svg, png, jpg, jipeg, gif, webp, ico, yml, yaml——递归性地,包括桥/和测试/.json本身被排除在散列之外,然后添加到ZIP中,以便安装可以验证.
种子名称是它留下的每个文件。 读取该列表。 您期望运入的文件意味着错误的扩展名或错误的位置, 而不是默默的成功 。
包括一个马克下发文件,重新签署那个包裹.
返回连接器界面实例 。
通称:shot,名称,版本,express_version,相容性,能力,连接器_contract_verersion,设置.
机器可读合同,其弹壳、版本和能力设定必须与设置相同。json.
所有三个都经过检查, 以确认存在和最小尺寸。 DEVELOPER. md 需要真实的内容, 而不是根节点 。
每个能力名称它所期望的文件——上下文的Context Provider. php,身份的Cident Provider. ffp,来宾-Lookup的GuestLookop Provinder. p等——除非连接器执行内在的能力.
协和扫描了三个Markdown文件,以获取密形值和私钥,在命中失败.
完全匹配套件是安装运行的同一套。它对照犬科合同检查清单,该合同规定每个申报的能力都有其文件和方法、每个薄荷文件中的标识卡合同、桥接-片段匹配、客机搜索许可人卫生、动作独特性和确认安全以及包签名。
# 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 可以发现、配置、验证、启用、执行、测试、签名和分发。
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 授权代码和自定义认证模板.
onEnable(),同步动作定义,并可以启动初始回填.onDisable() ,并停止活动而不删除导入的数据。actions.json 目录不会使动作变得可用,直到连接器安装、启用、配置及其连接有效。运行 PHP 标识、 显示验证、 连接测试、 动作计划测试、 Webhook 签名/ 重播测试、工作空间同位素测试、 回填重排测试、 停用连接测试和失败/ 重复测试。 然后应该签署和验证市场包, 包括设置/ 允许/ webhuk 文档, 并声明其真实的发布状态。 连接器的图板和显示是权威的可用信号 。
常见接线器设置的分步配方.
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.
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.
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.
OpsIQ 子系统为扩展打开。连接器可以插入新的能力到 CRM 或 Site Intelligence, 没有更改到 OpsIQ 核心,通过平台能力登记册(\)OpsIQ\ 平台\ 能力注册 。 宣布能力, 实施其小方法集, 将连接器运送到 OpsIQ 发现它,并连接到UI,客户 360 时间表和安装提示 。
添加一个 <domain>_capabilities 数组,最适合无编码/市场位置连接器。域名 : crm, site_intelligence.
执行 crmCapabilities() / siCapabilities() 返回相同的描述符。
"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]
"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]
createEvent($settings,$params) →{成功,事件_id,html_link,meet_lin克}; listEvents; freeBusy被驱动的 OpsIQ\CRM\卡伦达尔布里奇。
enrich($settings,$params) →成功,成功,开动了OpsIQ\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.
listMessages + sendMessage被驱动的 OpsIQ\ Mailbox\Mailbock Bridge。客户的邮件 360 时间线 + 从交易发送邮件。 Ships: Gmail + Outlook/ Microsoft 365 连接器。域名 mailbox / mailbox_capabilities.
所有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 从未提供导入连接器无法执行 。
客户关系管理代理商提议并预订交易信号会议(\)OpsIQ\ CRM\ 会议提案→CalendaBridge)和自动增收新账号,"AI"运行CRM环路,跨接通巴士执行.
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
// 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进行裁剪.
在你的 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和来访者声称的(未经核实)预聊天邮件作为证明候选人——没有身份字段。
在动作步骤上,添加一个只读动作,通过引用返回 ONE 记录(例如. GET /bookings/{booking_number})并用别名绘制其反应字段:状态,到达,出行,房间_类型,客户_电子邮件. .
能力步骤上,启用 guest_lookup。显示一个专用面板:选择取取动作,命名引用参数,给出引用模式(例如正则正文) \bBK-[0-9]{4,10}\b),命名记录("订票"),并取出证明——记录上的电子邮件(推荐)或无(仅参考,用于只身份信使追踪).
准确选中客人可能看到的字段 。 其他的都是 DROPPED —— 从未编辑过 。 构建者拒绝在许可列表中设置 PII 形状字段( 电子邮件、 电话、 地址、 付款...) , 而放出门兼容套件在发布前会重新检查同样的规则, 所以手编辑的字段不能偷偷插入。 注意安装时间验证只覆盖了清单和签名, 所以在您飞船前自己运行兼容套用字段。 证明字段本身是永远无法显示的 。
构建器释放 GuestLookupProvider.php ——用口号加固执行,每套生成的包件相同——并添加 guest_lookup_enabled 切换到连接器的设置。当访客询问您的记录类型时,商业部门会手持两个开关和聊天AI。
想想"在公共追踪页面上信使会打印什么":状态,日期,房间或服务类别,计数. 姓名,联系方式,街道地址,支付数据和自由文本笔记在匿名聊天中没有位置——构建者和符合者都拒绝.
生成的提供者在结束输出时会给出一个指令,只从列出的字段回答,并提供其它任何内容的出票. 许可列表中未包含的细节是"聊天时没有的"——根据设计.
提供者在同一次对话中重新从访客最近的消息中提取引用,所以"以及什么时候退账?"在不重打引用内容的情况下工作,匹配的引用和证明邮件被作为CANDIDATES在聊天线上被记住,因此后续内容不会重新询问。他们只是候选者:每转仍然重新连接记录服务器侧并重新比较证明,然后释放出一个字段.
市场包可以自己运出 GuestLookupProvider.php implementing ContextProviderInterface 与 surfaces(): ['guest']。完全遵循生成的模板的合同——通过引用获取、校正匹配服务器侧面、统一拒绝、只允许列表输出——并声明 guest_lookup in capabilities. 遵义验证来宾表面并扫描PII的许可列表.
让LIVE客户端和您平台的计费状态开展目标活动:"有未付款发票","订单待决", "订阅被取消". 任何连接器(安装前,市场,或您自己建造的)都会通过实施两个小方法加入. No. OpsIQ 核心变化,没有平台硬编码: 您的连接器作为平台出现在工作室中 目标分页中,并带有它自己降下的事实,多个连接器可以同时被启用.
在您的连接器类上执行受众Catalog( ) 。 它返回一个标签和您平台可以回答的密钥列表。 每个密钥都会在工作室中以您的平台名称下降出 。
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.
启用连接器。 升职工作室的目标标签会扩展“ 客户端和账单” 区域, 列出您的平台; 管理员构建规则, 如“ 未付费的发票 QQ ” 1" ;每个事实也成为个性化变量,例如: {unpaid_invoices}.
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 在请求中回忆。
管理员将你的键组合为=,! =, >, >=, <, <=, contains, is set, is empty, 你只需提供值。
每个事实都比竞选副本中的变数加倍: {unpaid_invoices}, {client_status} 外加内置 {first_name} 财务报告和已审计财务报表 {client_email}. 数值在渲染前被消毒。
声明( A)JSON- 市场连接器获得FREE的促销:如果连接器宣布客户/用户、发票、订单或订阅资源, OpsIQ 从您已有的搜索操作中获取客户端_状态、 未付_ 发票、 金额_ 到期、 未决_ 订单、 活动_ 订阅和订阅_ 状态。 根本没有代码 。
添加一个观众_能力对象_{"标签":"我的平台","钥匙": [{"键": "开_卡", "标签"; "开出手推车", “类型": “数字'}}}] , 以控制工作室倒下中出现的具体事实(和标签).
连接器 > 您的连接器> 启用。 然后打开任何活动的目标标签。 您的平台必须出现在“ 客户端和账单( 连接) ” 下 。
添加: 您的平台 ^ a key +++ 1并设置“只使用Logged-in客户端”。保存并发布。
登录到您的平台时, 客户端必须符合规则( 流行必须显示) , 而不是( 弹出必须隐藏) 。 登录的访客不会符合登录的规则 。
内置触发器(延迟,滚动,出站提示,闲置,点击,页面查看,聊天/票务活动)之外,可以在成功退站后,在废弃一车后,当SPA更改路线等时,从网站的任何地方或连接器前端点燃一个运动.
设定竞选触发器为 自定义 带有事件名称(例如: checkout_failed),然后从您的页面中调用全局钩:
// 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');电话 survey 能力允许任何平台向Survey Studio提供经核实的客户身份适配器、受众事实、安全变量和受援者候选人。 promo_audience 并且不给调查、答复、分析或电子邮件发送的连接者所有权。
SurveyConnectorInterface,生成的专用构建器面板 SurveyProvider.php,将元数据包和兼容隔离所有船舶。消费尚未被接通: SurveyConnectorRegistry 已实施和测试,但调查运行时间尚未调用,因此提供者的健康未在行政界面中浮出水面,也没有公布的连接器软件包宣布该能力。CRM外联物资化和第一批运送的供应商绘图仍然是单独的阶段,现在根据这项合同进行构建;预计在稍后发布时将开始消耗。仅为服务器验证的、工作空间约束对象声明已输入的语句事实并解析值。典型的事实包括:命令_计数、最后_顺序_状态、取消_顺序-计数,客户_创建_at、活动_订阅_计分、过去_到期_发票_计价和开_计票等。
声明客户、账户、订单、订阅和支持变量,并带有类型、敏感性和允许上下文。调查副本需要回放和输出文本。
可选列举候选人CRM以稳定的外部ID、有限定的页码、确定光标和与同意有关的元数据进行外联。调查在发送之前冻结选定的受众。
仅在签名、过期、目的、连接器和工作空间验证后从调查身份网关接受身份。浏览器提供的电子邮件、身份证、标签或账单都从未具有权威性。
SurveyConnectr Registry 旨在报告兼容,被封禁和无法获取的提供者,而不披露设置,路径,原始身份或例外消息,并且永远不能引用被封存的提供者. 报告表面尚未在管理员UI中被曝光:今天被封杀的提供者只是惰性.
未声明的密钥、 错误的类型、 超大小的值、 主题不匹配、 连接器超时和未知身份被拒绝 。 需要无法获取事实的目标规则并不匹配 。 对收件人的页面进行封顶和审计 。 在公开预览或日志中从未出现过敏感值 。
合同 2.2 生成的能力登记册条目、接口、勘测绘图面板 SurveyProvider.php,能力版本,README/开发商参考和符合性装置。商务、服务台、SaaS桥和本地的PHP配置图都包括它; API 连接器选择使用。静态门拒绝一个叫作促销命名空间、表格或能力的调查提供商。
电话 reply_feedback 能力镜像一个平台的 自己每个复制的收视率 OpsIQ 顾客给内部员工回信的明星 WHMCS 客户区在SAME的答复中登陆 OpsIQ admin 线程,其芯片、代理信用、反馈页面条目和团队及性能计算等同于一个函数的评级 OpsIQ 传送门票,一个存储器,一个芯片,一个管道;连接器只翻译.
有两条入道和一条真理。OpsIQ 入口门票是本地写作,平台门票通过连接器流出,核心登陆每个活动通过 ReplyFeedback::recordMirrored(): 相同的列, 仅限员工规则, 单评- 每补读最新赢取的语义, 工作空间印章和客户之声索引门户写作用途。 连接器本身不会写回馈行 。
添加能力. reply_feedback 条目:版本 1.0, RefaceFedbackConnector Interface,方法回放Feedback Catalog和拉回回放,意指入行_ticket.
添加回复_ 反馈到能力列表。 这就是连接器发现的内容 。
声明回复_ feedback. modes( poll and/或webhook)和平台的评分等级。 这是符合的门读取的 。
执行接口, 列表回复( feedback in policy ()), 然后重新签名包 。
宣布模式,平台自身的评级等级(核心正常化为本地1-5)和任何反应符号。目录必须与Spec一致。json.
拖放回放后退的犬事:平台票id,平台回放id,评分,可选反应/评论,提交时间和稳定事件_id。它读取并翻译,从来不写作。
事件_id是稳定的,每反馈一次STATE,所以重播的事件是无操作的,并且改变评级覆盖(最晚获胜,如"传送门").
页面是被绑定的,具有决定性;不推进的光标会结束运行。历史回填排为滚动窗口,绝不是一出巨型拉出。
没有配置, 请返回一个空的完整页面而不是丢出。 匹配的跑者探测器带有空参数 。
核心通过镜像标记将每个事件解决为本地回复,即票面镜已经盖有邮票(<slug>:<ticket>:reply:<reply>) 无法解决的事件会被放弃,从不猜测;反馈只附在工作人员的答复;代理信用总是来自答复中现有的作者。评级书写永远不会改变作者身份。这就是为什么能力需要 inbound_ticket 或 单 ticket_mirror.
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 显示芯片,反馈页面列出它,一个重放的事件不会改变任何东西。电话 ticket_merge 能力可以合并一张票 OpsIQ 每个连接的售票平台上都有一个合并. 被保存的站台票接收合并的出票信息,从每张合并的入票信息开始,而不是只关闭合并的站站台出票.
合并到 OpsIQ 将合并票的每条信息移入保留票并取出合并票。在合同签订前 2.4 仅听到连接符 ticket.deleted 每张合并票。 WHMCS 关上那张罚单和存物 WHMCS 票房从未收到客户首次写到的内容:主体显示[MERGED],内容缺失.
KEPT 票据的 ticket_id、ticket_number、主题和 external_ref; native_table (opsiq_tickets ) ; site_key; sources, 最早合并的票据排在第一位,每个都包含 ticket_ID、tiquet_nuMBER、主体、external_ref、client_name、clients_email、created_at 和 messages [{reply_id, author_type, author _name, created_at, body} ] ; merged_by; merted_at。
仍然开火,现在 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.
合并Ticket(ticketid = 保留票,合并ticktids = 为合并票)时,两者均在 WHMCS; 另加文字记录。 中继器的出票机钩将合并 OpsIQ 工作人员合并时的复制件 WHMCS.
邮编 /api/v2/tickets/{id}/merge.json 加上笔录作为私人对保留票的评论,因为 Zendesk 关闭合并的门票而不移动其评论.
邮编 /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 然后打开月台上保存的门票 合并后的门票的第一个信息就在那里市场让你发现、安装和发布社区建造的连接器。
转到连接器 > 市场站。 搜索名称、 类别或平台 。
请检查date=中的日期值 (帮助) 描述,支持的动作,以及收视率.
点击安装。 连接器包下载并安装到 market_ connectioners/ 。
在连接器中启用, 输入 API 证书和测试。
使用连接器构建器。 请检查所有动作是否工作 。
生成剖面图.json 行动。json,知识。json,以及 PHP 文件。
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.
上传市场提交材料流程供审查。
运行时发现根。这里的一切都是现场直播: 与飞船连接的连接器OpsIQ任何从市场安装的东西, 以及连接器构建器在这个安装上发布的任何信息。
发布首方市场包的 SURCE 。 它不是一个发现根:这里没有活的,直到它被包装、签名、种子入目录和安装,然后复制件在连接器/ 中着陆。
密码 API 而 Webhook 构建器允许您创建自定义 API 内部的结束点和网点听众 OpsIQ 不写入原始 PHP 。
出事时跑 OpsIQ,或者当外部系统发布匹配您的 Webhook 的事件时 URL 键入事件名称,例如票.created。
使用内置间隔事件之一作为事件名称: cron. minute. cron, hourly 或 cron; daily。 动作和触发屏幕有这些按钮, 所以您不必记住它们 。
当管理员用平话向 AI 询问时运行。 添加应该匹配的短语, 例如找到客户 。
外部系统向您发送 HTTP POST OpsIQ 网点 URL 任何触发器都会听到事件起火的声音
事件触发器可以携带条件, 所以它只能运行于所收到数据匹配时。 不附带条件, 它每次发生火灾时都会运行 。
事件数据路径。 使用一个点来表示嵌入值, 例如客户端. email 。
选择每个规则是否必须匹配,还是只匹配其中之一.
等同,不等于,包含,不包含,从开始,不是其中之一。匹配忽略了首都。
数字作为文本的对比仍然正确。
存在, 缺少, 空出, 不是空出 。
动作需要紧急门票, 其它一切则需要跳过。 您的尾部不需要过滤 。
将 HTTP POST 发送到外部 URL 带有自定义的有效载荷。
创建带有指定部门,主题,以及消息的后台票.
发送带有自定义模板的电子邮件 。
更新客户、机票或CRM记录。
执行一个已注册的动作, 并使用其连接器许可和确认规则。
搜索完整命名的将军 API 目录. 字段,范围,权限,确认,一能和干运行支持来自活动作合同;工作流程执行在其所保存的工作空间和管理员上下文中.
使用连接器原生 API 读取或确认 API 当提供方端点没有被覆盖的动作时写入动作。 证书仍然保存在连接器内, 并且只接受相对提供方路径 。
常用自动化的可被使用触发-动作配方.
Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent
Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details
Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API
Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note
这种走行道从头开始产生简单的连接器动作.
在开始前, 请决定您需要哪个。 两者都是在同一屏幕中配置的 。
动作向您的平台发送 HTTP 请求。 当 OpsIQ 需要伸出援手 做点什么在你身边
动作运行一个已安装的连接器已经提供的东西。 当工作已经可用时选择它, 您只想触发它。 从列表中选择连接器动作, 所以没有线条可连接 。
示例:"Lookup_products",按产品名称,回价,股票,和描述来查找.
添加动作定义 :
{
"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" }
]
}
]
}在连接器构建器审查步骤中, 按 Dry 运行。 它会对照您的软件包运行完整符合性核对表, 并在您提供资质时进行真正的连接测试。 它不使用样本数据 。
问管理员AI:"找出产品Widget Pro". AI应该找到并执行动作.
输入端点接受签名 JSON 从另一个系统,并把它变成可输入时间、评分和工作流程的可复制的联系活动。
每个发送系统创建一个源 。OpsIQ 生成一个 URL 密钥和秘密 发送 JSON 与 Content-Type: application/json 并用HMAC-SHA256 签署确切的生体:
X-OpsIQ-Inbound-Signature: sha256=<hex hmac>
地图 JSON 联系电子邮件、事件名称和可选事件 ID 的路径。 事件 id 是首选的调试密钥。 接受的活动会进入联系时间线, 并会影响铅分、 片段、 生命周期规则和工作流程 。
在解析商业数据之前拒绝无效的签名。 旋转一个密钥, 将两侧更新到控制窗口中; 不登录密钥 。
出站的Webhook管理创建签名订阅,测试终点并监测同步交付和重试健康.
全管理员创建了HTTPS端点,选择了特定事件或通配符,安全地存储了这个秘密并发送了测试. OpsIQ 以 HMAC-SHA256 标记原始有效载荷:
X-OpsIQ-Signature: sha256=<hex hmac>
解析或动作前验证签名。 交付是同步的, 在大约之后自动重试 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours使用最近的交付铁路检查状态、响应代码和尝试计数。
您的接收器必须是一元化的, 因为任何同步系统都可以重播。 只有在持久接受后才能返回 2xx 响应 。
Webhooks 允许外部系统通知 OpsIQ 当事物降临的时候,OpsIQ 当内部发生事(外延)时,通知外部系统。
转到设置 > Webhooks。 添加一个结束点 URL 并选择要接收的事件。
订阅特定事件或 ["*"] 用于安装的完整列表如下,以及 webhooks.events.list 返回为JSON.
以指数回放重试失败的交付。 之后 15 连续的失败,端点是自动失效.
每一份都签了名 X-OpsIQ-Signature carries v2=<hex>,而签名的字符串是 version.timestamp.delivery_id.body ——不是仅身是躯体。总是精确地验证并重建弦。请参见下面的例子。
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,在重复时保持不变以进行分解.
例如事件名称 ticket.created.
交付的ID,在复读时保持不变——用它来忽略重复.
签字时Unix秒,拒绝超过5分钟的
签字日期为 v2=<hex>。在 =:左侧是版本,右侧是您比较的值.
目前采用的计划 v2。从头读取而不是硬编码,如果添加了v3,你的代码会继续工作.
version.timestamp.delivery_id.body仅将尸体抓起是核查失败的最常见原因——每一个真正的交付都被拒绝,终点看起来也断了。<?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]);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 });
});从运行的构造中生成,所以总是与您所打开的版本相匹配.
webhooks.events.list 返回此列表为JSON,所以你的代码 从来不用硬编码。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.
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.
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.
Fired by OpsIQ.
Fired by OpsIQ.
Fired by OpsIQ.
Fired by OpsIQ.
Fired by OpsIQ.
Fired by OpsIQ.
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.
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.
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.
Fired when the visitor rates a conversation (1-5 stars). Payload: thread_id (required), site_key, stars, comment, trigger, admin_id, occurred_at.
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.
Fired when a CRM company/account is created. Payload: company_id (required), name.
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.
Fired when a deal is moved to a Lost stage (closed-lost). Payload: deal_id (required), stage, amount.
Fired when a deal moves to a different pipeline stage. Payload: deal_id (required), stage, amount.
Fired when a deal is moved to a Won stage (closed-won). Payload: deal_id (required), stage, amount.
Fired when a CRM task is created (incl. AI-suggested next-step / renewal tasks). Payload: task_id (required), title.
Fired by OpsIQ.
Fired by OpsIQ.
Fired when a Voice-of-Customer analysis run completes. Payload: analysis_run_id (required), workspace_key, sample_count, model_version.
Fired when a newly indexed response meets its metric-specific detractor rule. Payload: feedback_item_id (required), workspace_key, source_kind, metric_kind, classification.
Fired when a Feedback follow-up is completed. Payload: feedback_item_id (required), workspace_key, actor_admin_id, outcome_code.
Fired when Feedback ownership changes. Payload: feedback_item_id (required), workspace_key, assignee_admin_id, team_id, actor_admin_id.
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.
Fired when source deletion or redaction removes Feedback content from the index. Payload: feedback_item_id (required), workspace_key, source_kind.
Fired when the Feedback workflow state changes. Payload: feedback_item_id (required), workspace_key, state, actor_admin_id.
Fired when a tag is added to or removed from Feedback. Payload: feedback_item_id (required), workspace_key, tag, operation.
Fired when a canonical Feedback item changes. Payload: feedback_item_id (required), workspace_key, change.
Fired when a Feedback source replay or incremental index operation fails. Payload: workspace_key, source_kind (required), error_code, checkpoint.
Fired when a Feedback source checkpoint is behind its expected freshness window. Payload: workspace_key, source_kind (required), lag_seconds, last_success_at.
Fired when a canonical topic or theme signal is attached to Feedback. Payload: feedback_item_id (required), workspace_key, theme_key, confidence.
Fired when an urgent Feedback signal is detected. Payload: feedback_item_id (required), workspace_key, source_kind, signal_key.
Fired when an invoice is generated. Payload: invoice_id (required), customer_id, customer_email, amount, currency, due_date, items.
Fired when an invoice passes its due date unpaid. Payload: invoice_id (required), customer_id, customer_email, amount, currency, days_overdue.
Fired when an invoice is paid in full. Payload: invoice_id (required), customer_id, customer_email, amount, currency, paid_at.
Fired when a new order is placed. Payload: order_id (required), customer_id, customer_email, amount, currency, items, status, source.
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.
Fired when a payment attempt fails. Payload: order_id, customer_id, customer_email, amount, currency, gateway, reason.
Fired when a refund is issued. Payload: order_id, refund_id, customer_id, customer_email, amount, currency, reason.
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.
Fired when a subscription is cancelled. Payload: subscription_id (required), plan_name, customer_id, customer_email, cancel_reason, cancelled_at, ends_at.
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.
Fired when a subscription renews successfully. Payload: subscription_id (required), plan_name, customer_id, customer_email, amount, currency, next_billing_at.
Fired when a ticket is closed or resolved. Payload: ticket_id (required), resolution, closed_by_type, closed_by_id.
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.
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.
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.
Fired when a reply is posted to a ticket. Payload: ticket_id (required), reply_id, author_type, author_id, author_name, message.
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 密钥认证请求到 OpsIQ 净 值 API。每个密钥都有范围权限。
导航到 API 关键管理。
给它一个描述性的名字。
仅提供它需要的钥匙。 范围会在每个区域中读写对, 因此可以给出一个报告集成, 而不是其他内容 。
选最窄的一套来做这个工作 admin 满足下面的每一个范围, 所以只有在你真正需要广泛访问时才使用它。
联系人、公司、交易、活动、分部、外联、转换、生命周期和CRM网友们。
列出并读取出票及其信件;回复,更新,打开并运行批量队列操作.
读取活话对话与消息历史;发送消息,指定并更改状态.
知识基础条目.
已保存的回复模板 。
看看安装了哪些连接器,它们能做什么,测试它们的资质.
看看你的行动,触发器和他们的运行历史。
各部门可办理线路.
通知一个指定的操作员。
报告各节, CSV 出口和计划报告定义。
监测地点及其SEO报告。
已签名的附件下载链接 。
状态页组件和事件。
AI作词助推:草稿,总结,翻译,重写,作曲,分析.
包括少数因任何狭义范围而故意无法达到的敏感动作:去除接触,改变隐私设置,并读取访问日志.
键可以调用它的范围允许的任何东西。
无论范围如何,每张字都被拒绝。报告、仪表板和任何不该改变数据的东西最安全的选择。
您列出密钥可能要使用的确切动作。 其它任何动作都会被拒绝, 即使在允许的范围内 。
显示一次,开始是“ opq_” , 安全存储 。
密码 OpsIQ 部件是 JavaScript 片段您会添加到您的网站中,用于跟踪,AI聊天,票款创建,以及客户身份识别.
<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.
需要。 您的站点密钥来自连接站点 。
可选的,“聊天”(默认),“tickets”,或“兼有”
选取"从下到右"(默认)或"从后到左".
可选的,主色六分法
随你便,初问候信
可选的UI语言:"en","es", "fr", “de",“pt",相接"ar"等.
可选 服务器生成的签名身份符
// 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,
}]);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 覆盖选项 。
平台专用安装指南.
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.
Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.
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" />
设置 > 一般设置 > 其他 > 全球脚本内容。 粘贴片段。 或者编辑您的模板脚本. tpl 。
创建自定义 HTML 标签,粘贴片段。触发器:所有页面。发布。
内嵌OpsIQ管理员助理 — 管理员聊天、 票箱和AI Writing — 在您的 OWN 平台的管理员面板内, 因此您的团队从不离开工具。 如访客身份和门户SSO,这是一个通用合同 执行在~15您平台服务器代码的行—— 相同的模式Zendesk,对接和对话的用途SSO。没有每个平台的插件等待:任何可以计算一个HMAC今天可以做到这一点。
从 远程站点→您的网站→代码,复制加载器行并添加到您的管理员面板的页面(脚本包括,布局模板,或只包含管理员的自定义-JS框)中:
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>
只有您的应用程序知道哪个管理员是签名的——这不是一个缺点,而是安全模式。 您的服务器从自己的会话中生成一个短命的签名符, 和访问者身份符号完全一样, 用同一个网站的网络库秘密签名:
<?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) 来完成的。 这两个会话都只是他们的站台方言中的这个契约 — 复制到最接近您堆栈的读取 。
当你的OpsIQ连接器将您的身份端点存储于其中 admin_identity_probe_url 设置, PLAIN 加载器行是您需要的所有管理页面:部件从连接器中发现探测器,用您的站点密钥+部件令牌调用它,并自动认证每个管理者。该页面仍可用一个 data-identity-endpoint 属性或 window.OpsIQAdminIdentityEndpoint.
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,在你的员工中签名 打印同样的代码 与您的网站密钥 和填写的秘密。
Install the Option 1 hook as includes/hooks/opsiq_tracker.php.
Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.
/* 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. */
In Botble admin → Custom JS, add: <script async src="https://YOUR-BOTBLE-SITE/opsiq-botble-bridge.php?op=admin_embed"></script>
Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.
<!-- 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>
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.
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).
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.
<?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>';
}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.
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.
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.
<?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');
* }
*/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.
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.
Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.
/* 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>';
});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.
adminRouter.use(opsiqAdminChat) on your ADMIN routes, after your session middleware; adjust isStaff(). It answers the refresh and sets res.locals.opsiqAdminChatTag.
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 — 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 };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.
Call init_opsiq_admin_chat(app) where you create the app, and adjust is_staff().
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 — 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))}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.
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.
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.
# 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)}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.
In Program.cs after app.UseAuthentication(): app.Use(OpsiqAdminChat.Refresh); staff = users in the "Admin" role (adjust).
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 — 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>";
}
}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.
include OpsiqAdminChat in your admin base controller; adjust opsiq_staff.
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 — 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
endNo 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.
Replace staff() with your admin lookup. The filter answers the refresh; @ControllerAdvice exposes opsiqAdminChatTag to views.
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 — 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>";
}
}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.
Replace staff() with your session lookup and wrap your admin router: OpsiqAdminChatRefresh(adminMux).
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 — 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(Botble,Bagisto,自定义应用程序),而你的端点是一个独立的文件,它将脚踏出框架来读取已登录的管理员,那么三个细节会节省你的时间——每个都在其学习前产生了真正的生产失败:
您的服务提供商可能会解决 request 装入容器时,Laravel的生命周期将捕获的请求绑在内部 Kernel::handle() ——照亮该顺序: $app->instance('request', Request::capture()) 之前,我们 $kernel->bootstrap(),或者你得到的,我给你 "目标类[请求]不存在".
现代 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的步标.
<?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.
<?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 ——你会看到失败的一步。在拉拉维尔,这几乎总是上面的要求绑定或饼干前缀的项目。
经典分拆, 您的符号缺少了 TOP - 水平 authenticated 旗帜 —— 部件本身的端点接受符号, 聊天流后面的共享验证符拒绝它。 添加 "authenticated" => true beside exp.
令牌已验证,但其用户名 + 电子邮件不匹配。 OpsIQ 添加代理在. OpsIQ → 团队,或将平台电子邮件添加到该代理的匹配-电子邮箱列表时,它与他们的不同 OpsIQ 电子邮件。
CORS 预飞正在拒绝您请求的其中一个标题。 您的端点必须回答 。 OPTIONS 并回放请求的来源,或者简单地避免自定义头条——部件只需要饼干.
检查 exp: 指使符按设计是短寿命的。 部件自动重检, 所以通常意味着结束点停止看到会话—— 应用键旋转、 会话驱动器改变或 cookie- domain 改变 。
身份将匿名访客与已知客户联系起来。OpsIQ 链接浏览历史、聊天和客户简介的门票。
你告诉部件 谁是来访者与平地JavaScript对象。它会填充访问者日志上的电子邮件和客户身份标识,所以您的仪表板显示已签名的流量和会话合并。这是一个HINT:任何人都可以在浏览器中编辑它,所以OpsIQ从不发布数据 说明它的强度。
您的服务器用网站隐藏的秘密 签了一个短命的代号。OpsIQ验证签名, 然后只将当事人视为一个被证明的客户。 这是在客户聊天和连接器查询中解锁账户答案的关卡。 用它来做任何陌生人不能看到的东西 。
在部件脚本之前设定对象, 或者在您的应用程序知道签名人后调用( ) 。 两种表格都读取; 使用与您的页面相匹配的任意名称 。
<!-- 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>与管理部件完全相同的合同,有一个 customer 主题而不是一个 admin 一,在服务器上签名,然后传递给部件。有两个细节决定它是否被验证,两者都容易出错:
签名 $payload64,没有 $payload。签名原始的 JSON 生成一个看起来正确的符号,每次以签名不匹配的方式被拒绝。
翻译 +/ 改为 -_ 脱去 = 平地基64在今天幸存下来;基地基 64url是合同,也是每个OpsIQ验证器和参考连接器发出.
边上 site_key, iat 财务报告和已审计财务报表 exp你断言一个真正的人类 被登录,和OpsIQ没有它,就拒绝代币。
仅携带电子邮件的符号被验证为签名, 然后默默地丢弃。 总是发送一个 ID 。
分钟到小时。 符号是会话断言, 不是存储的证书 。
<?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>';客户主体,通过为 identity_token 。可选:有片段 A 和连接器的聊天已经验证客户本身(有证据的预订或订购号码,或订单前的电子邮件编码)。远程网站、代码、 C 生成代码,用于自动识别已登录在您网站上的客户。
管理员,转给opsiq/embed/admin_widget.php。 相同的符号, 不同的主题密钥。 请参看“ 后端的 Admin 部件 ” 。
更严格的变式:相同的索赔加上jti和单-使用:ret,以及a120- 第二次生命,因为信使 旅行在一个URL设置、 支持 Portal 有您语言的准备片段, 当您的账户区域运行于此服务器时, 平台会为您薄荷它 。
他们成为匿名 直到他们再次被确认。OpsIQ将新的匿名记录与客户简介链接,当提示或符号到达时。
这是等级1/ 职等2拆分。未签名的提示会填入访问者日志,其他则不填入。账户答案需要经过验证的签名。
将一个已经签入您的应用程序的客户直接送到您的支持门户, 并签名, 没有第二个密码。 此页面解释交接工作如何进行, 每个平台的每个请求、 设置和完整路径。 设置、 支持门户打印相同的代码, 包含您自己的门户地址和工作空间密钥 。
例如,链接点位于您服务器上的一条小路由 /support-portal. 从未在已经包含一个符号的链接中:一个页面中的符号会通过页面来源,浏览器历史和指针头泄露出.
其内容是客户自会话。未签名的访客将先发送到您的登录,然后返回路线。
一个标准的 HS256 JWT 与这个工作空间的签名密钥签约, 只有您的服务器持有该密钥 。 它在之后过期 。 120 秒,并可以使用一次。
在门户网页上,当门户要求一个时,客户就来自这个网页(例如:opsiq_portal_return, 仅接受在您的门户网站地址内),否则,该门户网站将包含“参考政策”:不引用和“缓存控制”:无存储。
检查签名、 工作空间密钥、 过期和一次性的 ID。 客户端通过电子邮件找到或创建, 并且其现有请求都符合 。
您的工作空间密钥。 即使签名正确, 给另一个工作空间的令牌也会被拒绝 。
已发行并过期, 以秒计。 传送门标志存在 120 秒:它只需要在一次转动中活过一次。
你的应用程序声明,它真的签了这个人。
随机的ID和一次性的旗帜。 无法两次使用相同的链接 。
客户的免费标签(php, wordpress, whmcs.),在客户简介中显示.
两者都需要。 ID 是您的应用程序的客户身份; 电子邮件是门户网站如何找到客户并匹配其请求的 。
可选显示名称和 ID OpsIQ 存储在您的平台上。
设置、 支持门户、 无法连接的应用程序 。 选择您的应用程序运行在什么上; 列表下面的代码有您输入的门户地址和工作空间密钥, 并带有该平台的编号注释 。
复制的路由包含此工作空间的签名密钥, 因此它的工作方式是粘贴的。 要将其保存在文件之外, 请设定 OPSIQ_SITE_SECRET 服务器上的(或您框架的设置) : 该值首先被使用。 永远不要将路由放入页面中 , JavaScript,移动应用程序或公共寄存器:任何持有该秘密的人都可以作为任何客户签名.
举例来说, https://your-app.com/support-portal.
门户网站工作室 登录页面 使用我的网站登录页面 您的登录页面 URL: 设置到同一路径。 opsiq_portal_return 自己和路线 使顾客回到那页,签到。
设置、 支持门户、 随地签名: 您的应用程序的注册 URL,所以从门户上签字 也从你的应用程序中签字给客户。
在同一设置页面生成一个签名的测试链接, 单独检查门户侧面, 然后打开您的路由, 而同时签名到您的应用程序 。
opsiq_whsec_YOUR_SITE_SECRET 每一个例子都寻找 OPSIQ_SITE_SECRET 服务器上首先使用(或您框架的自身设置, 在其注释中命名) , 并使用设定时的设置, 这样您可以随时将密钥移出文件, 例如在不编辑代码的情况下旋转它。 无论是哪种方式, 文件只在您的服务器上运行: 从不粘贴到网页或浏览器中 。 JavaScript,并且从不把它 在一个公共存储器, 因为任何人持有这个秘密 可以签进 作为任何你的客户或工作人员。 WHMCS 财务报告和已审计财务报表 Botble 不需要这些: WHMCS 钩子来了 隐藏的秘密,和 Botble 连接器面板将它填入桥中.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.
Save it as a page on that server, e.g. support-portal.php, and point your "Support" link at it.
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) — 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;Save the snippet as a page in your app, e.g. support-portal.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 (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.
Replace the body of $currentUser with your app's signed-in customer, and /login with your login page.
/* 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;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.
Paste the route into routes/web.php. The auth middleware sends guests to your login and back.
/* 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');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.
Paste the snippet into your theme's functions.php, or a small plugin (Code Snippets works).
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.
/* 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;
});Save part 1 as opsiq_support.php in your WHMCS root (next to clientarea.php).
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.
Save part 2 as includes/hooks/opsiq_support_link.php to add Support to the client-area menu.
/* 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,
* ]);
* });
*/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 (.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.
Paste the route after your session / passport setup. Change /login if your login page lives elsewhere.
// 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);
});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.
Replace currentUser() with your app's signed-in customer, then call supportPortal(req, res) for GET /support-portal in your server.
// 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();
}Run: pip install pyjwt (the Flask example also uses 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.
Paste into the module that creates your app. @login_required sends guests to your login view and back.
# 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 respRun: 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.
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.
# 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 respRun: 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.
Paste into Program.cs after app.UseAuthentication(). RequireAuthorization() sends guests to your login and back.
// 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();Add gem "jwt" to the Gemfile 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 (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.
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.
# 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
endAdd 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 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.
Replace currentUser() with your user lookup. With Spring Security the route must be authenticated so guests go to login and back.
// 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);
}
}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.
Replace currentUser() with your session lookup and register http.HandleFunc("/support-portal", supportPortal).
// 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 打印出相同的代码,并填入您的网站密钥。
对于一个签到的客户来说,部件 URL 携带( R)identity_token=... 在您的服务器上签名; 对于一个客人来说, 这是普通的标签。 页面中没有任何秘密: 只有一个过期的符号 。
签名、 工作空间密钥和过期。 每次聊天请求中客户都会知道, 您的连接器可以回答他们自己的订单、 预订或发票 。
它称它为 页面,它与它上opsiq_identity_refresh=1& role=客户。 您的代码回答 { “ 成功” : true,identity_token""...") 顾客被签入,或者 401 与{"成功":虚假,"login_required当它们不是时,所以在打印出任何内容之前,更新的处理器必须运行。
1小时(实例=iat +) 3600) 而不是(a) 120 秒,因为它比每个聊天请求都多,而不是一个方向。
每条消息都使用相同的同义符,直到刷新替换它.
site_key, iat, exp, 认证: 真实、 平台和客户, 并带有所需的身份和电子邮件。 同样的秘密, 相同的签名 。
opsiq_whsec_YOUR_SITE_SECRET 每一个例子都寻找 OPSIQ_SITE_SECRET 服务器上首先使用(或您框架的自身设置, 在其注释中命名) , 并使用设定时的设置, 这样您可以随时将密钥移出文件, 例如在不编辑代码的情况下旋转它。 无论是哪种方式, 文件只在您的服务器上运行: 从不粘贴到网页或浏览器中 。 JavaScript,并且从不把它 在一个公共存储器, 因为任何人持有这个秘密 可以签进 作为任何你的客户或工作人员。 WHMCS 财务报告和已审计财务报表 Botble 不需要这些: WHMCS 钩子来了 隐藏的秘密,和 Botble 连接器面板将它填入桥中.Install the Option 1 hook as includes/hooks/opsiq_tracker.php. Do not also paste the plain chat tag.
Optional: add the WHMCS connector under Connectors if you also want the chat to answer about invoices, services and tickets. Identity works without it.
/* 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. */
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.
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.
/* 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 */
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.
At the very top of every page (or your front controller), before any output: require 'opsiq-chat.php'; opsiq_chat_refresh();
Just before </body> on every page: <?= opsiq_chat_tag() ?> — it replaces the plain chat tag. Replace opsiq_chat_user() with your signed-in customer.
<?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>';
}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.
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.
In your main Blade layout, just before </body>: {!! \App\Support\OpsiqChat::tag() !!}
<?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');
* }
*/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.
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.
For WooCommerce orders in the chat, add the WooCommerce connector under Connectors.
/* 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>';
});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.
app.use(opsiqChat) after your session / passport middleware. It answers the refresh and sets res.locals.opsiqChatTag.
Print res.locals.opsiqChatTag (unescaped) just before </body> in your layout, instead of the plain chat tag.
// 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 };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.
Call init_opsiq_chat(app) where you create the app. It answers the refresh and gives templates opsiq_chat_tag.
In your base template, just before </body>: {{ opsiq_chat_tag }}
# 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))}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.
Add "yourapp.opsiq_chat.OpsiqChatMiddleware" to MIDDLEWARE (after AuthenticationMiddleware) and "yourapp.opsiq_chat.opsiq_chat" to TEMPLATES context_processors.
In your base template, just before </body>: {{ opsiq_chat_tag }}
# 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)}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.
In Program.cs, after app.UseAuthentication(): app.Use(OpsiqChat.Refresh);
In _Layout.cshtml before </body>: @Html.Raw(OpsiqChat.Tag(Context))
// 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>";
}
}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.
include OpsiqChat in ApplicationController.
In app/views/layouts/application.html.erb before </body>: <%= opsiq_chat_tag %>
# 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
endAdd 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.
Replace currentUser() with your user lookup. The filter answers the refresh on every page; @ControllerAdvice exposes opsiqChatTag to views.
Thymeleaf layout before </body>: <th:block th:utext="${opsiqChatTag}"/>
// 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>";
}
}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.
Replace currentUser() with your session lookup, and wrap your router: http.ListenAndServe(addr, OpsiqChatRefresh(mux)).
Pass OpsiqChatTag(r) to your layout template and print it before </body>.
// 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 (服务器上缺少了这个秘密,所以代码失败了关闭),或者信使的工作空间密钥或秘密不匹配.
刷新处理器没有被到达: 它必须在任何输出之前运行, 在聊天的每页上都出现 。
从模板中去掉普通聊天标签: 此代码会打印聊天本身 。
OpsIQ 提供 SDK 用于共同平台的软件包和插件。
作曲软件包:身份符号生成,动作 API 帮助者, Webhook 签名验证 。
浏览器-侧:跟踪,身份,自定义事件,聊天控制.
部件注入,来自WP用户会话的身份, WooCommerce 同步 。
完全整合:部件,出票接力,身份,管理员AI.
自动嵌入客户身份的App
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、内部执行器、活动总线和网络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.*.
使用打入的勘测。 * 动作带有工作空间键。 写出允许、 风险、 确认、 能力及干燥行为 。
将一个签名的事件发送到一个输入的 Webhook, 例如取消命令或完成登入步骤。 重放保护会复制事件ID 。
选择一个 OpsIQ 常规 API 行动,例如发出勘测邀请或准备运动,然后从经核实的触发有效载荷中绘制出场图。
将记录的工商安全调查。 * 生命周期子集以签名、过滤、重试、日志和授权重放方式传送到您的端点。
共享目录将涵盖调查/部署公布状态、受众和触发决定、邀请、提交/启动/部分/接受/完成/放弃、答复编辑、竞选状态和交付失败。
密码 OpsIQ 净 值 API 允许您在程序上访问所有平台特性。
将密钥发送为 Authorization: Bearer opq_... 或 单 X-OpsIQ-Key: opq_...。使用一个认证头,而不是两个。
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 联系人( scope crm. read) 。 Params: q, 状态, 来源, 标记, 领先分数, 限制 。
解析或创建联系人( specople crm. write). Params: 电子邮件加字段,标签,注释.
List CRM 交易( scope crm. read). Params: 状态, stage_id, company_id , 所有人_admin_id、 project_id等, 限制 。
记录联系人的生命周期/商业活动( specople crm. write) 。 参数:电子邮件或联系站_id, 事件, 值, 货币 。
记录转换( scope crm. write). Params: contact_id或email, transferation_type, value, month.
播放 CRM 事件流( scope crm. read) 。 Params: limit.
列表票 (scope protection. read). Params:页面,per_page,排序,顺序,状态,优先级,部门_id,被分配_admin_id(英语:admin-id),客户端_电子邮件(英语):搜索.
一张票及其留言(scope protection. read). Params:出票站名或票号,包括_messages,消息-限制.
张贴一张票的回执(scope protect. write). Params:出票_id或出票-数字,身体,作者_类型,作者-名称,内部.
更新出站票 (scope protection. write). Params:出站口为出站地/站点的出站站位,站位等,优先出站点,出站对象为部门_出站地点-admin_id.
开出一张支持票(scope protect. write). Params:客户_邮件,客户_名,主题,身体,优先级.
运行批量队列操作(scope prite. write). Params: operation, ids.
列出活话对话(scope division. read). Params:页面,per_page,状态,被指派_admin_id,客户端_电子邮件,搜索.
一次对话及其消息(scope difference. read). Params: conversation_id或 shead_key,包括_messages.
页面信息历史(scope difference. read). Params: conversation_id, page, per_page, including_internal. 页面中包含的文本是: 页面内容 : 网页内容 , 页面名称 :
将消息发送到对话中(scope difference. write). Params: 对话_id,消息,发件人_类型,内部.
指定,重新状态或重新标题一个对话(scope difference. write). Params: conversation_id, status, admin_id (被指派), subject.
查看安装了哪些连接器,每个连接器能做什么,以及其证书是否有效(scope connectioners. read).
您的动作构建器将运行的动作( 镜像自动化. read) 。
将发射什么,以及何种条件(镜像自动化. read).
调试集成( scope acsolutions. read) 执行历史。 参数:状态, 动作_ key 。
部门,您可前往(扫描部门. read)办理罚单。
给一个操作员的通知(scope notion. read). Params: admin_id (requested), unread_ only.
报告部分为 CSV (scope analytics.read). Params: 区域,预设,从,到. call analialyticies.sections.list for value.
被监测网站及其SEO报告(scope site_intelligence. read).
您的 Store 目录, 已页( scope commerce. read) 。 过滤器: 活动、 类别、 搜索 。 .get 返回一个带有其变体的产品。
存储命令( scope commerce. read) 。 过滤器: 状态、 支付_ 方法、 频道、 客户端_ 电子邮件。 由 order_id 或它的 ORD 引用,并带有行项。不返回 活网关 检查控件。
退款请求及其状态(scope commerce. read).
给客户定价(scope commerce. write)。 store 或连接器弹片。创建无:没有命令,没有付款。见商务部分。
客户满意程度答复作为数据(scope profess. read),按评级、票、代理或期过滤; .metrics 返回显示的同个数字。
您的访客评分的聊天对话,包括评论、导致评分和代理人信用(范围 conversations. read ) 。
通过您的帮助中心的文章( scope kb. read) 页面 。
由id所著"一则帮助中心"(scope kb. read)所出的文章. Params: profile_id.
每个事件都可以订阅一个网络终端, 并附带其有效载荷。每个计划都有可用, 这样您就可以在购买之前先建立它。
短寿命签名的附件下载链接(scope file. read). Params: reference, ttl.
询问是否 IP 或电子邮件在此被屏蔽或可疑( scope security.read) 。IP 防火墙 罚单垃圾邮件封条列表和缓存的安全AI裁决。 Params: ip 电子邮件
报告滥用所观察到的系统(scope security.write),被记录为安全事件,立即被安全AI分类,并提醒管理人员注意高风险判决。ip 电子邮件 善良 理性 来源
管理垃圾邮件规则售票管道执行(scope safety.write/security.read),与车票页面"Block发件人"控件相同。 Params: skind(电子邮件,域名,ip),数值,理由,过期_小时.
每个列表动作都使用相同的参数,所以你一次学习.
开始的页数1默认 50 最大值为 200 如果喜欢,则也接受限制和抵销。
要排序的字段, 以及 asc (默认 desc) 。 每个动作接受一组固定的排序字段; 其他的字段中都会忽略而不是错误 。
将过滤器作为对象发送,或将过滤取出作为顶级参数。未知的过滤器会被忽略。
条目、页面、每页、计数、总数和多页。请继续请求页面,直到有页页、多页为假。
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"
}没有发送密钥, 或密钥错误或过期。 HTTP 401.
密钥是有效的, 但缺少此动作需要的范围 。 HTTP 403.
密钥是只读的, 否则此动作不在其允许列表中 。 HTTP 403.
没有这样的动作。 调用当前列表的元动作 。 HTTP 400.
缺少所需的参数, 或不接受一个值。 HTTP 400.
记录不存在, 或没有在工作空间中此密钥可以看到 。 HTTP 404.
您的计划不包括此动作所属的特征。 实体名称为 feature,该 plan_name 生效和有效 upgrade_url。重试将无济于事;计划必须改变。402.
安装的许可证不活动, 因此在恢复前不会运行任何动作. HTTP402.
商业特有:商店已售出已关机,因此无法引用或订购. HTTP.400.
此密钥的小时限制被使用 。 HTTP 429.
我们这边的某件事失败。 如果您需要报告, 请求_ id 识别尝试 。 HTTP 500.
如果写出时间, 您无法判断是否降落。 发送一个 idempotency_key 重复一次同一个呼叫,返回原结果而不是两次工作。
{
"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时间戳). 注意剩余并慢下来,然后你跑出而不是等待被拒绝.
A 类 429 意思是再试一次 401 表示密钥本身是错误的或过期的,所以重试在修复密钥之前不会有所帮助.
重复一次失败的尝试IP有效的密钥永远不会绊倒它。
退后,当剩余 变得低, 荣誉重试之后 429 而不是立即重试。
v1. 每一份答复都载有X-OpsIQ-API- 维生和X...OpsIQ-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}每个都是一个完整的,可操作的 真正的整合而不是一个碎片。
规则在任何地方都是一样的: 继续要求下一页,直到 has_more 完全是假的,别总猜
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"])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
$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"]));分会 code,从不考虑 error。这个包装纸是整个合同的一元。
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
// (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没有这个功能——没有钥匙可以解锁它,计划必须改变.
不是瞬间,是浮出水面 upgrade_url 给拥有账户的人而不是再找回
范围表示关键发行人的授权内容;计划表示账户购买的内容。402计划缺少的特色。
电话 feature 每项行动需要在下文和下文的行动目录中公布。 meta.action,因此可以在建设时检查,而不是在生产中发现.
准确看钥匙位置的最快捷的方法是 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"
}
}
}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。答复中是这样说的。 ordering.
如果店铺已经关门了, 引用答案 selling_paused 而不是给别人买的货定价
几乎你需要的都是一个POST /api/v1.php. 这些是例外, 以及每个例外的目的。
机器合同和人类参考文献,不需要钥匙,你可以先去探索,再有钥匙。
服务器发送事件,用于生成实时聊天回复。JSON行动。
较旧的AI写结尾。它所做的一切也可用作为 writing.* 行动/api/v1.php,这也是新的工作应该去的地方。
草稿,重写和分解 用于嵌入在您自己的管理器的票箱。
网站情报作为小的 RESTAPI——站点,爬行,出问题,关键词,收入 ——供CI管道在部署后想开始爬行并读取结果.
连接的平台 POST 将自己的网络点击给您。 当您启用连接器时, 将刻出此符号 。
集成引擎:运行和确认动作,以及摄取销售、身份和出行事件。它使用自己的钥匙类型,在“E”下发行。APIWebhook 构建器( W).
此列表来自运行中的目录, 因此它总是与您所打开的版本相匹配 。 meta.actions 返回与 JSON.
Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Disable
Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Enable
Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Recovery Regenerate
Read. Scope: administration.read, admin. Contract: route_inferred. Admin 2fa Setup
Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin 2fa Status
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Ai Train From Reply
Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Brain Cancel
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Brain View
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Access Check
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Create Ticket On Behalf
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Draft Ticket From Thread
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Delete
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Get
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv List
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv New
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Save
Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Notification Prefs Get
Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notification Prefs Save
Read. Scope: administration.read, admin. Contract: route_inferred. Admin Notifications List
Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notifications Mark All Read
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Mark Read
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Pulse
Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Online List
Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Presence Ping
Write. Scope: administration.write, admin. Contract: route_inferred. Admin Realtime Token
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Add Widget
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Connectors Catalog
Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Data
Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export
Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export Csv
Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Import
Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Report
Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Delete
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Segments List
Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Save
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Status
Write. Scope: analytics.write, admin. Contract: declared_dynamic. Replay Clear All
Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Compute
Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Create
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Create
Write. Scope: analytics.write, admin. Contract: route_inferred. Report Create
Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Delete
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Delete
Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Delete
Write. Scope: analytics.write, admin. Contract: route_inferred. Report Delete
Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Events
Read. Scope: analytics.read, admin. Contract: source_inferred. Analytics Export
Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Get
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Layout Save
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Ab Test List
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Dashboard List
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Funnels List
Read. Scope: analytics.read, admin. Contract: declared_dynamic. Report List
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Remove Widget
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Rename
Read. Scope: analytics.read, admin. Contract: route_inferred. Ab Test Results
Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Save
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Save Widgets
Read. Scope: analytics.read, admin. Contract: explicit. List scheduled analytics reports for an operator Required fields: admin_id.
Read. Scope: analytics.read, admin. Contract: explicit. List analytics report sections and date presets
Write. Scope: analytics.write, admin. Contract: route_inferred. Report Send Now
Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Sessions
Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Step Visitors
Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Timeline
Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Toggle Shared
Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Update
Write. Scope: analytics.write, admin. Contract: route_inferred. Report Update
Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Widget Data
Read. Scope: automations.read, admin. Contract: explicit. List integration actions
Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Delete
Read. Scope: automations.read, admin. Contract: route_inferred. Workflow List
Read. Scope: automations.read, admin. Contract: explicit. List automation execution history
Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Save
Read. Scope: automations.read, admin. Contract: explicit. List integration triggers
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Call Start
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Cobrowse Send
Read. Scope: chat.read, admin. Contract: route_inferred. Chat Feedback
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Feedback Digest
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Delete
Read. Scope: chat.read, admin. Contract: route_inferred. Chat Form Get
Read. Scope: chat.read, admin. Contract: declared_dynamic. Chat Form List
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Save
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Set Default
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Decide
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Outcome Set
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Delete
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Save
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Types List
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meetings List
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Online Admins
Write. Scope: admin. Contract: route_inferred. Chat Permissions List
Write. Scope: admin. Contract: route_inferred. Chat Permissions Revoke
Write. Scope: admin. Contract: route_inferred. Chat Permissions Save
Write. Scope: admin. Contract: route_inferred. Chat Permissions Upload Avatar
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Reaction Toggle
Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Add Retry-safe with idempotency_key.
Read. Scope: chat.read, admin. Contract: explicit. List workspace and personal saved replies
Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Save Retry-safe with idempotency_key.
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Set Persona
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Clear
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Set
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Transfer Thread
Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Transfer Unread
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Typing Preview
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Ai Summary
Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Controls
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Delete Room
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper List
Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Mentions
Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Rooms
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Save Controls
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Send
Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Targets
Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Unread
Read. Scope: commerce.read, analytics.read, admin. Contract: explicit. Read privacy-safe storefront analytics
Read. Scope: commerce.read, admin. Contract: explicit. Get one Store order with its line items
Read. Scope: commerce.read, admin. Contract: explicit. List Store orders in the bound workspace
Read. Scope: commerce.read, admin. Contract: explicit. List storefront pages and promotional modals
Read. Scope: commerce.read, admin. Contract: explicit. Get one Store product with its variants Required fields: product_id.
Read. Scope: commerce.read, admin. Contract: explicit. List Store products in the bound workspace
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.
Read. Scope: commerce.read, admin. Contract: explicit. Check demo readiness and merchant go-live readiness
Read. Scope: commerce.read, admin. Contract: explicit. List Store refund requests in the bound workspace
Read. Scope: commerce.read, admin. Contract: explicit. Discover Store themes, designs, blocks and promotional shells
Read. Scope: commerce.read, admin. Contract: explicit. Get the bound workspace storefront configuration
Read. Scope: admin. Contract: route_inferred. Email Auth Check
Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Delete
Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Save
Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Send
Read. Scope: communications.read, admin. Contract: declared_dynamic. Push Campaigns List
Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Delete
Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Drafts List
Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Save
Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Send
Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Delete
Read. Scope: communications.read, admin. Contract: route_inferred. Email Mailboxes List
Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Poll
Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Save
Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Test
Write. Scope: communications.write, admin. Contract: declared_dynamic. Email Pipe Regen Token
Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Platform List
Write. Scope: communications.write, admin. Contract: route_inferred. Email Platform Send
Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Settings Get
Write. Scope: communications.write, admin. Contract: route_inferred. Email Settings Save
Read. Scope: communications.read, admin. Contract: route_inferred. Email Settings Test
Write. Scope: communications.write, admin. Contract: declared_dynamic. Push Vapid Generate
Read. Scope: connector_builder.read, admin. Contract: explicit. Export a generated connector Required fields: slug.
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Generate a connector package Required fields: spec.
Read. Scope: connector_builder.read, admin. Contract: route_inferred. Load a Builder specification Required fields: slug.
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import cURL into Connector Builder
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import OpenAPI into Connector Builder
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import Postman into Connector Builder
Read. Scope: connector_builder.read, admin. Contract: declared_dynamic. List Builder connectors
Read. Scope: connector_builder.read, connectors.read, admin. Contract: source_inferred. List Connector Builder profiles and capability contracts
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Run Builder conformance tests Required fields: slug.
Write. Scope: connector_builder.write, admin. Contract: route_inferred. Update a generated connector Required fields: slug, spec.
Read. Scope: connector_builder.read, admin. Contract: route_inferred. Validate a Builder specification Required fields: spec.
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Action
Write. Scope: connectors.write, admin. Contract: route_inferred. Start connector backfill Required fields: slug.
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Backfill
Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector backfill status Required fields: slug.
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Backfill Status
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Actions
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Draft
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Handler
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Map
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Delete
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Dry Run
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Generate
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Curl
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Openapi
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Postman
Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder List
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Load
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Apply
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Link
Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Marketplace Status
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Submit
Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Schema
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test Action
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Update
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Validate
Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Contacts Import
Read. Scope: connectors.read, connector_builder.read, admin. Contract: source_inferred. Read the canonical connector capability contract
Write. Scope: connectors.write, admin. Contract: route_inferred. Synchronize connector customers Required fields: slug.
Write. Scope: connectors.write, admin. Contract: route_inferred. Disable a connector Required fields: slug.
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Disable
Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Department
Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Email Account Remove
Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Routing
Write. Scope: connectors.write, admin. Contract: route_inferred. Enable a connector Required fields: slug.
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Enable
Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Get
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Get
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Install
Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connector Integrity Scan
Read. Scope: connectors.read, admin. Contract: explicit. List installed connectors and capabilities
Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors List
Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Oauth Start
Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector settings Required fields: slug.
Write. Scope: connectors.write, admin. Contract: route_inferred. Save connector settings Required fields: slug, settings.
Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Shared Oauth Delete
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Sync Customers
Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Test
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Test
Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Uninstall
Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Workflow Recipes
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Draft
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Rewrite
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Archive
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Assign
Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Assignees
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Bulk
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear All
Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Customer Tickets
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Decline
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete Last
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Edit Last
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Export
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Forget Visitor
Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Get
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat History
Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations List
Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Messages
Read. Scope: conversations.read, admin. Contract: explicit. List rated Client Chat conversations
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Resolve
Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Saved Replies
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Add
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Ai Generate
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Delete
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Save
Write. Scope: conversations.write, admin. Contract: source_inferred. Conversations Send Retry-safe with idempotency_key.
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Send
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Tags Set
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Thread
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Threads
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Attachments
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Call Button
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Typing
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Unarchive
Write. Scope: conversations.write, admin. Contract: explicit. Update a conversation status, assignment or subject Retry-safe with idempotency_key.
Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Upload
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ab Results
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Access Set
Read. Scope: admin. Contract: source_inferred. Crm Access Log List
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health Board
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Account Health Refresh
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plans Due
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Account Timeline
Read. Scope: crm.read. Contract: explicit. List CRM contact activities
Write. Scope: crm.write. Contract: explicit. Record a CRM contact activity Required fields: contact_id, activity_type. Retry-safe with idempotency_key.
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Activity Feed
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Agent Toggle
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Simulate
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ai Trace
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Decide
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Delegate Set
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Approval List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Settings
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Apply
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Approve List
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Reject
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Update
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ask
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Assign Owner
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Assignment Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Assignment Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Delete
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Attachment List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Upload
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autobook Meeting
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autodeal Mode
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Book Meeting
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Booking Link Save
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Booking Links List
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Apply
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build Get
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build List
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Plan
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Rollback
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Bulk
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Bundle Set
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Calendar Status
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Capture Status
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Save
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Command Snapshot
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Companies List
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Hierarchy
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Company Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Company Set Parent
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Suggest Related
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Connectors Catalog
Read. Scope: crm.read. Contract: source_inferred. Crm Consent Log List
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Contact Churn
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Draft Email
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Enrich
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Propose Email
Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Detail
Write. Scope: admin. Contract: source_inferred. Crm Contacts Erase Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Export
Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Import List
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Import Run Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Contacts List
Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Next Action
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Chat Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Ticket Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Resync Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Save Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Send Email Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: explicit. Crm Contacts Upsert Required fields: email. Retry-safe with idempotency_key.
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Amend
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Price Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Usage
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contracts List
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Conversation Intel
Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Conversions Goals List
Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Save Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Conversions List
Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Record Retry-safe with idempotency_key.
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Create Video Meeting
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Customer Auto Sync
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Auto Sync Status
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Emails
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Payments
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Bulk Propose
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Data Steward Inbox
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Propose
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Advance
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Coach
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Coach Action
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Deal Splits Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Splits Set
Write. Scope: crm.write. Contract: explicit. Advance a CRM deal to another stage Required fields: deal_id, stage_id. Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: explicit. Create a CRM deal Required fields: title. Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: explicit. Get one CRM deal Required fields: deal_id.
Read. Scope: crm.read. Contract: explicit. List CRM deals
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deals List
Write. Scope: crm.write. Contract: explicit. Update a CRM deal Required fields: deal_id. Retry-safe with idempotency_key.
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Detail
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Draft Outreach
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Enrich Account
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Erase
Read. Scope: crm.read. Contract: explicit. List subscribable CRM domain events
Read. Scope: crm.read. Contract: explicit. List durable CRM domain events
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Export
Read. Scope: crm.read, admin. Contract: route_inferred. Contact Export All
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Add
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Remove
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Fields List
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forecast Board
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Forecast Snapshot
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Form Save
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forms List
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Repair Catalog
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Health Smoke
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Snapshot
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Home Persona Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Save
Read. Scope: crm.read, admin. Contract: route_inferred. Contact Import List
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Import Run
Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Activity
Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Endpoints List
Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Save Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Test Retry-safe with idempotency_key.
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Leaderboard
Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Evaluate Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Lifecycle Rules List
Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Save Retry-safe with idempotency_key.
Read. Scope: crm.read, admin. Contract: route_inferred. Contacts List
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Mailbox Status
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Book
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Cancel
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Meeting List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Accept
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Reject
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Merge
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Message Send
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Delete
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Messaging Provider Test
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Messaging Status
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Next Action
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Object Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Objects List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Pull
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Push
Read. Scope: crm.read, admin. Contract: route_inferred. Contact Open Chat
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Open Ticket
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Campaigns List
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Save Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Send Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Send Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates List
Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates Preview
Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Save Retry-safe with idempotency_key.
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Payments Status
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Pipeline Data
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Price Resolve
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Entry Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebooks List
Read. Scope: crm.read. Contract: source_inferred. Crm Privacy Settings Get
Write. Scope: admin. Contract: source_inferred. Crm Privacy Settings Save Retry-safe with idempotency_key.
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Product Archive
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Product Revenue
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Product Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Products List
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Propose Meeting
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Propose Outreach
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Prospecting Dashboard
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Icp Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Import
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Research
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Score
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Sequence
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Qualification Checklist Get
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Qualification Checklist Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quota Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quote Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quote Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quotes List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Delete
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Fields Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Fields Save
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Get
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record History
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Unset
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Shares
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Records List
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Restore Email Consent
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Resync From Platform
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Retention Catalog
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Revert
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Get
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Remote Wipe
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Runtime Policy Save
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Ai
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Delete
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Scoring Rule List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Save
Write. Scope: crm.write. Contract: source_inferred. Crm Segments Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Segments List
Read. Scope: crm.read. Contract: source_inferred. Crm Segments Members
Read. Scope: crm.read. Contract: source_inferred. Crm Segments Preview
Write. Scope: crm.write. Contract: source_inferred. Crm Segments Save Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Accept Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Dismiss Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Segments Suggestions List
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Semantic Search
Write. Scope: crm.write, admin. Contract: route_inferred. Contact Send Email
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Email
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send For Signature
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Payment Link
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sequence Action
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Sequence Runs
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Setup Status
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Get
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Save
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Subject Registry
Read. Scope: crm.read, admin. Contract: route_inferred. Crm Subscriptions List
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Subscriptions Rollup
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Subscriptions Sync
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Task Create
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Tasks List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Parent Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Rules Set
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Save
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Teams List
Write. Scope: crm.write, admin. Contract: route_inferred. Crm Territory Set
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Video Status
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Delete
Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Views List
Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Save
Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: explicit. List CRM outbound webhook endpoints and recent deliveries
Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Save Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Test Retry-safe with idempotency_key.
Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Delete Retry-safe with idempotency_key.
Read. Scope: crm.read. Contract: source_inferred. Crm Workflows List
Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Save Retry-safe with idempotency_key.
Write. Scope: customers.write, journey.write, admin. Contract: route_inferred. Analyze a customer journey with AI Required fields: client_id.
Read. Scope: admin. Contract: route_inferred. Cdp Behaviour
Write. Scope: admin. Contract: route_inferred. Cdp Behaviour Analyze
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Embed Backfill
Read. Scope: customers.read, admin. Contract: declared_dynamic. Client Chat Embed Status
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Ai Generate
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Approve All
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Delete
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Delete All
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Export
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Generate
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Import
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq List
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Save
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help All
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Status
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Grant Upload
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Help Set Slug
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Crawl Step
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Delete
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete All
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete Duplicates
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Duplicates
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Export Json
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Import Json
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Preview
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Recrawl
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Test Url
Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Revoke Upload
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Agent Avatar
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Ai Avatar
Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Icon
Write. Scope: admin. Contract: route_inferred. Cdp Client Analyze
Write. Scope: admin. Contract: route_inferred. Cdp Client Delete
Write. Scope: admin. Contract: route_inferred. Cdp Client Export
Read. Scope: admin. Contract: route_inferred. Cdp Client Journey
Write. Scope: customers.write, admin. Contract: route_inferred. Cdp Client Prepare Outreach
Read. Scope: admin. Contract: route_inferred. Cdp Clients List
Read. Scope: customers.read, admin. Contract: route_inferred. Client Detail
Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. Get a customer profile Required fields: client_id.
Read. Scope: customers.read, journey.read, admin. Contract: route_inferred. Get a complete customer journey Required fields: client_id.
Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. List known customers
Write. Scope: customers.write, crm.write, admin. Contract: route_inferred. Prepare CRM outreach for a customer Required fields: client_id.
Read. Scope: departments.read, admin. Contract: source_inferred. Departments List
Write. Scope: email.write, admin. Contract: source_inferred. Send one governed workspace email template Required fields: template, to. Retry-safe with idempotency_key.
Read. Scope: email.read, admin. Contract: source_inferred. List email templates available to this workspace
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Autowinner
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Bandit
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Address Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Address Save
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Agent
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Analyze
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Compile Profile
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Copy
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Critique
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Decide
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Design
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Edit
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Generate
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Ideas
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image Edit
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Localize
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Logo
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Media Jobs
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Narrative
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Responsive
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Variants
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Start
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Status
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Decide
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Request
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Approvals List
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Upload
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Assets List
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Materialize
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Save
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Audience Test
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Audit Export
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Autoresponder Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Autoresponder Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Delete
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Bank List
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Used
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Blackouts Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Blackouts Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Bootstrap
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Font Upload
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Brand Kit Get
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Brand Kit Get
Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Brand Kit Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Brand Kit Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Archive
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Delete
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Duplicate
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Launch
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign List
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Pause
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Preview
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Publish
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Rollback
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Toggle
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Versions
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Comment Add
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Add
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Delete
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Comments List
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Comments List
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Resolve
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Connectors Catalog
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Coupon Providers
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Clear
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Coupons Stats
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Upload
Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Delete
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Analytics
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Dashboard
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Promote
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Publish
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Status
Read. Scope: engagement.read, admin. Contract: route_inferred. Campaign Detail
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Digest Save
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Feed Catalog
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Feed Items
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Geo Preview
Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Idle Cron Set
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Create
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Replay
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads Export
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads List
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Announcements List
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Tours List
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Ai Live
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Custom Html
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Enabled
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Module Status
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Onsite Preview
Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Pause All
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Presence
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Preview Share
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Push Draft
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Issue
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Recipients List
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Revoke
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Response Detail
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Responses Browse
Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Save
Read. Scope: engagement.read, admin. Contract: route_inferred. Proactive Rule Stats
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Rule Test
Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Toggle
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Proactive Rules List
Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Save
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Stats
Read. Scope: engagement.read, admin. Contract: route_inferred. Tour Stats
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio A11y
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Generate
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Insights
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Target
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Archive
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio Assets
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Create
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Duplicate
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Studio Event
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Governance
Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio List
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview Link
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Publish
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Rename
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Revert
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Draft
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Targeting
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Active
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Status
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Tpl Preview
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Upload
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Webhook
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Targeting Simulate
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Apply
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Template List
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Save Custom
Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Toggle
Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Toggle
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Trigger Set Save
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Delete
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Variant List
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Promote
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Save
Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Version Compare
Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Version Get
Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Version Label
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Delete
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Replay
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Run
Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Save
Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Analytics
Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Detractors
Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Get
Write. Scope: feedback.write, admin. Contract: explicit. Ingest a feedback record or external review
Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback List
Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Overview
Read. Scope: feedback.read, admin. Contract: explicit. List Voice of Customer feedback sources
Write. Scope: feedback.write, admin. Contract: source_inferred. Feedback Update Retry-safe with idempotency_key.
Read. Scope: files.read, admin. Contract: source_inferred. Files Get
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.
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.
Read. Scope: hr.read, admin. Contract: route_inferred. What actually happened at a step (permitted, executed, proven, failed, compensated) Required fields: run_uuid, seq.
Write. Scope: hr.write, admin. Contract: route_inferred. A human takes an agent run; no further agent steps are accepted Required fields: run_uuid.
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.
Read. Scope: hr.read, admin. Contract: declared_dynamic. List the registered typed tools an agent may use, and open agent incidents
Write. Scope: hr.write, admin. Contract: declared_dynamic. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing
Read. Scope: hr.read, admin. Contract: declared_dynamic. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception
Write. Scope: hr.write, admin. Contract: declared_dynamic. Release booking slots whose claim never became a booked meeting
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.
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.
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.
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.
Write. Scope: hr.write, admin. Contract: route_inferred. Provision seatless employee access and send the invitation Required fields: person_uuid.
Write. Scope: hr.write, admin. Contract: route_inferred. Lift an employee access suspension (written reason required) and provision again Required fields: person_uuid, reason.
Read. Scope: hr.read, admin. Contract: route_inferred. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys
Read. Scope: hr.read, admin. Contract: declared_dynamic. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage
Read. Scope: hr.read, admin. Contract: route_inferred. List a person's identity facets and open conflicts Required fields: person_uuid.
Write. Scope: hr.write, admin. Contract: route_inferred. Link an identity facet to a person Required fields: person_uuid, facet_type, facet_key.
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.
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.
Write. Scope: hr.write, admin. Contract: route_inferred. Pause a live interview Required fields: media_uuid.
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.
Read. Scope: hr.read, admin. Contract: route_inferred. Read an interview room, including whether the AI is actually participating Required fields: media_uuid.
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.
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.
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.
Read. Scope: hr.read, admin. Contract: declared_dynamic. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests
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.
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.
Read. Scope: hr.read, admin. Contract: declared_dynamic. Read courses, paths and enrolments
Read. Scope: hr.read, admin. Contract: declared_dynamic. Read leave types and requests
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
Read. Scope: hr.read, admin. Contract: declared_dynamic. Read HR connector accounts, conflicts and deliveries
Read. Scope: hr.read, admin. Contract: declared_dynamic. Read the organisation tree
Write. Scope: hr.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.
Read. Scope: hr.read, admin. Contract: route_inferred. Get one HR person Required fields: person_uuid.
Read. Scope: hr.read, admin. Contract: declared_dynamic. List HR people
Write. Scope: hr.write, admin. Contract: route_inferred. Update an HR person Required fields: person_uuid, display_name, primary_email.
Read. Scope: hr.read, admin. Contract: declared_dynamic. List job postings
Read. Scope: hr.read, admin. Contract: declared_dynamic. Run the HR release readiness report
Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the four HR release gates (schema, manifest, probe, readiness)
Write. Scope: hr.write, admin. Contract: route_inferred. Create a requisition Required fields: title, openings, justification.
Read. Scope: hr.read, admin. Contract: declared_dynamic. List requisitions
Write. Scope: hr.write, admin. Contract: route_inferred. Delete a workforce conversation; refused while it is under legal hold Required fields: thread_uuid, reason.
Write. Scope: hr.write, admin. Contract: route_inferred. Place or lift a legal hold on a workforce conversation Required fields: thread_uuid, on, reason.
Write. Scope: hr.write, admin. Contract: route_inferred. Set a conversation's retention class (standard|extended|permanent) Required fields: thread_uuid, retention_class.
Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the conversation retention sweep; legal holds are never swept
Write. Scope: intent.write, admin. Contract: declared_dynamic. Intent Clear
Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read the intent funnel
Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel Aggregate
Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel
Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read intent summaries
Read. Scope: intent.read, admin. Contract: route_inferred. Intent Summary
Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Delete Retry-safe with idempotency_key.
Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Generate Retry-safe with idempotency_key.
Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Import Retry-safe with idempotency_key.
Read. Scope: kb.read, read, admin. Contract: source_inferred. Kb Faq List
Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Save Retry-safe with idempotency_key.
Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Set Status Retry-safe with idempotency_key.
Read. Scope: kb.read, admin. Contract: route_inferred. Help Analytics Get
Write. Scope: kb.write, admin. Contract: route_inferred. Help Analytics Toggle
Read. Scope: kb.read, admin. Contract: route_inferred. Help Article Ai Refine
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Class Bulk
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Delete
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Publish
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Save
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Category
Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Public
Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ai Generate
Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Bulk Delete
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Articles Count
Read. Scope: kb.read, admin. Contract: explicit. Get one Help Center article Required fields: article_id.
Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ids
Read. Scope: kb.read, admin. Contract: route_inferred. Help Articles List
Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Set Public All
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Ai Merge
Write. Scope: kb.write, admin. Contract: route_inferred. Help Categories Bulk Delete
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Categories List
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Merge Dupes
Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Delete
Read. Scope: kb.read, admin. Contract: route_inferred. Help Category Get
Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Save
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Article Image Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Favicon Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Dark Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Dark Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Og Image Upload
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Settings Get
Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Settings Save
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Dark Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Estimate
Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Translate Run
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Translate Status
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Stop
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Hero Upload
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Icon Upload
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Deliver Notifications
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Moderate
Read. Scope: kb.read, admin. Contract: route_inferred. Kb Comments Moderation List
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Batches
Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Import Connectors
Read. Scope: kb.read, admin. Contract: route_inferred. Kb Import Csv Preview
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Preview
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Resync
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Run
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Undo
Write. Scope: kb.write, admin. Contract: route_inferred. Help Insights Generate
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Insights Get
Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Mark Reviewed
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Dismiss
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Draft Article
Read. Scope: kb.read, admin. Contract: route_inferred. Kb Missed List
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Mark Published
Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Missed Refresh
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Descriptions
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Status
Write. Scope: kb.write, admin. Contract: route_inferred. Help Organize Step
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Publish
Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Reformat Revert
Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Reformat Status
Write. Scope: kb.write, admin. Contract: route_inferred. Help Reformat Step
Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Review Queue
Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Search Gaps
Write. Scope: kb.write, admin. Contract: route_inferred. Help Set Featured
Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Set Visibility
Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Allocate
Read. Scope: kb.read, admin. Contract: route_inferred. Help Subdomain Check
Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Release
Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Taxonomy Organize
Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Taxonomy Status
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Taxonomy Step
Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Categories
Write. Scope: kb.write, admin. Contract: route_inferred. Kb Widget Publish
Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Targets
Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Delete a lead Required fields: lead_id.
Write. Scope: leads.write, admin. Contract: route_inferred. Lead Delete
Read. Scope: leads.read, crm.read, admin. Contract: route_inferred. List leads
Read. Scope: leads.read, analytics.read, admin. Contract: declared_dynamic. Get lead statistics
Read. Scope: leads.read, admin. Contract: declared_dynamic. Leads Stats
Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Update a lead Required fields: lead_id, status.
Read. Scope: none. Contract: explicit. Get one General API action contract Required fields: name.
Read. Scope: none. Contract: explicit. List the complete General API contract
Read. Scope: none. Contract: explicit. Describe the authenticated API key and active workspace
Read. Scope: none. Contract: explicit. List API scopes and the actions protected by each scope
Read. Scope: notifications.read, admin. Contract: source_inferred. Notifications List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Add Announcement
Write. Scope: platform.write, admin. Contract: route_inferred. Add Kb Article
Write. Scope: platform.write, admin. Contract: route_inferred. Add Todo Item
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Action Lookup
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Anomaly Detect
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Add
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Edit
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain List
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Pin
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Status
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Chat
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Confidence Stats
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Context Lookup
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Daily Brief Check
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Daily Brief Dismiss
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief Fetch
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Control Summary
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Feedback Queue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Kb Gap Queue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Load
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Replay History
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Run
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Score Answer
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Eval Simulate
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Analysis
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Stats
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Archive
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Clear All
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Delete
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Export Csv
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Get
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Stats
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Clear
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight History
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Report Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight Report Get
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Compress
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Connector Templates
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Example
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Load
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Instructions Preview
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Reset
Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Save
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Page Insights
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Popup Regen
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Quality View
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Reasoning Chain Get
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Score Lead
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Smart Alerts
Read. Scope: platform.read, admin. Contract: route_inferred. Ai Spoke
Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Triage Accuracy
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Whmcs Chat
Write. Scope: platform.write, admin. Contract: route_inferred. Ai Writing
Read. Scope: admin. Contract: declared_dynamic. Api Keys Catalog
Write. Scope: admin. Contract: route_inferred. Api Keys Create
Write. Scope: admin. Contract: route_inferred. Api Keys Delete
Read. Scope: admin. Contract: declared_dynamic. Api Keys List
Write. Scope: admin. Contract: route_inferred. Api Keys Revoke
Write. Scope: admin. Contract: route_inferred. Api Keys Update
Read. Scope: admin. Contract: route_inferred. Audit Export
Write. Scope: platform.write, admin. Contract: route_inferred. Blocked
Read. Scope: platform.read, admin. Contract: declared_dynamic. Campaigns
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Browsers
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Countries
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Devices
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Hourly
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart New Returning
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Os
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Sources
Read. Scope: platform.read, admin. Contract: route_inferred. Chart Visitors
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Get
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Save
Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Stats
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Advance
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Start
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Toggle
Read. Scope: platform.read, admin. Contract: declared_dynamic. Chatbot Flows List
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Save
Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Nodes List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Clear Admin Chat History
Read. Scope: platform.read, admin. Contract: declared_dynamic. Command Center View
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Execute
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Policy Save
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Review
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Simulate
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report Email
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Autonomy Issue
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Autonomy Status
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Collections Delete
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Collections Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Block
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Credit Add
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Save
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Customers List
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Codes Import
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Config Save
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Digital File Upload
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Fulfilment Transition
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Economics Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Price Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Save
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Kit Apply
Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Kit Preview
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Kits List
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Launch Readiness
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menu Ai Build
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menus Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Merchandising Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Midmarket Operations
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Ai Draft
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Apply
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Option Sets Generate
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Option Sets Save
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Option Templates
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Refundable
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Order Ship
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Shipments
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Orders List
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Orders Transition
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Draft
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Refine
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Render
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Pages Delete
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages List
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages Save
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Price Advice
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Ai Copy
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Bulk
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Catalog Meta
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Delete
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Duplicate
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Export Csv
Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Image Alt Ai
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Delete
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Image Update
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Upload
Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Images List
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Images Reorder
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Import Csv
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products List
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Complete Manual
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Request
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Returns Transition
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Size Charts Delete
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Size Charts Save
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Store Maturity
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Brand Import
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Remove
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Set
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Logo Upload
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Storefront Page Ai Seo
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Storefront Slug Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Supply Chain
Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Variants Delete
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Variants Save
Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Wallet Topup Refund
Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Wallet Topups List
Write. Scope: platform.write, admin. Contract: route_inferred. Complete Todo Item
Read. Scope: platform.read, admin. Contract: route_inferred. Consent Log List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Countries
Read. Scope: platform.read, admin. Contract: route_inferred. Country Detail
Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Disable
Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Reject
Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Rollback
Read. Scope: platform.read, admin. Contract: route_inferred. Custom Code Status
Write. Scope: platform.write, admin. Contract: route_inferred. Delete Todo Item
Read. Scope: platform.read, admin. Contract: declared_dynamic. Devices
Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Check Resolutions
Write. Scope: platform.write, admin. Contract: route_inferred. Diag Dismiss
Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Event Taxonomy
Write. Scope: admin. Contract: declared_dynamic. Diag Identity Restitch
Write. Scope: platform.write, admin. Contract: route_inferred. Diag Recheck
Write. Scope: platform.write, admin. Contract: declared_dynamic. Diag Recheck All
Write. Scope: platform.write, admin. Contract: route_inferred. Diag Report
Write. Scope: platform.write, admin. Contract: route_inferred. Diag Unmute
Write. Scope: admin. Contract: route_inferred. Dismiss Credit Alert
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Ai Generate
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge List
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Save
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Toggle
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Add
Read. Scope: platform.read, admin. Contract: declared_dynamic. Domain Verify List
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Recheck
Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Dynamic Action Dispatch
Write. Scope: platform.write, admin. Contract: declared_dynamic. Events Clear All
Read. Scope: platform.read, admin. Contract: route_inferred. Events List
Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Experiment Results
Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Save
Write. Scope: platform.write, admin. Contract: declared_dynamic. Experiments Clear All
Read. Scope: platform.read, admin. Contract: declared_dynamic. Experiments List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear All
Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear History
Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Journey
Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins List
Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Unblock
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Analysis Get
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Analysis Run
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics All
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Detractors
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Metrics
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Overview
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Segments
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Sentiment
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Themes
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Trends
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Assignees List
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Event Outbox Drain
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Exports Create
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Exports Get
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback External Review Ingest
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Ingest Create
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Assign
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Evidence
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Complete
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Set Required fields: bool.
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Get
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items List
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Mark Read
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Notes Add
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Priority
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Status
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Add
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Remove
Read. Scope: platform.read, admin. Contract: route_inferred. Feedback List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reconciliation
Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Reports Delete
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Email
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Get
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advice Last
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advise
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Overview
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources Health
Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources List
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Rebuild
Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Replay
Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Stats
Write. Scope: platform.write, admin. Contract: declared_dynamic. Fx Refresh Now
Read. Scope: platform.read, admin. Contract: declared_dynamic. Geoip Autodetect
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Admin Chat History
Write. Scope: platform.write, admin. Contract: route_inferred. Get Ai Snapshot
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Campaign Groups
Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Client Chat Knowledge Overview
Read. Scope: platform.read, admin. Contract: route_inferred. Get Kb Categories
Read. Scope: platform.read, admin. Contract: route_inferred. Get Live Health Snapshot
Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Pwa Chat Prefs
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Servers
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Survey Config
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Ticket Options
Read. Scope: platform.read, admin. Contract: route_inferred. Get Ticket Thread
Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Todo List
Read. Scope: platform.read, admin. Contract: route_inferred. Get Widget Advanced
Read. Scope: platform.read, admin. Contract: route_inferred. Governance Summary
Write. Scope: platform.write, admin. Contract: route_inferred. Groups Create
Write. Scope: platform.write, admin. Contract: route_inferred. Groups Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Groups List
Write. Scope: platform.write, admin. Contract: route_inferred. Groups Rename
Write. Scope: platform.write, admin. Contract: route_inferred. Groups Set Primary
Read. Scope: platform.read, admin. Contract: route_inferred. Hc Preview Mint
Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Apply
Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Hc Template Preview
Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Templates List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review Get
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Revert
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Save
Read. Scope: platform.read, admin. Contract: route_inferred. Heatmap
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Grant Manual
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Access Policy List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Policy Set
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Request
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Revoke
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Accommodation List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Accommodation Resolve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Compensation Retry
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Agent Compensation Sweep
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Compensations
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Incident Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Register
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Step
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Agent Step Status
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Auth
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Grant
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Tools
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Ai Act Build
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Export
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Fria Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Notice Publish
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Revoke
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Overview
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Export
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Metering Settings Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Status
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Analytics Ask
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Analytics Snapshot
Write. Scope: platform.write, admin. Contract: route_inferred. Hr App Move
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Appeal List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Appeal Resolve
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Application History
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Application List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Auto Offer Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Demote
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Autonomy Lane Install
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Promote
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Autonomy Lane Review
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Shadow
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Lanes
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Availability Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Approve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Band List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Save
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Contribute Now
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benchmarks Opt In
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Opt Out
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Benchmarks Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Enroll
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Plan Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Bias Audit List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Bias Audit Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Booking Link Save
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Booking Slots Reconcile
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Breaker Reset
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast Audience Options
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast List
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Broadcast Preview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Broadcast Send
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Budget Set
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Move
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Open
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capabilities Get
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Capability Set
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capability Trail
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Cards Refresh
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Attachment Add
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Attachment List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case Categories
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Event Add
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Get
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Grant Access
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Intake Mailbox
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Open
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Route
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Thread
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Tighten
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification Define
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification State
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Certification Types
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Check List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Manual Result
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Order
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Requery
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Void
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Checkin Record
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Coach Feedback
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Coach Me
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Coach Receive
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Request
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Compliance Build
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Compliance List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Revoke
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Connector Cert Submissions
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Submit
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Certify
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Health
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Options
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Revoke
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Contract List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Apply
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Copilot Plan
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Copilot Recipes
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Reject
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Correction Dataset Build
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Correction Datasets
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Correction Privacy Review
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Enroll
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Skills Tag
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal File
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Resolve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decision Appeals List
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Decision Explanation
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decisions Recent
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Directory Visibility Get
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Directory Visibility Set
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Propose
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document Access Log
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Deletion Request
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Hold
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Intake
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Add
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Review Approve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Document Reviews
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Dsr List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Dsr Transition
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Email Intake Log
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Employee Access Events
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Provision
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Restore
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Suspend
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment Activate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment End
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Enterprise Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Delivered
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Request
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Returned
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Escrow Resolve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence A11y Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Attest
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Dr Record
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Evidence Ledgers
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Load Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Owner Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Confirm
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Handoff
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Expense Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Policy Save
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Experience Metrics
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Expiry Run
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Cohort Define
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Fairness Cohorts
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Evaluate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Draft
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Faq List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq State
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Feedback List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Feedback Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Flag Set
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Flags Get
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Frontline Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Post
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Global Readiness
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Create
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Draft
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Update
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance File
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance Outcome
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Draft
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Headcount List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hire
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hiring Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Holiday Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Admin Options
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Conflict Resolve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Coverage Plan
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Identity Facets
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity History
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Link
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Revoke
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Verification Record
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Incident List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Open
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Step
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Start
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Upload
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Review
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Answer
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Ask
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Connect
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Consent
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room End
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Leave
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Interview Room List
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Observe
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Pause
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Provision
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Reconnect
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Resume
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room State
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Takeover
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Schedule
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Transcript Correct
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Finding
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Hold
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Open
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Investigation Triage
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Iplan List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Human
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Attach Meeting
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Control
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Isession List
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Isession Liveness
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Schedule
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Job Arch Analyse
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Apply
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Approve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Job Arch Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Propose
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Reject
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Family Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Level Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Profile Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Draft Ai
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Publish
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Save
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Job Versions
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Capabilities
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Assess
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Raise
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Coverage
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Explain
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Overlay List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Overlay Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Draft
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Release
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Withdraw
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Release List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Rule Save
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Source Declare
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Transfer Declare
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Flip
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Toggle
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Register
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Revoke
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Install
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Remove
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Knowledge Packs
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leadership Score
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Learning Assign Mandatory
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Learning Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Decide
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leave Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Policy Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Type Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Letter Issue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Letter Kinds
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Letter Preview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Close
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Listening Overview
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Listening Run Due
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule State
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Correct
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Evaluate
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Loop Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Propose
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Release
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Rollback
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Snapshot
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Marketplace Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Book
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Cancel
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Propose
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Reschedule
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Meetings Overview
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Meetings Reconcile
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Mentor Propose
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Module Toggle
Read. Scope: platform.read, admin. Contract: route_inferred. Hr New Hire Checkin State
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Draft
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Esign Confirm
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Offer List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Send
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Withdraw
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Checkins Book
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Draft Tasks
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Onboarding Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Buddy
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Create
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Block
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Done
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Task Skip
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Unblock
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Verify
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Template Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr One On One List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr One On One Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Post
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Chart
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Legal Entities
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Legal Entity Create
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Location Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Locations
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Org Map Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Tree
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Unit Create
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Org Unit Move
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Override Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Overtime Decide
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Enroll
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Save
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Pay Equity Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pay Gap Evaluate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Import
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Overview
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Provider Exceptions
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Reconcile
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payslips Issue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr People List
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Perf Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Get
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Identifier Add
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifier Read
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifiers
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Update
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pilot Outcome Record
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pipeline
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Activate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Compile
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Create
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Add
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Remove
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pool Overview
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Portal Address
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Portal Slug Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Position Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Profile Set
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Reports To
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position State
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Vacate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Posting List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Publish
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Open
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Review
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Address Format
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Address Write
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Decide
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Ownership Get
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Ownership Set
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Pending
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Clear
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Set
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Reveal
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section End
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section Write
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Sections
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Close
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Issue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pulse List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Open
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Pulse Results
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Overview
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Quality Sample Draw
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Samples
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Quality Verdict
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Add
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Readiness Report
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Recognise
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Relations Overview
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Release Gates
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Release Verify
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Req List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Reject
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Transition
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Cycle Open
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Include
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Respond
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Template Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Create
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Rubric List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Replay
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Start
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Step
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Takeover
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Scenario Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Schedule Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Correct
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Screening List
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Screening Review
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Verify
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Security Assurance Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Service Item Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Servicedesk Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shadow Compare
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Add
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Cancel
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature Confirm
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Request
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Signin Design Get
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Signin Design Save
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Skill Challenge Resolve
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Sweep
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Text
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Skills Overview
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Skills Taxonomy Adopt
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Status
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Nominate
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Open
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Succession Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Approve
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Decline
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Sync Conflict Resolve
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Talent Overview
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Dm
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Legal Hold
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Outreach
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Post
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Read
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Retention
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Search
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Threads Inbox
Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Threads Retention Sweep
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Time Decide
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Time Overview
Read. Scope: platform.read, admin. Contract: route_inferred. Hr Title History
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Title Record
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Training Requirement Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Truth Register
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Turnover Run
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Verifier Verdict
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Grant
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Identity
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Wb List
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Read
Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb State
Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Workforce Dashboard
Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Activity Feed
Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Delete
Write. Scope: admin. Contract: route_inferred. Inbound Endpoints List
Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Save
Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Test
Read. Scope: platform.read, admin. Contract: declared_dynamic. Interrupted
Read. Scope: platform.read, admin. Contract: route_inferred. Ip Classify
Write. Scope: platform.write, admin. Contract: declared_dynamic. Js Errors Clear All
Read. Scope: platform.read, admin. Contract: route_inferred. Js Errors List
Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Assign
Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Update
Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Upload
Read. Scope: platform.read, admin. Contract: declared_dynamic. Js Sourcemaps List
Read. Scope: platform.read, admin. Contract: route_inferred. Leads
Write. Scope: admin. Contract: declared_dynamic. License Delete
Read. Scope: platform.read, admin. Contract: declared_dynamic. License Diagnostics
Read. Scope: platform.read, admin. Contract: declared_dynamic. License Force Check
Read. Scope: platform.read, admin. Contract: declared_dynamic. License Preflight
Write. Scope: admin. Contract: route_inferred. License Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. License Status
Write. Scope: platform.write, admin. Contract: declared_dynamic. License Verify Now
Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Evaluate
Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Rule List
Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. List Assignable Sites
Read. Scope: platform.read, admin. Contract: declared_dynamic. List Network Issues
Read. Scope: platform.read, admin. Contract: route_inferred. Lookup Client Full
Write. Scope: platform.write, admin. Contract: route_inferred. Mark Feedback Read
Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Install
Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Uninstall
Read. Scope: platform.read, admin. Contract: declared_dynamic. Marketplace Session Get
Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Session Set
Read. Scope: platform.read, admin. Contract: route_inferred. Media Ready
Write. Scope: platform.write, admin. Contract: route_inferred. Message Contact Locale
Write. Scope: platform.write, admin. Contract: route_inferred. Message Outbound Convert
Write. Scope: platform.write, admin. Contract: route_inferred. Message Translate
Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Delete
Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Save
Write. Scope: platform.write, admin. Contract: declared_dynamic. Meta Channels Disconnect
Write. Scope: platform.write, admin. Contract: route_inferred. Meta Channels Switch Page
Read. Scope: platform.read, admin. Contract: declared_dynamic. Observe
Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Action
Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Readiness
Read. Scope: platform.read, admin. Contract: declared_dynamic. Open Network Issue
Read. Scope: platform.read, admin. Contract: route_inferred. Open Ticket
Write. Scope: platform.write, admin. Contract: route_inferred. Operator Text Translate
Read. Scope: platform.read, admin. Contract: declared_dynamic. Download a full backup in one request (retired)
Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import
Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import Start
Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Start
Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Status
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Campaign List
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Save
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Send
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Compose Send
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Draft List
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Save
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Messages Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Replies List
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Ai
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Mark
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Pref
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Send
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Thread
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Send Detail
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Send Retry
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Sends List
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template List
Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template Preview
Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Save
Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview
Read. Scope: platform.read, admin. Contract: route_inferred. Overview Hub View
Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview Intelligence Graph
Read. Scope: platform.read, admin. Contract: route_inferred. Pages
Read. Scope: platform.read, admin. Contract: route_inferred. Paths Data
Read. Scope: platform.read, admin. Contract: declared_dynamic. Pause
Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Change Password
Read. Scope: platform.read, admin. Contract: route_inferred. Profile Get
Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim
Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim Cancel
Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Save
Write. Scope: platform.write, admin. Contract: route_inferred. Profile Session Revoke
Read. Scope: platform.read, admin. Contract: declared_dynamic. Profile Sessions List
Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Sessions Revoke Others
Write. Scope: platform.write, admin. Contract: route_inferred. Profile Team Dispute File
Write. Scope: admin. Contract: route_inferred. Purge
Write. Scope: admin. Contract: route_inferred. Purge All
Read. Scope: platform.read, admin. Contract: route_inferred. Realtime
Write. Scope: platform.write, admin. Contract: route_inferred. Realtime Test
Read. Scope: platform.read, admin. Contract: declared_dynamic. Resume
Read. Scope: platform.read, admin. Contract: route_inferred. Retention Data
Read. Scope: admin. Contract: source_inferred. List every registered OpsIQ operation
Read. Scope: admin. Contract: explicit. Execute a registered read operation Required fields: route.
Write. Scope: admin. Contract: explicit. Execute a registered write operation Required fields: route, idempotency_key. Retry-safe with idempotency_key.
Write. Scope: platform.write, admin. Contract: route_inferred. Run Ai Analysis
Write. Scope: platform.write, admin. Contract: route_inferred. Save Admin Chat History
Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Pwa Chat Prefs
Write. Scope: platform.write, admin. Contract: route_inferred. Save Survey Config
Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Widget Advanced
Read. Scope: platform.read, admin. Contract: route_inferred. Scim Token Issue
Read. Scope: platform.read, admin. Contract: declared_dynamic. Scim Token List
Write. Scope: platform.write, admin. Contract: route_inferred. Scim Token Revoke
Write. Scope: platform.write, admin. Contract: route_inferred. Segment Delete
Read. Scope: platform.read, admin. Contract: route_inferred. Segment List
Read. Scope: platform.read, admin. Contract: route_inferred. Segment Members
Read. Scope: platform.read, admin. Contract: route_inferred. Segment Preview
Write. Scope: platform.write, admin. Contract: route_inferred. Segment Save
Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Accept
Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Dismiss
Read. Scope: platform.read, admin. Contract: route_inferred. Segment Suggestion List
Write. Scope: platform.write, admin. Contract: route_inferred. Send Campaign
Write. Scope: platform.write, admin. Contract: route_inferred. Send Client Email
Write. Scope: platform.write, admin. Contract: route_inferred. Send Ticket Reply
Read. Scope: platform.read, admin. Contract: declared_dynamic. Service Studio Get
Write. Scope: platform.write, admin. Contract: route_inferred. Set Active Site
Read. Scope: platform.read, admin. Contract: declared_dynamic. Silence
Write. Scope: platform.write, admin. Contract: route_inferred. Site Set Group
Write. Scope: platform.write, admin. Contract: route_inferred. Sites Add
Write. Scope: platform.write, admin. Contract: route_inferred. Sites Edit
Write. Scope: platform.write, admin. Contract: route_inferred. Sites List
Write. Scope: platform.write, admin. Contract: route_inferred. Sites Picker
Write. Scope: platform.write, admin. Contract: route_inferred. Sites Regenerate Secret
Write. Scope: platform.write, admin. Contract: route_inferred. Sites Remove
Read. Scope: platform.read, admin. Contract: declared_dynamic. Stats
Write. Scope: platform.write, admin. Contract: declared_dynamic. Stepup Verify
Write. Scope: platform.write, admin. Contract: route_inferred. Submit Agent Ai Feedback
Write. Scope: platform.write, admin. Contract: route_inferred. Submit Triage Feedback
Read. Scope: platform.read, admin. Contract: declared_dynamic. Takeover
Read. Scope: platform.read, admin. Contract: route_inferred. Terminate
Read. Scope: platform.read, admin. Contract: route_inferred. Test Geoip
Read. Scope: platform.read, admin. Contract: route_inferred. Top Pages
Write. Scope: platform.write, admin. Contract: route_inferred. Train Client Chat Knowledge
Read. Scope: platform.read, admin. Contract: declared_dynamic. Triggers
Write. Scope: platform.write, admin. Contract: declared_dynamic. Trust Evidence Report
Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Add
Read. Scope: platform.read, admin. Contract: declared_dynamic. Turn Pool List
Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Pick Test
Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Update
Write. Scope: platform.write, admin. Contract: route_inferred. Update Lead Status
Write. Scope: platform.write, admin. Contract: route_inferred. Wa Embedded Signup Exchange
Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Export Run
Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Exports List
Read. Scope: platform.read, admin. Contract: route_inferred. Webhook Deliveries List
Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Delete
Read. Scope: platform.read, admin. Contract: declared_dynamic. Webhook Endpoint List
Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Save
Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Test
Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Redeliver
Read. Scope: platform.read, admin. Contract: route_inferred. Weekly Digest View
Read. Scope: platform.read, admin. Contract: declared_dynamic. Whmcs Op Dispatch
Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Remove
Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Set
Write. Scope: platform.write, admin. Contract: declared_dynamic. Writing Json Knowledge Clear
Read. Scope: platform.read, admin. Contract: declared_dynamic. Writing Json Knowledge Count
Write. Scope: platform.write, admin. Contract: route_inferred. Writing Json Knowledge Import
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Accessibility Evidence Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Add
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Subdomain Allocate
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Breakdown
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Load
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Apply Kit
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Apply Theme
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Approval
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Approve
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Ask
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Delete
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Explain
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience List
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Preview
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Generate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Import
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Cancel Schedule
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Certify
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Host Check
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Subdomain Check
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Add
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Resolve
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Package Inspect
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Component Package Install
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Validate
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Handoff Config
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Data Resolve
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Delete Theme
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Developer Contract
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Discovery Preview
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Discovery Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Load
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Save
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Control
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiment Results
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiments List
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Archive
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Form Catalog
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Create
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Duplicate
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Evaluate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Apply
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Publish
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Restore
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Template
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Test
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Version Restore
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design History
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Discover
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Load
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Identity Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Activate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Install
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Kill Switch
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration List
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration Policy
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Integration Policy Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Preflight
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Revise
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Rollback
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Transition
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Archive
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Journey Catalog
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Duplicate
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Journey Evaluate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Instantiate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Restore
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Save
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Delete
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Reorder
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Category Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Governance
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Governance Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Languages
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Languages Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Parity
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Tree
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Knowledge Summary
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain List
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Analytics Load
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Load
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Form Load
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Lock
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Apply
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Approve
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration List
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Reconcile
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration Report
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollback
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollout
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Start
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Add
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Duplicate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Move
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Update
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Control
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Feed
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Record
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Summary
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Context
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Org Member Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Members
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Requests
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Archive
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Create
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Duplicate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Restore
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Update
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Accept
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Capture
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Compare
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Create
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Parity List
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Delete
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Personalization List
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Save
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Presence
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Preview
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Preview Catalog
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Publish
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Quality
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Release Diff
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Release Evidence
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Release History
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Publish
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Rollback
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Remove
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Request Changes
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Restore Field
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Restore Published
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Design Revert
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Review
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Review Link
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Rollback
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Form Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save Theme
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Delete
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Instantiate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Save
Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Schedule
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule Cancel
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Scim Config
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Archive
Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Service Catalog
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Duplicate
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Reorder
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Restore
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Template
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Sign In Flow Save
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Signin Methods
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Handoff Test Link
Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Unlock
Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Image Upload
Write. Scope: sales.write, admin. Contract: route_inferred. Sales Ai Insight
Write. Scope: sales.write, analytics.write, admin. Contract: route_inferred. Analyze sales with AI
Write. Scope: sales.write, admin. Contract: route_inferred. Sales Chart
Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. Compare sales periods
Read. Scope: sales.read, admin. Contract: route_inferred. Sales Compare
Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Delete
Read. Scope: sales.read, admin. Contract: route_inferred. Conversion Goal List
Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Save
Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. List sales and conversions
Read. Scope: sales.read, admin. Contract: route_inferred. Conversion List
Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Record
Read. Scope: sales.read, analytics.read, admin. Contract: declared_dynamic. Read sales statistics
Read. Scope: sales.read, admin. Contract: declared_dynamic. Sales Stats
Read. Scope: sales.read, admin. Contract: route_inferred. Sales Table
Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Analyze
Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Ask
Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Briefs
Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Chain Explain
Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Incident Action
Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Incidents
Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Js Triage
Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Policies
Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Policy Action
Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Verdicts
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.
Read. Scope: security.read, admin. Contract: explicit. List the current ticket spam rules
Write. Scope: security.write, admin. Contract: declared_dynamic. Security Chain Reanchor
Read. Scope: security.read, admin. Contract: source_inferred. Check an IP or email against the platform blocklists and Security AI verdicts
Write. Scope: security.write, admin. Contract: route_inferred. Block Ip
Write. Scope: security.write, admin. Contract: route_inferred. Unblock Ip
Write. Scope: security.write, admin. Contract: route_inferred. Access Log List
Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Chains
Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Data
Write. Scope: security.write, admin. Contract: source_inferred. Report abuse a connector observed (spam, login attack, scan, fraud) Retry-safe with idempotency_key.
Write. Scope: security.write, admin. Contract: route_inferred. Block Visitor
Read. Scope: sessions.read, admin. Contract: route_inferred. Session Detail
Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. Get a session journey Required fields: session_id.
Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. List sessions
Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Merged
Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Table
Write. Scope: settings.write, admin. Contract: declared_dynamic. Ai Eval Watchtower Config
Read. Scope: settings.read, admin. Contract: route_inferred. Get Client Chat Settings
Read. Scope: settings.read, admin. Contract: route_inferred. Get Settings
Write. Scope: admin. Contract: route_inferred. Opsiq Branding Clear
Write. Scope: admin. Contract: route_inferred. Opsiq Branding Upload
Read. Scope: settings.read, admin. Contract: declared_dynamic. Privacy Settings Get
Write. Scope: settings.write, admin. Contract: route_inferred. Privacy Settings Save
Write. Scope: settings.write, admin. Contract: route_inferred. Save Ai Settings
Write. Scope: settings.write, admin. Contract: declared_dynamic. Save Chat Widget Settings
Write. Scope: settings.write, admin. Contract: route_inferred. Save Client Chat Settings
Write. Scope: settings.write, admin. Contract: route_inferred. Save Settings
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Audit Chain
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Execute
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Preview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Token
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg Stop
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Step
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Chat
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Delete
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Get
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Test
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Coverage
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Events
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Apply
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Finalize
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Live Set
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Preview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Rollback
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Start
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Verify
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Delete
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Finalize
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Rollback
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Start
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Status
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Verify
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Runs List
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Set Mode
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Status
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Apply
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Skip
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Turn Status
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Activity
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alert Enrich
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alerts
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Ask
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Email
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Badges Portfolio
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges Preview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Get
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content List
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Publish
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Write
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Daily Digest
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Discover
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply Bulk
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss Bulk
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate All
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix List
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Overview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit Run
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Portfolio
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Ai Portfolio History
Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Ai Portfolio Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Probe
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Add
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt History
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Remove
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompts
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Readiness
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Ready
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Alert Resolve
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Alerts
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence alerts
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Resolve a Site Intelligence alert Required fields: alert_id.
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Analyze
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ask
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Audit Hint
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlink Disavow
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Backlinks
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List backlinks
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlinks Refresh
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Billing Overview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Get
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Radar
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Cannibalisation
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Compare
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Add
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Refresh
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Remove
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Competitors
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List competitors
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Brief
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Decay
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Draft
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Crawl Budget
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl List
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl Status
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence crawls
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Get crawl status
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Read the Site Intelligence dashboard
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Dashboard
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Dashboard Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Backfill
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Compare
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Diag Portfolio
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Recs Regen
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Eval
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds History
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Profile
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diagnostics
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Exec Report
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Export
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Connect
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 List Properties
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Map
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Status
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Sync
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Approve
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Dismiss
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Sync
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Drafts
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Gbp Locations
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Map
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Draft
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Publish
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Approve
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Dismiss
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Sync
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Site Prefs
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Sync
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Google Truth Schedule Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Growth
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Connect
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc List Properties
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Map
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Opportunities
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Status
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Sync
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Image Audit
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Internal Links
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Issue History
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Issues
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence issues
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Add
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Remove
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Research
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Keywords
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List tracked keywords
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid Scan
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Ingest
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Summary
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Metadata Audit
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Overview
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Experience
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Optimize
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Pages
Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence pages
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Pagespeed Bridge Status
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Portfolio Export
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Provider Health
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rank Check
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rec Action
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Recommendations
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Redirect Audit
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report Generate
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Reports
Read. Scope: site_intelligence.read, admin. Contract: source_inferred. Site Intelligence Reports List
Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Reset Google Oauth
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Revenue
Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Revenue Portfolio
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Save Shared Google Oauth
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Start a Site Intelligence analysis
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Delete
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Run Now
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedules List
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schema Audit
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Server Engineer
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Settings Save
Read. Scope: site_intelligence.read, admin. Contract: explicit. List Site Intelligence monitored sites
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Progress
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Build Task
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Collect
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Read
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Run
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Start Crawl
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Approve
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Assign
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Apply
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Assign
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Deadline
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Dismiss
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Deadline
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Note
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Proof
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Reject
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Review
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Topical Map
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Delete
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Save
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhooks List
Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Workflow
Write. Scope: status.write, admin. Contract: declared_dynamic. Status Component Save
Write. Scope: status.write, admin. Contract: explicit. Create or update a public status component Required fields: name. Retry-safe with idempotency_key.
Write. Scope: status.write, admin. Contract: declared_dynamic. Status Incident Create
Read. Scope: status.read, admin. Contract: route_inferred. Status Incident Resolve
Write. Scope: status.write, admin. Contract: explicit. Create a status-page incident Required fields: title. Retry-safe with idempotency_key.
Write. Scope: status.write, admin. Contract: source_inferred. Status Incidents Resolve Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Analytics Get
Read. Scope: surveys.read, admin. Contract: explicit. List survey audiences
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Audiences Materialize Retry-safe with idempotency_key.
Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey campaign Required fields: deployment_id. Retry-safe with idempotency_key.
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Campaigns Launch Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: explicit. List survey campaigns
Read. Scope: surveys.read, admin. Contract: explicit. List survey deployments
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Deployments Set Status Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Get
Write. Scope: surveys.write, admin. Contract: explicit. Create and run a survey import Required fields: kind. Retry-safe with idempotency_key.
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Imports Process Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: explicit. List survey invitations
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Links Create Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: explicit. List survey definitions
Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Responses Get
Read. Scope: surveys.read, admin. Contract: explicit. List survey responses
Read. Scope: surveys.read, admin. Contract: explicit. List survey trigger sets
Read. Scope: surveys.read, admin. Contract: explicit. List supported question types and Studio templates
Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Versions List
Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Webhooks Delete Retry-safe with idempotency_key.
Read. Scope: surveys.read, admin. Contract: explicit. List survey webhook subscriptions
Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey webhook subscription Required fields: url. Retry-safe with idempotency_key.
Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Delete
Write. Scope: team.write, admin. Contract: route_inferred. Departments Delete
Read. Scope: team.read, admin. Contract: route_inferred. Admin Users List
Read. Scope: team.read, admin. Contract: declared_dynamic. Departments List
Write. Scope: admin. Contract: route_inferred. Team Perf Activity
Write. Scope: admin. Contract: route_inferred. Team Perf Ai Compare
Write. Scope: admin. Contract: route_inferred. Team Perf Ai Review
Write. Scope: admin. Contract: route_inferred. Team Perf Availability
Write. Scope: admin. Contract: route_inferred. Team Perf Award Finalize
Read. Scope: team.read, admin. Contract: route_inferred. Team Perf Award History
Write. Scope: admin. Contract: route_inferred. Team Perf Award Void
Write. Scope: admin. Contract: route_inferred. Team Perf Claim Pay
Write. Scope: admin. Contract: route_inferred. Team Perf Claim Recover
Write. Scope: admin. Contract: route_inferred. Team Perf Claim Reject
Write. Scope: admin. Contract: route_inferred. Team Perf Clear
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Add
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Complete
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Pin
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Unpin
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Create
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Update
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Sessions
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Status
Write. Scope: admin. Contract: route_inferred. Team Perf Data
Write. Scope: admin. Contract: route_inferred. Team Perf Heatmap
Write. Scope: admin. Contract: route_inferred. Team Perf History
Write. Scope: admin. Contract: route_inferred. Team Perf Pay All Claims
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Calibration Record
Write. Scope: admin. Contract: route_inferred. Team Perf Qa Dispute Resolve
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Disputes
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Evaluation Submit
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Overview
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Publish
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Save
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Record
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Save
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Status
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quests
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition
Write. Scope: admin. Contract: route_inferred. Team Perf Recognition Settings Save
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streak History
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streaks Record
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Budget Authorize
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Claims
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Pay
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Payouts
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Finalize
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period History
Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period Preview
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Reverse
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Void
Write. Scope: admin. Contract: route_inferred. Team Perf Reward Save
Write. Scope: admin. Contract: route_inferred. Team Perf Reward State
Write. Scope: admin. Contract: route_inferred. Team Perf Trends
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Data
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Export
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Live
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Reward Sheet
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings
Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings Save
Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Save
Write. Scope: team.write, admin. Contract: route_inferred. Departments Save
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Ai Summary
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Analytics
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Decide
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Request
Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Approvals Pending
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Assignment Rule Delete
Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Assignment Rule List
Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Assignment Rule Save
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Assignment Rules Delete Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: explicit. Create or update a ticket assignment rule Required fields: name. Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Bulk Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: route_inferred. Tickets Bulk
Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Calendar Delete
Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Calendar Save
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Claim
Read. Scope: tickets.read, admin. Contract: explicit. Get the CSAT response for one ticket Required fields: ticket_id.
Read. Scope: tickets.read, admin. Contract: explicit. List ticket CSAT responses in the bound workspace
Read. Scope: tickets.read, admin. Contract: explicit. CSAT metrics for a period (the tickets dashboard numbers)
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Load
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Save
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Secret
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Field Save
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Add
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Remove
Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Get
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Deflection
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Draft
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Save
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Version Restore
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Versions
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Add
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Remove
Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets List
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Guest Retry-safe with idempotency_key.
Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Ops Summary
Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Policy Delete
Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Policy Save
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Leave
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Ping
Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Quick Replies
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Quick Reply Save
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Relations Get
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Reply Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Delete
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Edit
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Outbound Convert
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translate
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Delete
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Save
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Rule Compose
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Ai Draft
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Assign Department
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Create
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side List
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side Mention
Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Side Recipients
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Reply
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Sla Delete Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: explicit. Create or update an SLA policy Required fields: name. Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split Candidates
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Add
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Tag List
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Remove
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Add Retry-safe with idempotency_key.
Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Tags List
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Remove Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: source_inferred. Update a ticket status, priority, subject, department or assignment Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Delete
Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket View List
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Save
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Delete Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Save Retry-safe with idempotency_key.
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Add
Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Delete
Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Worklog List
Write. Scope: todos.write, admin. Contract: source_inferred. Todos Add Retry-safe with idempotency_key.
Write. Scope: visitors.write, security.write, admin. Contract: route_inferred. Block a visitor Required fields: visitor_id.
Read. Scope: visitors.read, analytics.read, admin. Contract: route_inferred. List visitors
Read. Scope: visitors.read, admin. Contract: route_inferred. Visitors Table
Read. Scope: webhooks.read, crm.read, admin. Contract: explicit. List outbound webhook events and their payloads
Write. Scope: writing. Contract: source_inferred. Writing Analyze Retry-safe with idempotency_key.
Write. Scope: writing. Contract: source_inferred. Writing Compose Retry-safe with idempotency_key.
Write. Scope: writing. Contract: source_inferred. Writing Reply Retry-safe with idempotency_key.
Write. Scope: writing. Contract: source_inferred. Writing Rewrite Retry-safe with idempotency_key.
Write. Scope: writing. Contract: source_inferred. Writing Summarize Retry-safe with idempotency_key.
Write. Scope: writing. Contract: source_inferred. Writing Translate Retry-safe with idempotency_key.
是。 生成的 OpenAPI 3.0 文档位于 /api/v1/openapi.php, 生成的 Postman 收藏在 /api/v1/postman.php, 和人可读的开发者 Docs 在 /api/docs/.
在请求中发送 site_ key 来选择工作空间。 为一个工作空间发布的密钥会被固定在它上; 有管理员背景的密钥可以选择允许它看到的任何工作空间, 而任何它不被拒绝 。
任何标记为已读的动作。 将权限模式设定在密钥上只读_ 只读, 而每个写入都用已读_ 密钥拒绝, 因此报告集成即使错误也无法改变任何内容 。
密钥被设定为工作空间。 其他工作空间的记录返回到未找到而非权限错误, 所以 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"
}需要安全检查和安全 封面名单 安全报告
需要安全 报告和保安 封锁列表 添加 仅提供给您想要输入规则和报告的系统 。
被封禁的发信人仍然会登陆垃圾邮件视图中,在那里可以读取并还票.
服务器是自己的 IP 地址永远无法通过此方式被封禁、封锁列表或报告 API,因此一个配置错误的集成不能将平台拆下.
出局同步已经自动:当您屏蔽一个 IP,通过连接器安全同步告知连接的平台。API 是输入的一半。用带有安全范围的关键指向这四个动作上的连接符或自定义代码。
一个商店 车票页面屏蔽发送器控制 垃圾邮件AI在设置中,还有这个 API 所有的工作都与同一个挡板列表相对, 所以有一个地方可以找。
从您的服务器或网站发送自定义事件到 OpsIQ,用于分析,实验,CRM触发器和webhook条件.
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> 第三方系统,推动事件。
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"
}命令,完成的,不是命令,已经完成的
按钮,点击" 不是"按钮,单击"
定价 计划选择 而不是用户行动
了解数据流有助于您调试集成并优化性能.
密码 JavaScript 部件发送页面视图、点击和聊天信息到 /beacon.php.
存储在 opsiq_events 中的事件,包含站点_ key,事件类型,客户,以及属性.
会话构建者分组页面浏览到会话(通过 cron).
识别出匿名记录后,会与客户简介相链接.
连接器从外部平台取出数据并存储在连接器缓存中.
AI集合背景来自:访客历史,客户简介,连接器数据,KB,并被迅速.
内部事件起火(ticket. created, chalk. message, order. completed).
活动被放置在同步任务队列中 。
调度员签名并发送到所有订阅的端点.
以指数回放方式对交付失败进行再试.
设置是工作空间的控制中心。 下面的一切都被设定到您所在的工作空间, 因此一个账户可以运行多个品牌, 其身份、 聊天行为和保留规则不同 。
设置中约有600个单个控制符, 分布在11个标签上, 归在四个菜单下。 您不需要浏览它们 。
按 Ctrl + K,或 Cmd +K 在 Mac 上, 设置页面的任意位置。 输入字节键后按 Enter 直接跳转到控制。 搜索会容忍小打字并理解相关的单词, 因此调度器会找到 Cron , 隐私会找到跟踪控制。 它只会显示您的角色可以打开的设置 。
通用和许可证。
管理助理AI,客户聊天, OpsIQ 写作与支持门户.
追踪和隐私、权限和安全。
Cron设置(仅自办)和危险区.
每个选项卡都用自己的保存按钮自行保存。 客户端聊天和 OpsIQ 写出他们的被指针到屏幕上。 在切换标签前保存; 更改不会被带过 。
活性标签被写入了页面地址,因此可以给标签作书签或发送给同事.
这份专页上最重要的卡片,AI在每一份答复、报告和每日简报上都读取这些值。
AI 报告、每日简报和客户信息措辞。匹配您的网站页脚。
设计人工智能分析、领先评分、简介和调查预设,从网络托管、电子商务、SaaS、房地产、代理、咨询、保健、教育、金融或一般业务中选择。
向没有选择自己语言的人显示的语言。 每个代理可以覆盖在他们的配置中 。
显示访问者自己的语言的登录页。 一旦有人在那里选择了一种语言, 他们的选择就获胜, 而这个选项永远不会覆盖它 。
整个系统运行的区域有:日期、报告、时间表和背景。使用您的操作时区,而不是客户。
GeoLite2-City.mmdb. 首发负载时自动检测的完整路径 cPanel, Plesk, DirectAdmin, Cloudways, Docker 和 plain Linux 或 Windows. 在同一文件夹中为访问者网络提供商添加 GeoLite2-ASN. mmdb 。
只使用 GeoLite2 , 带有一个 Cloudflare 倒置,或 Cloudflare 只有这个。Cloudflare 模式要求网站通过 Cloudflare,并启用访问者位置头,用于城市和区域细节。
访问者会话被视为结束前不活动。 默认值 14400 四个小时
Live Feed 多久刷新一次。 默认 30 秒数。
访问者在最后一页装入后算作活多久 。2分钟。这是现场直播的下载,而不是会话长度。
删除过去收集并生成的记录:分析、聊天、机票、反馈、交易、AI遥测、集成记录和CRM活动。0设置、作者内容和同意收据永远不会被删除。
选择删除的对话保留在记录上的数量: 全记录, 记录没有对话, 或者只记录分数。 删除总是隐藏在收件箱和访客历史中的聊天内容。 计划保留和忘记访问者总是完全抹去, 不管这些是什么 。
将爬行者算作访客。请离开,它会夸大游客的计算和每份报告的浏览。
向访客显示全站反馈部件。 与客户端聊天、 支持流程的聊天调查分开 。
每个AI表面的主交换器。 默认全部打开并保存每个工作空间 。
按类别,优先级和情绪对每张票进行分类,并写出票头的线程摘要.
当代理在票单上徘徊一行时,在工具提示中显示分解标记和摘要。需要 AI Trage 。
添加票务回复框下的 ADraft AI 回复, Warmer, Shorter, More real and Apologetic 按钮。 没有代理, 任何信息都不会发送 。
每个行政页面上都有页码的浮动副驾驶。知道哪些客户、发票或机票是开着的。
副驾驶每天首次开放时,会出示紧急机票、逾期答复和候机聊天等文件。星期日的节目每周审查一次。
管理器中的每个货币总额都被转换成此货币以显示。连接器会存储自己的出源货币; 设置每个连接器 。
每6小时从免费公共饲料中刷新收费,但无 API 键。您可以添加手动比对种子的速率。自动同步关闭后,没有手动速率的货币将不被转换。
关闭了船舶。打开它就可以看到销售和转换页面、仪表板收入卡和现场情报服务。关闭后,每个价格表面都隐藏起来,销售页面会留下菜单。
教学 OpsIQ 你的措辞是:你是否更新、更新的词句、你销售的什么、买主的称呼。
上传了两条,一条是光背景(admin sidebar),一条则是暗色(签名页)。3 MB.
Auto-Implement SEO代理连接在 SSH 上. 私人,回回回和保留地址默认被屏蔽,作为反SSRF措施. 只允许在必须到达本地服务器的自托管安装上使用.
输出每个设置和 OpsIQ- 拥有的表格加上上传的文件。还原替换 OpsIQ 只进行配置和记录;它从未触及客户、发票、机票、服务、域名、订单或交易。
保护登录管理员、您的工作人员账户和数据 OpsIQ 收集。支持门户的客户签名是单独配置的。
停止在管理员的登录上输入 bots 和证书填入。 选择 v3( 隐形、 得分) 或 v2( checkbox), 设定 v3 分数阈值, 并提供网站和密钥。 这些密钥会被支持的门户请求表重新使用 。
在一个窗口内设置一些失败后的地址, 屏蔽数小时。 您可以自定义锁定的页面信息, 并显示一个小的等屏分心 。
密码政策,最小长度,拒绝在已知的违反情况下发现的密码,每个账户的锁定时反对证书输入,每个管理员必须有两个因素,密码在危险行动前重新进入,以及新的设备的登录警报.
工作人员通过身份提供商登录。需求发放者 URL,客户端ID和客户端秘密。自动提供域,每行一个,在第一个登录时自动创建用户。
给说话的提供者 SAML. OpsIQ ACS 回复的用品 URL 和 SP 实体 ID; 您提供 IDP 实体的 ID, 登录 URL,可选择的退出 URL 和X节。509 签名证书。电子邮件和名称属性字段仅用于非标准属性名称。
目录驱动的创建、更新和停用 OpsIQ 账户。OpsIQ 用品供应 SCIM 基础 URL; 您在此生成标签符号, 这样一面可以被取消, 而不中断其余部分 。
限制外部主机此工作空间连接器可能调用的内容。 Companion to the SSH 目标控制在通用。
威胁分数一旦超过你的门槛 就会阻止访客0禁用它。在选择数字前,请查看安全概览的一页。
被屏蔽的访客看到的信息, 如纯文本或您自己的习惯 HTML 块屏.
实际会议中的措施LCP、INP和CLS。
自定义事件队列在浏览器中并分批发送并重试,减少不良移动连接的损失.
真正的部件嵌入式带有旋转的密码符, 因此可以拒绝伪造的跟踪数据。 默认关闭; 允许更改嵌入法, 所以先测试 。
默认关闭。 检测和封存运行, 不管您是否被告知, 以及AI 帮助多少 。
此卡的开关总机.
有多少在短时间内失败的登录 算作值得警惕的浪潮。
增加公众虐待信息中出现的访问者的威胁分数。
小时营业时间和 TLS 过期检查,在证书失效前发出警告.
将可解释的判决加入可疑活动,并将相关攻击组织成一个单一的可读事件,而不是一流事件。
行动本身,将事件所得的教训转化为拟议或适用的规则。在您审查并赞同其建议之前,请先行。
安全概览页面每日复刊,每周硬化核对表显示哪些被保护,哪些仍然开放。
一条拟议的整块规则 你从未执行过 过期本身 而不是积累。
记录访问者重播的会话。 当重播库从不装入, 所以不放入不会产生费用。 记录被取样并被隐私化, 在Analytics 下的会话重播页面上被观看 。
记录会议的份额、单场录音可能持续多长时间以及录音保存天数。
或 OpsIQ 可能收集, 以及每一种记录存续多久。
地址从未跟踪过,每行一个,准确地址或CIDR范围。最干净的方法是让自己的团队远离分析,因为它覆盖了那个地址的每个人,而不仅仅是签约管理员。
页面图案从未跟踪过,每行一张,带有星号的通配符。例如 /admin/* 把整个后台都从访客记录里放出来
每一子系统在几天内自动清理。 与一般数据保留设置和危险区清理分开。
信心遥测, 包含简短的询问和响应预览。 默认 90 天数。这保存了大多数客户的文本,所以在收紧隐私时先缩短文本。
费用报告按名记账。90 天数。仅数字,没有消息内容。
篡改不言自明的行动和安全记录。默认 365 几天,保持这段时间,这是你的证据线索。
系统健康记录 默认 30 几天时间。
AI无法回答的一组问题。默认 90 研究AI在过期前错过的提问。
每日比较昨天和最近的基准值,当一个度量移动超过你的阈值时会发出警报。默认值 35 百分之百 默认关闭
夜间堆放会话、访客、页面视图和相关表格,用于您自己的BI 堆栈, 以您选择的格式保存了数天。 默认关闭 。
浮动助理 您的工作人员在管理员内部使用, 可以现场阅读客户端、 发票、 票、 服务器和 crun 日志。 与客户聊天系统下的客户界面不同的助理。
在每个管理页面上显示助理按钮。 关闭后为每个人隐藏它 。
角位置,面板宽度(320 改为: 600 px),最大高度(千分位数)400 改为: 900 px),角半径(.0改为: 24),字体大小,并有一个被霜冻的玻璃模糊了面板后面.
首页下方的一击快捷键。大多数员工使用最快的方式。
显示哪个模型回答和需要多长时间。在调价时有用,噪音可以用于日常使用。
只显示登录管理员的助手, 其用户名和电子邮件都匹配 。OpsIQ 指定到此工作空间的代理。 所有者总是通过。 在启用前使用检查我的访问按钮, 或者您可以锁定自己的团队 。
显示面板打开时显示的名称、页眉标签行和自定义欢迎消息。
编辑每个快捷键的标签和下限提示, 添加您自己的, 或重置为默认。 标签是工作人员看到的, 提示是AI 收到的 。
芯片形状(平面,圆形,平方),芯片颜色,卡片主题和发射装置形状(圆形相接,平面相接),并有活预览.
助手在浏览器会话中记得每个人的历史,最多 120 信件,存储在您自己的数据库中。清除后可以开始新的消息。
您的客户使用的聊天部件, 以及设置的最大区域。 有六个子标签, 主切换器和 Save 被绑在标签的上方 。
通过子目录来工作, 以进行新安装: 身份和复制、外观、行为、 支持流程、 知识培训。 高级是基础设施, 可以等待 。
部件名称、标签行、 AI 名称、 系统名称和闲置通知名称, 以及代理名称的出现方式。 Agent Name Source在真名、 自定义名称或团队标签之间做出决定 。
问候两位,一位是全体访客,另一位是身份明确的访客。一个问题开始的谈话比发言多。
聊天前的浮出的信息,有自有的名称,字体大小和颜色. AI可以写取笑者,有控件,用于生成多少个,每个访问显示多少个以及它们之间的间隙.
完整脚本: 请求姓名和电子邮件、 确认、 要求人、 无法使用代理、 票票创建或取消、 交接待决。 大约二十多行的单行在相撞面板上 。
三种客户可见信息:代理关闭聊天,访客安静下来,代理手接回AI. 避免内部措辞像解析或三分法.
输入占位符、“对人说话”按钮标签和所建议的开场问题。有三项好建议比一页文章更偏差票。
发射人图标,是打开时可选的不同图标,发射人大小,以及人类代理和AI的图像.
主题模式, 溢出颜色预设, 模糊的强度和不透明, 加上动画的切换, 分隔线, 隐藏状态行, 藏取信件盒卡并隐藏关闭按钮。 以预设开始; 它同时设置了数十个颜色 。
启动器、 头条、 帮助面板、 链接、 按钮、 系统通知和作曲器, 每个都带有渐变的起始和结尾颜色。 默认的玻璃选项忽略了这些并保持透明完成 。
大约30个采取器覆盖了面板、边框、文本、输入区和每个泡泡类型(访问器、AI、代理、打字、系统),加上建议芯片及其悬浮状态。 只打开这个来进行精确的品牌匹配,并检查泡泡文本的对比度。
面板宽度和高度,角半径,字体大小,屏幕位置,发射装置形状,气泡样式以及是否显示相机等。测试手机上的宽度。
交换器是人工智能的回答,关闭意味着每条信息都等待人类.
当访客安静下来时, 温和的跟进, 以及一个可选的简短的第二条信息, 一个人物发送的方式。 每静下来, 第一次延迟, 稍后的乘数, 存在窗口和最大序列窗口, 可以限制在工作时间, 并且经过简单的感谢后, 被压制 。
答覆是否逐个字排出,以及助手的回答速度如何,通过预设或您自己的最小和最大延迟以毫秒表示。一个小延迟读作比即时回复更人性化 。
每位代理人在看自己的书时,用自己的语言读写。
AI恢复谈话前的代理不活动时间.
在部件打开前秒数 。0从不打开 。 在移动中入侵; 请离开0除非测试。
计划提前解决单行本答,思考深度,代理答复的可选单独模式,向访客展示推理,容忍误入歧途,长时间对话记忆,限制助手只与您的业务打交道,价格用访问货币计算,以及链接如何出现。只有谈论你的业务才能为几乎所有人服务。
跳过对问候和感谢等问候的知识搜索, 并封顶了最长的答覆。 Trims 成本不改变回答真实问题的质量 。
部件支持哪一种语言, 以及如何选择一个访问者 。
用户自有账户的签名回复,可选择实时查询,并仅在需要时可选择加载。在所有情况下只读;在需要时加载可以明显地降低成本。
助理收集细节和向个人交接的协助退款请求。它从未完成退款。
保持过去的对话,在连接的站点间继续聊天,可拖动的窗口,向来客人要电子邮件,让团队将聊天变成罚单.
爱莫吉取取子,带有可选的只贴面模式的附件,AI图像理解,内置图标,麦克风,对讲机按钮,访客声音,附件预览,语音呼叫按钮和会话隔离. AI图像的理解是让访客粘贴出错截图并获得有用答案的由来.
访客欢迎弹出,加上你的代理提醒:收件箱声音,桌面通知,低声,无论是私人低声哔哔,还是收件匣民意调查间隔.
如何分配对一个人的请求,代理商必须回应的秒数,是否拒绝将聊天返回AI,以及AI在超时到期后是否恢复。在直播前配置此功能,或者一个要求人类的访客只需等待即可。
开放时间、时区和关闭时段信息。除这些时间外,人工智能不会提供人类服务。OpsIQ 写作.
第一次回复新消息,当某人已经排队时的回复,以及重复的时间要多久.
显示联系表,而不是聊天。
AI的票证意识,因此一个引用出票号码的访客会得到真实状态,而AI可以前往哪个部门。 一个内置的面板显示每个部门的真正收件人,解决方式与通知者解决的方式相同,所以在客户发现某个部门提醒任何人之前,你可以看到这一点。
让访问者浏览已发布的文章而不离开聊天。 您选择入口、 下栏标签和图标的位置, 以及是否提供完整帮助中心的链接。 默认情况下关闭 。
当代理关闭聊天、交接结束或您设定的不活动期之后,星级评级触发。 选择一两个触发点, 而不是全部。
当访客关闭聊天时进行简短的勘察,其中包含您的问题、延迟、时间规则和每次访问的上限。访客也可以通过电子邮件或下载记录。一个问题得到回答;三个问题没有得到回答。
对话结束后通过电子邮件进行后续调查,可选择使用访客所交谈的语言,对延迟的控制,主题,内语,提问,既要按下按钮标签,也要用感谢行.
拇指上下指向每个AI的回答,喂入质量的仪表板.
自动存档数日后,自动解决数分钟后,并删除数日后存档的对话。保留了第三位,与General and Tracking同时进行。
助理知道什么,客户聊天里没有其他的事
爬行您的站点, 使助手能够从站点中回复。 最多可有10个起始链接、 页数限制、 链接深度以及排除文件夹 。URL 可以在全部爬行之前测试。不包括出账、账号和管理路径。
密码 API 键和模型,将页面变成可搜索的含义而不是关键字匹配。
一击,AI读取每个FAQ,并爬行页面,将其分入类别.
问答对数被视为最高优先源,每个对数具有状态、重量和类别。JSON,而AI可以从对您业务的描述中写出它们。当助手出错时,写一个FAQ:它排在了爬行的页面后,所以修复是即时的.
投票间隔、 信件速率限制和窗口、 每个窗口的最大附件大小、 附加尝试, 并允许文件扩展名。 扩展名列表是一个安全控制; 保持紧凑 。
即时信息和状态传递,而不是投票,通过普赛尔,阿比利或火地站,有倒计时的投票间隔. 投票对大多数站点来说是罚款的.
通过 Pusher Beams 或 OneSignal 向代理设备发出设备提醒,并带有设备利息.
浏览器使用您自己生成的没有第三方提供者的密钥进行推取。 在此生成, 不在危险区 。
TURN 证书通过限制性网络连接,使用 Cloudflare 或Twilio证书 或你自己的TURN URL,用户名和证书。
代理工作空间设置而非访客设置:分钟后第一回应 SLA,保存队列视图,键盘快捷键和命令调色板,在对话中搜索,以及检查者中的客户出票.
WhatsApp, SMS, Facebook Messenters, Instagram, Telegram, X Direct messages and LINE , 各自都有自己的AI自动重回开关, 外加频道上的AI动作的政策开关、 回复解答和WhatsAapp重新接触模板。 每个频道都与网络聊天在同一收件箱中着陆 。
每封邮件OpsIQ发送, 以及所有信件的设定。 编辑任何信件的措辞, 并为任何事项撰写自己的模板OpsIQ尚未发送。
电话 全球电子邮件模板 是包装符:你的标志、头、卡、打字和脚印,中间是空的。每条信息OpsIQ发送被插入到中间。编辑包装器一次,每封邮件都会一起改变 — 票单回复、存储收据、密码重置、订票提醒、PeopleOS信件以及您自己写的任何东西。
信件按内容分类:票和门户、存储、登录和账户安全、预订、谈话和通知、报告、PeopleOS信件以及你自己。
你得到这个话题,一个富于文字的编辑 与一个HTML视图中您可以切换到活字, 并预览完好的电子邮件, 确切地说, 与收件人收到时相同 。
编辑器上方的芯片是变化的事实:一个出票号码,一个订单参考,一个预订时间。单击一个键,将它放在光标所在的地方。
只有此信件被写入。 留下一个字段, 它保留它内置的文字; 线上的药丸会告诉你它处于哪个状态 。
使用此信息获取信件OpsIQ尚未发送 : 发送通知、 更新提醒、 欢迎包、 许可证密钥 。 它得到所有内置信息 — 编辑器、 预览、 计划规则和您的全球设计 — , 而您自己的系统通过API.
按钮坐落在模板页的上方,并再次放在"你的自有模板"旁边.
名称会成为您系统发送的参考文献, 显示在您输入的字段下—— 例如 x_ Custom_ delivet- blowed。 它不会在之后更改, 因为某些东西已经由它发送 。
这两行是你和你的同事一年之后在模板页上读到的,价值30秒。
逗号分隔, 例如: 名称, 当, 跟踪_ link。 每个都变成一个{{variable}}您可以跳入主题或消息, 您的系统会在发送时间填入。
平话句是好的——换行符成为段落. 仅写 MESSAGE; 标志, 页眉和页脚来自全局模板.
它出现在"你的自有模板"下,带有全编辑器和活预览,与每条内置消息相同.
两次呼叫产品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"
}
}上面有“见计划”的链接,没有编辑器——所以你可以看到什么OpsIQ将会发出,什么解锁它。
选择创建时属于服务模板, 或者将其留在每个计划中。 没有该服务的工作空间会看到它列表, 但无法编辑或发送 。
从未计划。 不能修正密码的文字重设您接收的管理员, 将错失锁 。
不,是故意的。设计是包装,它被共享,这是每个邮件都能识别到的。每个消息都是文字、事实面板和您在信件中添加的任何按钮。
重置只出现在全局模板上, 它用内置设计取代编辑器中的内容。 在您按下 Save 之前, 任何内容都不会被写入, 这样您就可以关闭对话框来改变您的思维 。
删除需要两下, 完全出于这个原因 —— 第一个手臂, 告诉你什么会停止工作。 如果它已经消失, 请再次用同名和相同的引用重现它; 只有措辞必须重新打字 。
是的,一个邮箱装了个邮箱json在它自己的目录中,它的信息会出现在“开发者模板”下,并带有相同的编辑器、预览、包装和计划门。您的措辞编辑属于您的工作空间,在软件包更新后幸存。
票房以书面答复:自动回复,本土票道系统,升级,营业时间,路由和客户端邮件.
在管理员中为您的代理添加写入帮助按钮。
排出新票并回复, 并在延迟后回复。 开始检查草稿, 时间为一周。 退款、 取消和访问更改应始终送达个人 。
哪些部门可以自动重写。任何未列出的都留给一个人,这是安全默认。
等待自动回复发送多久。 即时回复读作机器人; 几分钟读作快团队。
每个部的上限,例如计费1支助处3没有盖子,一个模糊的线条可以循环。
最大写出符, 答覆后和升级后的票位状况, 自动回复的管理员记录是哪个。 使用一个明确名称的账户, 工作人员可以告诉AI 回复来自人类。
入场券系统 OpsIQ,用于没有外部服务台的安装。
将收到的邮件变成罚单。OpsIQ 提供终点 URL, 认证令牌, 脚本路径和 PHP 二进制。 任何可以发送到该端点的都可以创建门票, 所以要保密令牌 。
AI是否继续随着对话的进行而回复,以及它是否等待一个安静的窗口,这样三个快讯就能得到一个考虑的回复。 安静的窗是让自动回复感觉被考虑的最佳单一设置。
客户端页面,任何人都可以提高并跟踪一张票,可选的欢迎行。其地址和外观在支持门户标签中配置 。
生成的票号中出现多少个随机字母.
罚单邮件遵循客户语言。员工电子邮件从不改变语言:通知、部门通知、简报和预定报告使用您的系统语言。
新票的固定确认信息, 加上在打开票面、 反馈左出后和关闭票面时的确认信息。 每个票面上都有现场预览。 还有一个全局电子邮件模板包装以及视图后的联系。
屏幕来自未知发送者的票, 可以自行选择移动可疑垃圾邮件。 请在您看到其判断之前先离开自动移动 。
关闭一张在静默几天后售出的票。 在关闭信息中告诉客户如何重新打开 。
时间区、开放和关闭时间、第一重读和解析计时器的工作日和假日。客户聊天系统下与工作时间分开的日程安排。
自动分配,可选的只能给在线的代理,具有代理技能和基于技能的路由的匹配敏感性.
当顾客打开一张接近他们已有的票时,会发现一个点,并具有可调整的匹配敏感性.
关闭后一天发送一份调查邮件,结果出现在CSAT的页面上。
新票到来后,会给部门发邮件,接收者是该部门的成员,而不是部门邮箱地址,这是入境的地址票到来的地址.
主开关加单个只读权限,用于客户概况摘要、发票、交易、信用余额、产品和服务、域、链接服务器和高级账户概览。从概况摘要开始,并按答复需要添加类别。
在回答前将一张票移动到更适合的部门。您选择允许的部门、检查延迟,并可以写出自己的升级通知指示。打开内部升级通知条,以便您的团队了解为什么一个票被移动。
回复是否使用客户语言,是否引用了已爬行的链接和FAQs,AI是否读取了图像和 PDF 附件、 知识回复模式, 是否导入 JSON 使用知识,以及源链接是否可能出现。使用被爬行的链接和FAQs应该打开,或者AI在猜测。
一旦工作人员答复,AI就停止回答罚单,没有它,AI可以谈论你自己的经纪人.
自由文字指令塑造每个回复的语气和内容,并用一个可加载的范例。请具体说明AI绝对不能做什么。
上传或粘贴 a JSON 用于写作助理的知识文件。
客户界面按钮的完整设计者:显示样式、大小、标签、图标、形状、最小宽度、背景样式,主要和次要颜色、梯度角度、边框、角半径、阴影、打字、贴花、闲置动画、徘徊运动和颜色,以及焦点环,加自定义 CSS 框中输入了控件未覆盖的任何东西。
客户介绍网站,人们在那里筹集和跟踪票并阅读您的帮助文章。该标签控制了如何到达和客户如何签名;其视觉设计是在支持门户工作室进行的。
这两种产品是不同的,人们不断地把它们混为一谈。 他们解决了不同的问题, 和运行两者在一起是正常的。
工作室设计 a 完整的支持站点 OpsIQ 给您的主机。它有自己的网页地址,或你自己的域名,并带有整个自助体验:帮助文章搜索、请求表、票房历史、客户签名和助手。通过主题、导航、版式、知识、脚印、品牌、票卡、助理、表格和 CSS,在桌面、平板电脑和电话大小进行预览,然后发布。
使用它的时候 您想要一个品牌目的地,您可以指向每个客户, 您宁愿不构建或维护您的网站中的支持区域。
嵌入层 仅限您网站页面上的票证体验。客户打开、跟踪和回复支持请求,而从未离开您的页面,而您自己的页眉、导航和设计也保持原样。在部件构建器中设置布局、外观和访问规则,预览结果,然后将嵌入的片断复制到您的页面。
使用它的时候 您已经拥有一个网站或应用程序, 并且您希望支持在其中发生, 而不是将客户交给另一个地址。
工作室正在建设 你送顾客去的地方嵌入舱带出门票 到你的客户已经在哪里。许多企业同时运行,将票务部件嵌入其账户区域,用于内文请求,同时将托管门户作为完整的自助服务目的地,并进行文章搜索。它们是独立的交换机。
门户是否向任何人开放,或仅限于已签入的客户,开放门户获得更多的门票和更多的垃圾邮件.
门户和帮助中心是共享一个英雄还是使用两个英雄,这两个都会出现哪个导航和脚印,以及导航部分的标签.
顾客使用的地址 选个名字 OpsIQ 显示由此生成的门户和匹配的帮助中心地址。以后更改您已经发送的断开链接。
从您拥有的域为门户服务,例如支持. yourdomain. com.
切换上述的即时切换部件, 打开嵌入式构建器, 您选择了版式、 外观和访问规则, 预览结果并复制页面片段。 这不是 Portal Studio: 工作室设计主机门户, 这样就可以将票放在您自己的站点内。 两者可以同时打开 。
这些是您的客户登录选项。 工作人员登录配置在设置、 安全 下 。
签名页面上会显示哪些选项。 连接器和电子邮件签名自动工作 。
消费者账户提供者,每个供应商都需要客户身份和秘密,其地址由下列机构提供: OpsIQ 向供应商登记。
客户通过身份提供商与发行商签入 URL,客户端ID,秘密和一个可选的允许电子邮件域名列表.
密码 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 从远程网站找到的钩子已经将客户端签名到门户网站并处理返回地址。设置您的登录页面 URL 给您的 WHMCS 客户端区域登录 。
出入口签名也会在您的应用程序中签名客户.
请求表所收集的结构字段。 每个额外的字段都会丢失提交, 所以只询问您需要什么进行分解 。
蜂蜜壶和速率限制总是保护公共形式。在顶端,您可以屏蔽一次性电子邮件地址,添加自己的被屏蔽域,并使用 Google reCAPTCHA 或 添加 CAPTCHA 。Cloudflare Turnstile. reCAPTCHA 重用在设置,安全下已经设置的密钥; Turnsttile密钥在此输入 。
一份仅阅读的门户网站活动摘要,介绍过去30天的活动。
系统组,加上决定谁能看到哪个设置标签的团队访问控制.
每个管理员都获得一套明确的权限,涵盖聊天收件箱的访问,这些权限可以由他们编辑的章节,以及他们的部门。任何具有全管理员角色的人,总是有权限的。设置权限决定一个人看到的标签,因此给予最窄的一组,让他们工作。
显示您当前许可证、 它赋予您的权利及其状态 。
仅自备安装。OpsIQ 显示您运行的预定任务和标签被隐藏。 一条线的 Crontab 驱动每个预定任务: 自动复制票、 升级路由、 汇率刷新、 邮箱投票和连接器同步 。
标签上显示您服务器的精确的冠状线, 并带有已选择的正确的 PHP 二进制 。
运行 crontab - e 作为运行 PHP 并粘贴单行的用户。 打开 cPanel 使用 Cron Jobs 工具代替。
一分钟内心跳平板就亮了,用跑来测试而不是等待
心跳面板显示上次运行、持续时间和处理的自动重读队列以及电子邮件和连接器民意测验。它警告上一次运行来自手动网络按钮而不是真正的服务器克龙,以及心跳停止时。
抹去所有东西 OpsIQ 您选中要包含哪些内容并准确输入确认词。 设置和站点配置、被封锁的地址、您的团队所写的所有信息( 知识库、 FAQs、 翻译、 门户设计、 动作定义) 和同意收据都保存完好 。
同样的扫描仅限于记录比 30, 60, 90 或 为 180 对于自动滚动的保留,则使用通用和跟踪中的保留值,并让预定任务完成。
请团队成员,并分配角色来控制谁可以访问什么.
包括执照、账单和危险区在内的全程通行,每处安装一次。
除了执照和危险区之外,可以全程进入 管理管理员
仅限于指定部门,票房,聊天,分析等仅限.
导航到侧边栏的团队。
输入队员的电子邮件 。
选择拥有者、 完全管理员或代理 。
特工部门,请选择可进入的部门。
他们收到一封带有设置链接的电子邮件.
您的支援团队是如何表现的。 访问是允许的, 而不是角色的: 查看权限打开页面, 管理权限解锁目标, QA 和同事识别符读取, 奖励- 财务权限就是添加 Rewards 标签的。 一个团队领导可以被授予其中的任何一项, 而不会成为完整的管理员 。
团队性能是五个分页,每个分页回答不同的问题,它们被命令的顺序是:通常需要你多么迫切.
现场排队状态,客户结果与你的目标对比,能力如何使用,需要决定的情况,以及证据调整的每队指数.
领跑板,识别(最有改进和记录),追求,以及选择进入控制谁可能看到排名.
计分卡,有记录的评价,机会校正审查员协议,审查员漂移,证据纠纷.
收值,支付债权,以及受管期间分配:授权资金到位上限,审查预览,定稿.
工作空间如何随时间演变:带有图表的趋势度量,以及 28- 日覆盖热映射显示团队实际工作时,每张卡都隐藏自己,直到有足够的历史可以绘制它.
手提量不够的队友——或者其带证据的维度加起来不到所配置重量的一半——被显示为无分数。他们的分数、分数和分数都是空的,而且它们会隐藏故障。这是有意的:将一个没有的测量作为零使某人在有安静一周的排名中处于下方。证据阈值可以按照目标()评分中每个工作空间来配置。
这两个证据阈值可以做不同的工作,值得区分。 最低处理的判断是否某人得到任何分数。 最小评分不影响得分: 它决定奖和奖励资格。 因此,一个队友可以完全得分并排名,并且仍然没有资格在这段时间里获得分数,因为被评分的客户太少。
由五个维度组成的复合体,每个维度按你设定的目标而不是同僚进行衡量,然后当背后的证据很薄时拉入中间。70 因此,一个微薄的优秀得分被拉下去,一个细薄的差分被拖出去。四个对话的第一个糟糕的星期也不是一个定论。随着证据积累,调整后的数字与原始数字一致。
客户从经核实的反馈中感到满意,如果有质量保证计分卡结果,则予以补充,并对此进行管理。
第一次反应时间在P50和P90百分位,与你的目标相对.
分辨率时间和一触即发率。
B. 与《公约》SLA您已经配置了, 再加上风险和违反数。
重开和转会率——复出的工作.
占用、生产时间、每个生产小时解决和网上分享窗口。OpsIQ 没有名册或轮班源,替换分母将是一个带有百分比标志的猜测。它读作没有,并附上了这个理由。
记分卡是标题审查员对真实对话的评分。 只有已发布的版本才能得到评价,而发布新版本则永远不会重写已经得分的内容。 评论是一次对话的证据,而不是对一个人的判决。
报告为偶然修正统计(Cohen's和Fleiss' kappa),而不是原始协议百分比。100% 时间,但无信息。
评论员在同一次谈话中无论系统性的比同事更硬还是更软——与小组其他部分进行比较,而不是一个长期的趋势,需要独立地审查一次以上的互动。
团队成员可以正式争议记录的关于他们的证据。公开争议阻碍奖励期的终局化,直到解决为止。
被拒绝,队友不能提交对自己的评价.
单是排名就记录了失败模式:衡量游戏、烧死和公开羞辱最后的任何人。 三种选择都坐在一边。
以队友自己的前科衡量, 绝不以同事为标准, 缩小了,所以一个小分母不能买到赢。
连续的时期都满足固定的,宣布的条 — — 平均评级、处理量、评级计数和负反馈率,所有绝对数字。 每个人都可以同时保持一个平稳,因此没有产生排名,而拥有特殊月的同事也无法打破你的排名。
默认关闭。 队友总是看到自己的索引; 他们是否看到同事是工作空间的决定。 百分位带可以发布而不是绝对位置 。
团队努力争取的目标,以固定的申报栏而不是相互对照来衡量,这样,每个人都可以在同一时期澄清同样的追求。
个人或团队;一次性、可重复或有明确窗口的季节性。
所处理的谈话、收分、活跃日、平均评分或负面反馈率。 所有绝对值 — — 没有衡量其价值取决于同事所做的。
任何任务都需设定量目标。 击中次数而质量低于底部, 则拒绝进行任务, 而不是完成任务, 它被显示为不进行, 不是未完成的 。
由最慢标准驱动的每期上限,再加可选冷却后再重复计算.
共享进步,没有公布每队归属,因此团队追求不能成为领跑板.
教练课是记录,不是聊天。它有一个教练、一个队友正在接受教练、安排时间、商定的谈话要点以及随后写出的总结。真正的聊天、门票和QA评价被作为证据来支撑,因此对话的基础就是实际发生的工作,而不是记忆中的印象。
会前同意,所以队友不会走入出奇.
会场所附的聊天,门票和QA评价. 披针存储了参考文献——类型和代号——而不是副本,所以总是会指向现场记录.OpsIQ 在接受之前,不核实身份。
每一个都有所有者,并且有到期日。一个超过日期的项目显示为逾期——一个衍生状态,而不是必须记住的状态。
教练自己的笔记。 被教练的队友永远不能读到它 — — 而不是作为经纪人,也不是作为经理,也不是主人,支票在所有其他许可之前就已经运行,不能被推翻。
教练,队友,以及任何有管理团队表现许可的人,其他人,包括同部门的其它队友.
每个创建,更新,被针,解接和完成都记录着变化的事物,由谁负责.
记录的活动转换成有您设定的现金值的符号。 支付路径会故意缓慢, 并且记录每个步骤 。
多少个符号等于多少钱, 以及每项活动的价值。
对于一个已关闭的日历期, 完整的管理员会声明它可能支付的最大符号。 保存设置表不会授权预算, 也不能更改已经授权的上限 。
接收者、 保留者和任何不符合资格的理由。 公开的证据纠纷会阻碍这一步骤 。
分配被永久记录在它背后的证据中。 任何分配的时间都无法被取消, 并且重新直接运行。 签发符号的时间必须先倒转 :OpsIQ 写一个针对每个钱包的补偿性条目, 并且从不删除原始内容, 因此分类账中仍然显示发生的事情和原因, 只有这样才释放出时间段。 如果有人已经兑现了超过回收金额的折现, 以及姓名和金额, 则拒绝 。
其他人默认参与,团队领导和包括共同所有者。要让某人离开,在团队和部门中打开他们,并关闭“Takes”奖项和奖励选项。他们的作品仍然得分并显示;从此他们不再是候选人,任何已经定稿的作品都未触及。
工作空间的董事会、现场状态、能力和质量概览。
目标与分数,出品,质检记分卡与评价,辅导,征程,以及随身携带同事识别数据如逐个记分历史和授奖历史等读取.
余额、现金价值、索赔说明和付款参考——与履约证据分开,因为其与工资相接。
每一个货币都变异:支付奖励、支付或拒绝索赔、授权预算、最终确定、取消或撤销分配以及设定象征性现金兑付率。 这些不能通过许可来授权。
业绩指数是管理证据,而不是自动就业决定。 在采取行动之前打开数字背后的源头对话,并权衡案件的复杂性、时间安排、休假和无障碍需求。 单一困难周看起来根本不像一种持续模式。
网站( 工作空间) 允许您管理多个网站 OpsIQ 每个系统都有自己的跟踪、AI、连接器和团队访问权限。
导航到连接站点.
输入名称、域名和描述。
每个站点都获得部件片断的独有密钥( site_ xxx) 。
每个网站都有自己的AI,连接器和设置.
要看你的执照计划 检查一下执照细节
OpsIQ 许可证管制特征、场地限制和AI信用余额。
输入设置 > 许可证。对照 OpsIQ 许可服务器。
OpsIQ 通常读取其已签名的本地许可缓存, 并在需要时刷新验证。 当您需要即时结果时使用强制远程检查; 诊断识别 DNS, HTTPS 或服务器时间问题。
确定特性可用性和限制。
工作空间的最大数量 。
如果使用管理AI,你的信用余额在这里显示.
期满前续约,以避免服务中断.
追踪、机票和CRM继续。AI 特性暂停,直到更新。数据被保存。
每个管理员可以保持自己的身份,工作偏好,密码和两个因素的认证.
配置文件设置属于已签名的管理员, 并且不会更改工作空间品牌。 使用一个独特的密码并启用两个要素认证。 更改电子邮件或认证设置可能需要重新验证或更新登录 。
通知首选项控制在产品或电子邮件中传送到管理员的操作事件。
首选项覆盖售票分配、客户回复、 SLA 警告、聊天交接和AI 批准事件。 保留紧急操作信号在某个地方启用; 关闭电子邮件并不一定会关闭内应用通知 。
"安全概览"是第一个用于评估块,登录攻击,威胁会话,安全趋势和事件完整性的屏幕.
使用标题卡进行分解, 然后打开相关的审计、 失败登录、 被屏蔽 IPs 或 为 JavaScript 记录级工作的出错页。14- 一天的趋势比一个高峰更有用。在使用永久障碍之前,应对来访者、要求和认证证据进行调查。
审计日志记录了谁在何时、对哪一方提出异议、在何种风险级别以及是否成功。
通过行动、风险和行为者过滤; 导出 CSV 或 为 JSON 用于调查的散列链帮助检测缺失或被修改的审计行,但不会取代受保护的备份和限制数据库访问。将审计输出视为敏感,因为它们可能识别用户、记录和安全行动。
诊断将子系统检查转化为平正英语健康结果并指导下一步行动.
页面检查站点速度,分级/关键词/后链接/本地数据,AI和动作网关,票务,爬行者/审计,集成/活动收录,背景任务,CRM它故意报告操作者可读的原因,而不是披露原始秘密。
改变后,重新刷新和确认受影响的子系统恢复健康。 绿色诊断页是必要的,但不足以发射;同时完成发射前核对表。
OpsIQ 包含多个安全层以保护您的管理员、数据以及 API 进入。
带有可选 2FA 的电子邮件/密码.
尝试失败太多后临时锁定 。
块 IPs 或CIDR从访问跟踪网站。
基于行为的威胁得分 高威胁的访客可以自动被封禁
所有连接都需要。 HTTP 重定向到 HTPS 。
严格运输安全 防止降级攻击
所有管理形式包括CSRF的符号.
所有用户输入被逃脱. CSP头限制脚本执行.
外出网络用户屏蔽私有/ 内部 IP 地址 地址 请留言 地址
给所有管理员的账户
最低 12 字符,混数。
删除前团队成员的访问权限 。
每周检查可疑模式。
快速应用更新安全补丁 。
角色访问控制让您控制每个团队成员能做什么.
包括许可证、危险区和安装管理
除了执照和危险区之外,其他一切都行,可以管理团队
响应指定的部门门票和聊天,查看分析。没有设置、团队或安全访问。
目前没有,三个内置角色加部门任务可以控制颗粒。
管理 IP 无法访问您跟踪的网站。
示例 203.0.113.42 或 为 203.0.113.0/24
文件原因:垃圾邮件、滥用、刮取等。
如果客户共用一家公司 IP 或VPN, 屏蔽这个 IP 堵住上面的所有人 使用狭小的块
所有未成功的登录尝试 OpsIQ 管理员。
当尝试发生时。
使用的电子邮件地址 。
试取之出处.
地理位置.
密码错误, 锁定, 或者找不到 。
密码猜测。 确保启用 2FA 。
自动攻击 封锁源头 IP.
如果你的团队是本地人 外国企图就有可能是攻击
安全网页上一个选择进入的分析层:判决、事件简介、每日摘要、每周一次的姿态检查、问安全,以及0- 隐藏屏蔽政策,它从不运行在访客请求的路径。
每个安全网页记录所发生的情况,但读取它仍然需要判断。AI安全分析师补充说,判断是存在的,而且几乎是一无所成:它从来不坐入信标或登录路径,决定性规则解决明显案件而不使用AI呼叫,判决被缓存,分析师的最佳输出是决定性规则,然后永远以零符号执行。打开特性 设置→警卫; 全部默认关闭.
已封锁 IPs 和失败的登录行显示一个有信任分数的良性/ 可疑/ 敌对芯片。 解释打开推理、 使用的事实, 并单击一击块/ 释放动作 。 Cached 24h,所以重新审视一个 IP免费的。
相关事件组合成一起事件(login wave, URL 扫描、自动挡板破裂),带有一个平版英语时间表,并有一个建议下一步。持续攻击会折叠成同一事件。
一天一次:昨天与你的基线、块块、事件和唯一的事情。 平静的日子将发出一个决定性的全无信号。
星期一硬化核对表(2FA缺口、锁定门槛与实际攻击量对比、警报关闭),每件物品都具有严重程度、努力程度和精确的固定。
安全概览上的提问框,由您从运行的状态解答。 深服务器问题被交给管理员工程师聊天而不是猜测 。
分析师提出混凝土块规则作为批准/解除卡;核准的规则以活打计数器在零符上执行. 任择自动驾驶只自动批准最安全的规则.
主开关。 启用判定芯片、 解释和询问安全 。IPs 到达模型, 分批为一个呼叫。
将事件组合成事件, 并写出每个新故事。 运行在现有的小时安全卡通上 。
钟和"概览"每天重播一次 静悄悄的日子一无所获
星期一在概览上加硬化核对表,该核对表具有完全的决定性意义。
让分析师激活其最安全的建议, 无人考虑: 仅可逆的有时间限制的块, 单 IPs 或范围不超过 /24, 从未共享/ 移动/ 私有, 封顶 10 每小时,总是经审计和可撤销的。
OpsIQ 使用一款产品调度器来运行电子邮件投票,票务自动化,分析滚动,保留,AI队列,CRM工作,报告和接通工作.
为运行的同一服务器和 PHP 环境添加此单行到 crontab OpsIQ:
* * * * * 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.
处理适当的自动复制、升级、批准和其他排队的产品工作。
投票者配置了信箱,其中投票是选取的收受方法.
集合会话,在预定的会话到期后刷新会话总量.
运行已启用的评分、生命周期、工作流程、竞选和计划报告任务。
做好清理,档案,期满和廉洁工作.
仅为安装、启用和配置的连接器发送连接器用户和投票。
/tmp/opsiq-cron.log 或手动运行失败时选择的日志路径。保持连接器处理器短,能分解并工作空间范围. 批量长同步并存储光标/检查点,以便下个运行能够安全地继续.
一个主持人 OpsIQ 部署使用相同的产品屏幕和工作流程,而主机操作员管理服务器层。商业注册、计划、账单和账户门户程序不在本手册之内。
不要假设管理服务意味着每个产品集成都是健康的。 请与托管运营商确认最新的备份证据和保留政策, 并使用 OpsIQ 更改后诊断 DNS,电子邮件,AI提供者,网站或连接器.
商业上线、订阅、计费和客户帐户管理仍然不在此部分的范围之内。OpsIQ 手册。
自办的 OpsIQ 安装运行在您控制的基础设施上。您负责运行时间、数据库、TLS、产品折叠物、备份、更新和监测。
ưμ㼯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 产品排程器每分每分,应用程序配置和数据库访问与网络进程相同。
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
运行的核对表和最佳做法 OpsIQ 生产中。
SSL 安装, HTTP 重定向, HSTS 启用 。
通过诊断页验证.
以顾客身份聊天,检查准确度和语气
所有网页上都使用 Live Feed 验证 。
每日自动数据库和文件备份。
PHP 错误日志启用并监视 。
所有成员都有正确角色的叙述。
起码5-10 条款。
在发布或首次生产启动前运行源码门并完成真实产品检查。 可用的命令不是在您环境中传递的证据 。
从安装根运行寄存器检查,并保持其完整输出与放出记录.
php tools/preflight.php
php tools/release_gate.php
飞行前检查 PHP 8.4 运行时间和所需的扩展,执行 PHP 语法扫描,运行AI 评估船门和完整的 PHBUnit 套件,并在安装这些工具时运行 PHpStan/Node 检查。扩展的闸门还包括烟雾、清洁站/schema 和浏览器在配置其环境时的端到端检查。
跳过检查不是通过。 请记录它为什么无法使用, 安装缺失的依赖性, 或在释放前正确的 CI/ stage 环境中运行它 。
签名为每个预定角色;核实允许和拒绝的页面/动作.
在私人浏览器中装入一个真实的站点; 验证信标流量, Live Feed, 访问者和会话记录.
提出具有代表性的问题;核实知识的立足点、安全性、升级和AI的历史。
通过每个启用的录入路径创建,指定,回复,升级,关闭并重新打开.
测试出入境的发送, 以及每个配置的入入境邮箱或网路路径 。
创建控制下的接触/交易/转换,并核查仪表板、漏斗、分数和报告。
运行连接测试, 一个读取, 一个安全写入/干运行, 以及每个启用连接器的网络hook/ poling路径 。
核查窄范围、速率限制、一等功率重试、签名和重复处理。
运行统一产品调度器,确认所有 Cron Setup/Diagnostics 中所需的心跳.
验证2FA,CSRF/会话控制,审计分录,密钥吊销和工作空间隔离.
将当前备份恢复到单独的测试环境并验证数据和配置.
确认日志/警报,保存请求的ID并证明回滚程序.
浏览器按下通知(包括 OpsIQ 推动运动(Push Campaigns)需要一名服务人员从南方生产总公司获得服务。OpsIQ 从您的部件加载 OpsIQ,因此第三方站点无法注册 OpsIQ 直接的工人。 在站点的域中主机一个小文件, 以便推到站点。 运动会通过支持的两种方法来传送 。
浏览器只允许页面从自己的来源注册服务人员。部件从您自定义的源头中加载 OpsIQ 部署,所以它不能在客户站点上安装推手,直到您在该站点的源头上托管工人,部件静悄悄地跳过推手(没有出错,没有订阅). 您下面有两个选项;OpsIQ 推动运动通过两种方式发表。
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). 部件然后向访客请求通知许可并订阅它们.
/opsiq-push-sw.js 返回 HTTP 200 (如果是的话,请清除缓存)404 在上传之前; 缓存 404(将屏蔽注册).1. 单位 OpsIQ 设置将驱动提供者设置为 推放电线 并进入你的圆柱 实例标识 财务报告和已审计财务报表 密钥.
2. 现场的Beams服务员是 /service-worker.js复制 https://YOUR-OPSIQ/opsiq/pusher-beams-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 History 中审查对话 。
取决于:提供者 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代理.
带上自己的钥匙,你自己提供人工智能 API 键。
将外部平台整合到 OpsIQ 的插件.
顾客满意分数。
收入机会CRM.
线路和出入控制门票类别.
将一张票搬到不同的部门,或者从AI转到人类.
访客位置检测 IP 地址,请问...
把谈话从AI转移到人类身上
签名签名, 显示网站访问者的身份 。
文章AI用来回答问题.
来客显示购买意图。
0-100 数字表示转换可能性。
顾客所在的地方:铅,出自"前","客户",有"危",Chorned.
作为《公约》一部分提供的大赦国际 OpsIQ 计划。
视觉交易板阶段。
角色访问控制。
在超时窗口内的一系列页面浏览.
跟踪网站的独特标识符。
服务级别协议,目标响应时间.
AI 文本的单位。大致4字符 = 数字1符号。
控制AI自主的安全系统.
HTTP 回调事件通知 。
JavaScript 密码嵌入在您的网站上。
一个有自己的追踪器,AI,连接器,和团队的网站,和"站"一样.
如果本文件没有回答您的问题:
点击“问” OpsIQ 在管理员中。可以访问此文档和您的平台数据。
包括:你尝试过的东西,发生的事情,你期望的,以及任何错误的信息.
电子邮件支持您的许可证密钥和问题描述 。
哪个管理页面( E)URL 或名称).
精确设置名称和当前值 。
精确的带有代码的错误消息 。
你做了什么,一步一步来。
会发生什么,而发生什么。