MARKETUP_API_KEY 是否已存在于当前环境。MARKETUP_API_KEY,先执行 references/setup-marketup-api-key.md 中定义的脚本流程,由脚本提示用户输入并写入全局 ~/.openclaw/.env。MARKETUP_API_KEY 缺失时,必须由 agent 直接执行 脚本流程;不要把脚本命令发给用户让用户手动执行。MARKETUP_API_KEY:存在则继续任务;仍不存在则 停止所有 Marketup API 调用,仅告知用户需先完成 API Key 配置并提示可重试。https://uc.marketup.cncurl 请求后端接口,必须带请求头: Authorization: $MARKETUP_API_KEY、 Referer: MarketUP-Skills。GET 的查询参数:使用 扁平 参数名; 不要 在参数名前加 leadsRPO.、 companyUserRPO.、 rpo. 等前缀(与代码里的包装对象名无关)。POST 且 body 为 JSON 时: Content-Type: application/json,body 用 -d @file.json 或 -d '{...}'。message(无 message 时用 code),不推测原因。GET /api/uc-open/formField/queryCurrentFields 使用查询参数 marketEntityType( 数字):线索 0、客户 2、联系人 3。其它实体类型见 OpenAPI。
page=1、 size=1,不传搜索条件(或仅依赖后端默认),从响应中取总条数字段(如 data.totalElements)回答。sort、 sortType(与后端约定一致);无需求不传。接口: GET https://uc.marketup.cn/api/uc/v1/crm/leads/list
常用查询参数示例: page、 size、 type( -1 表示全部线索)、 searchValue、 cellphone、 leadsName、 sort、 sortType、 multipleGroupAdvancedQueryFilter(高级筛选 JSON 字符串)。
快捷按名单/手机搜: GET https://uc.marketup.cn/api/uc/v1/crm/leads/searchLeadsByNameOrCellphone,查询参数 searchValue。
当条件超出手机/名称(时间、来源、标签、行为等)时:
multipleGroupAdvancedQueryFilter;不要同时用手机/名称参数替代该 JSON(除非用户还要叠加简单条件,按后端能力传)。sort、 sortType。流程: 取字段定义 → 收集并映射为 formFieldId → 调创建接口。
第一步 GET /api/uc-open/formField/queryCurrentFields?marketEntityType=0
记录 formFieldId、 showName、 required、 dataType、 options。
第二步 构建 leads:key 必须是 数字字符串形式的 formFieldId(如 "17263687"),value 为用户填写值; 禁止 用中文名或 cellphone 等逻辑名做 key。
必填缺失要列出字段名请用户补;枚举类值须在 options 范围内。
第三步 POST https://uc.marketup.cn/api/uc/v1/crm/leads/saveLeads
JSON body 使用 LeadsSaveRPO 形态,与工具一致的核心字段包括: type(单条保存为 1)、 leads(对象)、 coverInfo、 genCompanyAccount、 assignType、 autoAssign、 notAssign、 ownerCompanyUserId、 sourceChannelId、 remark(可选,结构同跟进里的备注对象)等。
分配语义(互斥,与工具一致):
notAssign: trueassignType: 1 且 autoAssign: trueassignType: 2 且 ownerCompanyUserId 为员工的 companyUserId(先搜员工或取当前用户)创建成功后若有 leadsId 一并告知用户。
leadsId,多条请用户确认)。GET .../queryCurrentFields?marketEntityType=0,用 showName 匹配得到 formFieldId;禁止用字段名调修改接口。POST https://uc.marketup.cn/api/uc/v1/crm/leads/modify/profileData?leadsId=<id>,body JSON: { "formFieldId": <number>, "value": "<string>" }。leadsId:直接调接口;仅手机/名称则先搜索确认 leadsId。接口: POST https://uc.marketup.cn/api/uc/v1/crm/leads/addOrUpdate/remark
Body(与 LeadsRemarkSaveRPO 一致): leadsId、 remark(必填)、 historyId(可 null)、 attachments(可 null)、 type_id(跟进类型,可选)。
leadsId;有歧义时先问清再请求。接口: GET https://uc.marketup.cn/api/uc/v1/crm/leads/<leadsId>/detail
成功时建议按下面结构展示(字段为空则省略该行):
线索详情 #
companyUserId 时,先 GET /api/uc-open/v1/company/user/team/list(扁平查询: page、 size、 searchValue、 leadsManageType 等),结果唯一则取 companyUserId,再分配;多条则请用户选择。POST https://uc.marketup.cn/api/uc/v1/crm/leads/assign
leadsId;若分配则加 companyUserId,取消分配则 不传 companyUserId。LeadsAssignRPO): reason、 type(无则 null)。leadsId。接口: GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/remarkHistoryList
扁平查询参数(与 HistoryPageRPO 字段一致, 不要 rpo. 前缀):如 page、 size、 sort、 sortType、 startTime、 endTime、 historyTypeEnum=LEADS_HISTORY、 id=<leadsId> 等。
展示:每条一行 createTime、 operatorName、 remark(有附件可标「含附件」);说明总条数,若本页小于总数可提示缩小时间范围或翻页。
leadsId。接口: GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/entityChangeHistoryList
查询参数同上一节扁平形式, historyTypeEnum=LEADS_HISTORY, id=<leadsId>。
展示:每条一行 createTime、 operatorName( 为 null 时显示「系统」,禁止编造人名)、 operatorTypeLabel、 propertyName、 preValue → afterValue; preValue 空显示「(空)」;有 description 可优先展示; reason 非空追加原因。
leadsId。接口: GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/behaviorRecordList
查询参数同上扁平形式, historyTypeEnum=LEADS_HISTORY, id=<leadsId>。
展示:每条一行 createTime、 behaviorName、 detailMessage 或 description;有 duration 可标耗时;有 visitorNickName / 关联账户名可追加。
用户表达「转客户」「转化」等时:
确认 leadsId(必要时先搜索); GET .../crm/leads/<id>/detail 取线索上可映射的字段(名称、手机、邮箱等)。
并行取表单字段: GET .../queryCurrentFields?marketEntityType=2(客户)、 marketEntityType=3(联系人)。
accountInfo:key 为客户表单的 formFieldId 数字字符串;值优先用户输入,否则用线索字段映射(客户名←线索名、联系人←线索联系人名、手机、邮箱等)。
contacts:默认用线索 name、 cellphone 填入联系人表单中「姓名/手机」对应字段(先按 showName 匹配 formFieldId); 仅当 线索姓名与手机均为空时才向用户要联系人;用户明确说没有联系人且线索也无联系人信息时可传空数组 []。
companyUserId:用户未指定负责人则 GET /api/uc-open/v1/user/currentUser 取当前用户对应负责人 id;指定了员工则先搜员工列表取 companyUserId。
接口: POST https://uc.marketup.cn/api/uc/v1/crm/leads/leadsConvertAccount
Body JSON: { "leadsId", "accountInfo", "contacts", "companyUserId" }(与 LeadsAccountSaveRPO 一致)。
成功后说明结果,有 accountId 则展示。
leadsId + tagId。无 leadsId 时先搜索确认。tagId,请用户提供或从标签管理渠道查询。添加: POST https://uc.marketup.cn/api/uc/v1/crm/leads/addTag,查询参数 leadsId、 tagId。
移除: POST https://uc.marketup.cn/api/uc/v1/crm/leads/deleteTag,查询参数 leadsId、 tagId。
用户提到「公海」「未领取」等。
接口: GET https://uc.marketup.cn/api/uc/v1/crm/leads/list
查询参数与工具一致的核心组合: type=5、 leadPoolId=-1、 convertedStatus=0,以及 page、 size、 searchValue(可选)、 sort、 sortType(可选)。
展示字段同普通搜索。
接口: POST https://uc.marketup.cn/api/uc/v1/crm/leads/receive,查询参数 leadsId。
无 leadsId 时可先公海列表搜索,唯一则领取。
接口: POST https://uc.marketup.cn/api/uc/v1/crm/leads/discard
Body JSON( DiscardLeadsRPO): leadsId、 returnLead: true、 reason(可选)、 giveUpReasonId、 tagId、 attachments 等按工具传 null 即可。
用户问「公海规则」「领取限制」「回收」等。
接口: GET https://uc.marketup.cn/api/uc/v1/leads/leadPool/-1(默认池 -1,与工具一致)
展示建议(与 agent 一致):
visibleRule: ALL_LEADS / RECYCLED_AND_REJECT_LEADS / RECYCLED_LEADS / NONE_LEADS 对应文案:全部无负责人开放;仅收回与拒收;仅收回;均不开放。receiveLimit:true/false → 已开启/已关闭autoRecycleexecuteTime、 leadMinCreateTimename、天数小时、 state( NOT_FLOW_UP / NO_BUSINESS_CHANCE / NOT_UPDATE_FOLLOW_UP_RECORD 等对应文案)accountId(正整数),有歧义先确认再请求。接口: GET https://uc.marketup.cn/api/uc/v1/account/accountDetail/<accountId>(可带 abmType)
展示建议(空值省略):
companyUserId,再筛客户。接口: GET https://uc.marketup.cn/api/uc-open/v1/account/list
常用扁平查询参数(不要 rpo. 前缀):
page、 sizesearchValuestageIdaccountIdcompanyUserIdsort、 sortTypemultipleGroupAdvancedQueryFilter(高级筛选 JSON 字符串)当用户条件超出名称范围(时间、标签、来源、动态属性等)时:
multipleGroupAdvancedQueryFilter。sort / sortType。流程: 取字段定义(并行)→ 构建 accountInfo → 构建 contacts → 创建。
字段定义:
GET /api/uc-open/formField/queryCurrentFields?marketEntityType=2(ACCOUNT)GET /api/uc-open/formField/queryCurrentFields?marketEntityType=3(CONTACT)accountInfo:
formFieldId 数字字符串,value 为用户值。contacts:
[],不强行追问。创建接口:
POST https://uc.marketup.cn/api/uc/v1/account/saveV2accountInfo、 contacts、 accountType(可选, DEFAULT_TYPE / ABM_TYPE)。流程: 取 ACCOUNT 字段定义 → 按字段逐条修改。
GET .../queryCurrentFields?marketEntityType=2,匹配目标字段的 formFieldId。POST https://uc.marketup.cn/api/uc/v1/account/modify/profileData?accountId=<id>{ "formFieldId": <number>, "value": "<string>" }field_name = user_select),先查员工列表拿 companyUserId,再把该 ID 字符串作为 value 传入。用户提到客户公海规则/配置/领取限制/回收规则时:
接口: GET https://uc.marketup.cn/api/uc/v1/account/accountPool/-1
展示建议:
领取规则 visibleRule:
ALL_ACCOUNT:对所有成员开放NONE_ACCOUNT:不对成员开放receiveLimit:已开启/已关闭
autoRecycle:已开启/已关闭
生效时间: executeTime、 accountMinCreateTime
回收规则:逐条展示 name、 stage、 day、 hour、 state
NOT_FLOW_UP:从未跟进NO_BUSINESS_CHANCE:无商机NOT_UPDATE_FOLLOW_UP_RECORD:未更新跟进记录GET https://uc.marketup.cn/api/uc-open/v1/user/currentUser
用于「分配给我」、转客户默认负责人等场景;响应里当前员工标识一般为 data.uid(与分配接口里的 companyUserId / ownerCompanyUserId 对应关系以实际 JSON 为准)。
GET https://uc.marketup.cn/api/uc-open/v1/company/user/team/list
扁平查询: page、 size、 sort、 sortType、 searchValue、 leadsManageType( SDR | SALE | NOT_PARTICIPATE_ASSIGN)等。