MarketUP管理

Marketup CRM - detail/list search, advanced filtering, create, modify, assignment flows, history/behavior lookup, lead-to-account conversion, tags, and pool configuration workflows.

Audits

Pass

Install

openclaw skills install marketup-uc

全局约束(最高优先级)

  • 在执行任何 Marketup API 调用前,先检查 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.cn
  • 凡用 curl 请求后端接口,必须带请求头:Authorization: $MARKETUP_API_KEYReferer: MarketUP-Skills
  • GET 的查询参数:使用扁平参数名;不要在参数名前加 leadsRPO.companyUserRPO.rpo. 等前缀(与代码里的包装对象名无关)。
  • POST 且 body 为 JSON 时:Content-Type: application/json,body 用 -d @file.json-d '{...}'
  • 失败时仅输出 HTTP 状态码或响应 JSON 的 message(无 message 时用 code),不推测原因。

表单实体类型(查询字段定义)

GET /api/uc-open/formField/queryCurrentFields 使用查询参数 marketEntityType数字):线索 0、客户 2、联系人 3。其它实体类型见 OpenAPI。


1. 搜索线索

  • 从用户话里取手机号或名称关键词;优先手机号
  • 线索总数:用户问「有多少条线索」等时,用列表接口:page=1size=1,不传搜索条件(或仅依赖后端默认),从响应中取总条数字段(如 data.totalElements)回答。
  • 排序:用户明确要求按某字段排序时,传 sortsortType(与后端约定一致);无需求不传。
  • 展示:线索名称、联系人、手机、负责人、状态、创建时间。

接口GET https://uc.marketup.cn/api/uc/v1/crm/leads/list
常用查询参数示例:pagesizetype-1 表示全部线索)、searchValuecellphoneleadsNamesortsortTypemultipleGroupAdvancedQueryFilter(高级筛选 JSON 字符串)。

快捷按名单/手机搜GET https://uc.marketup.cn/api/uc/v1/crm/leads/searchLeadsByNameOrCellphone,查询参数 searchValue


2. 高级筛选搜索线索

当条件超出手机/名称(时间、来源、标签、行为等)时:

  1. 根据用户描述构造一条符合后端要求的高级筛选 JSON 字符串(可与用户对齐字段含义);意图类型可覆盖:线索属性、标签、来源、行为记录等。
  2. 调用列表接口,将 JSON 字符串放在查询参数 multipleGroupAdvancedQueryFilter;不要同时用手机/名称参数替代该 JSON(除非用户还要叠加简单条件,按后端能力传)。
  3. 需要排序时传 sortsortType
  4. 结果展示同普通搜索。

3. 创建线索

流程:取字段定义 → 收集并映射为 formFieldId → 调创建接口

第一步 GET /api/uc-open/formField/queryCurrentFields?marketEntityType=0
记录 formFieldIdshowNamerequireddataTypeoptions

第二步 构建 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(对象)、coverInfogenCompanyAccountassignTypeautoAssignnotAssignownerCompanyUserIdsourceChannelIdremark(可选,结构同跟进里的备注对象)等。
分配语义(互斥,与工具一致):

  • 不分配:notAssign: true
  • 按规则自动分配:assignType: 1autoAssign: true
  • 指定成员:assignType: 2ownerCompanyUserId 为员工的 companyUserId(先搜员工或取当前用户)
  • 用户未说明分配方式:可不传分配相关字段,由后端默认

创建成功后若有 leadsId 一并告知用户。


4. 修改线索字段

  • 解析目标线索(ID;若只有手机/名称则先列表搜索,唯一则取 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>" }
  • 多字段依次请求,最后汇总成功/失败(失败原因仅来自接口响应,不臆测)。

5. 添加跟进记录

  • 已知 leadsId:直接调接口;仅手机/名称则先搜索确认 leadsId
  • 无跟进内容请用户补充。

接口POST https://uc.marketup.cn/api/uc/v1/crm/leads/addOrUpdate/remark
Body(与 LeadsRemarkSaveRPO 一致):leadsIdremark(必填)、historyId(可 null)、attachments(可 null)、type_id(跟进类型,可选)。


6. 查询线索详情

  • 识别正整数 leadsId;有歧义时先问清再请求。

接口GET https://uc.marketup.cn/api/uc/v1/crm/leads/<leadsId>/detail

成功时建议按下面结构展示(字段为空则省略该行):

线索详情 #<leadsId>

  • 线索名称联系人 / 手机 / 邮箱地区
  • 状态阶段负责人SDR创建人
  • 来源线索池评分
  • 创建时间最近跟进跟进记录数未跟进天数分配时间转化时间
  • 标签(逗号分隔)、关联企业待办(名称、状态、截止日期、负责人)

7. 分配 / 取消分配线索

  • 分配:用户给姓名/手机号但未给 companyUserId 时,先 GET /api/uc-open/v1/company/user/team/list(扁平查询:pagesizesearchValueleadsManageType 等),结果唯一则取 companyUserId,再分配;多条则请用户选择。
  • 接口POST https://uc.marketup.cn/api/uc/v1/crm/leads/assign
    • URL 查询参数:leadsId;若分配则加 companyUserId,取消分配则不传 companyUserId
    • Body JSON(LeadsAssignRPO):reasontype(无则 null)。

8. 查询跟进历史

  • 需先确定 leadsId

接口GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/remarkHistoryList
扁平查询参数(与 HistoryPageRPO 字段一致,不要 rpo. 前缀):如 pagesizesortsortTypestartTimeendTimehistoryTypeEnum=LEADS_HISTORYid=<leadsId> 等。

展示:每条一行 createTimeoperatorNameremark(有附件可标「含附件」);说明总条数,若本页小于总数可提示缩小时间范围或翻页。


9. 查询修改历史

  • 需先确定 leadsId

接口GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/entityChangeHistoryList
查询参数同上一节扁平形式,historyTypeEnum=LEADS_HISTORYid=<leadsId>

展示:每条一行 createTimeoperatorName为 null 时显示「系统」,禁止编造人名)、operatorTypeLabelpropertyNamepreValueafterValuepreValue 空显示「(空)」;有 description 可优先展示;reason 非空追加原因。


10. 查询行为轨迹

  • 需先确定 leadsId

接口GET https://uc.marketup.cn/api/uc/v1/crm/historyRecord/behaviorRecordList
查询参数同上扁平形式,historyTypeEnum=LEADS_HISTORYid=<leadsId>

展示:每条一行 createTimebehaviorNamedetailMessagedescription;有 duration 可标耗时;有 visitorNickName / 关联账户名可追加。


11. 线索转客户

用户表达「转客户」「转化」等时:

  1. 确认 leadsId(必要时先搜索);GET .../crm/leads/<id>/detail 取线索上可映射的字段(名称、手机、邮箱等)。
  2. 并行取表单字段GET .../queryCurrentFields?marketEntityType=2(客户)、marketEntityType=3(联系人)。
  3. accountInfo:key 为客户表单的 formFieldId 数字字符串;值优先用户输入,否则用线索字段映射(客户名←线索名、联系人←线索联系人名、手机、邮箱等)。
  4. contacts:默认用线索 namecellphone 填入联系人表单中「姓名/手机」对应字段(先按 showName 匹配 formFieldId);仅当线索姓名与手机均为空时才向用户要联系人;用户明确说没有联系人且线索也无联系人信息时可传空数组 []
  5. companyUserId:用户未指定负责人则 GET /api/uc-open/v1/user/currentUser 取当前用户对应负责人 id;指定了员工则先搜员工列表取 companyUserId
  6. 接口POST https://uc.marketup.cn/api/uc/v1/crm/leads/leadsConvertAccount
    Body JSON:{ "leadsId", "accountInfo", "contacts", "companyUserId" }(与 LeadsAccountSaveRPO 一致)。

成功后说明结果,有 accountId 则展示。


12. 给线索打标签 / 移除标签

  • 需要 leadsId + tagId。无 leadsId 时先搜索确认。
  • 若用户只给标签名称,说明需要 tagId,请用户提供或从标签管理渠道查询。

添加POST https://uc.marketup.cn/api/uc/v1/crm/leads/addTag,查询参数 leadsIdtagId
移除POST https://uc.marketup.cn/api/uc/v1/crm/leads/deleteTag,查询参数 leadsIdtagId


13. 查询线索公海

用户提到「公海」「未领取」等。

接口GET https://uc.marketup.cn/api/uc/v1/crm/leads/list
查询参数与工具一致的核心组合:type=5leadPoolId=-1convertedStatus=0,以及 pagesizesearchValue(可选)、sortsortType(可选)。
展示字段同普通搜索。


14. 领取公海线索

接口POST https://uc.marketup.cn/api/uc/v1/crm/leads/receive,查询参数 leadsId
leadsId 时可先公海列表搜索,唯一则领取。


15. 退回线索到公海

接口POST https://uc.marketup.cn/api/uc/v1/crm/leads/discard
Body JSON(DiscardLeadsRPO):leadsIdreturnLead: truereason(可选)、giveUpReasonIdtagIdattachments 等按工具传 null 即可。


16. 查询线索公海配置

用户问「公海规则」「领取限制」「回收」等。

接口GET https://uc.marketup.cn/api/uc/v1/leads/leadPool/-1(默认池 -1,与工具一致)

展示建议(与 agent 一致):

  • 领取规则 visibleRuleALL_LEADS / RECYCLED_AND_REJECT_LEADS / RECYCLED_LEADS / NONE_LEADS 对应文案:全部无负责人开放;仅收回与拒收;仅收回;均不开放。
  • 领取限制 receiveLimit:true/false → 已开启/已关闭
  • 自动回收 autoRecycle
  • 生效时间executeTimeleadMinCreateTime
  • 回收规则列表:name、天数小时、stateNOT_FLOW_UP / NO_BUSINESS_CHANCE / NOT_UPDATE_FOLLOW_UP_RECORD 等对应文案)
  • null 字段省略对应行。

17. 查询客户详情(crmAccountAgent)

  • 从用户输入中识别 accountId(正整数),有歧义先确认再请求。

接口GET https://uc.marketup.cn/api/uc/v1/account/accountDetail/<accountId>(可带 abmType

展示建议(空值省略):

  • 客户名称、负责人、来源、客户类型
  • 创建时间、最近更新时间
  • 已收款 / 总金额 / 未开票金额
  • 标签(tagName 列表)
  • 联系人(name / cellPhone / email / title)
  • 商机(chanceName / predictPrice / expireTime)
  • 关联线索(leadsName)
  • 待办事项(name / status / estimatedCompletionDate)

18. 查询客户列表(crmAccountAgent)

  • 常规筛选:名称关键词、业务阶段、负责人、客户 ID、排序等。
  • 若用户说「某人负责的客户」,先查员工列表拿 companyUserId,再筛客户。
  • 结果建议展示:客户名称、负责人、手机、邮箱、标签、联系人、未跟进天数、创建时间(空值省略)。

接口GET https://uc.marketup.cn/api/uc-open/v1/account/list

常用扁平查询参数(不要 rpo. 前缀):

  • pagesize
  • searchValue
  • stageId
  • accountId
  • companyUserId
  • sortsortType
  • multipleGroupAdvancedQueryFilter(高级筛选 JSON 字符串)

19. 高级筛选搜索客户(crmAccountAgent)

当用户条件超出名称范围(时间、标签、来源、动态属性等)时:

  1. 根据用户意图构造高级筛选 JSON 字符串(账户场景)。
  2. 调客户列表接口,把 JSON 放进 multipleGroupAdvancedQueryFilter
  3. 需要排序时再传 sort / sortType
  4. 结果展示同普通客户列表。

20. 创建客户(crmAccountAgent)

流程:取字段定义(并行)→ 构建 accountInfo → 构建 contacts → 创建

  1. 字段定义:
    • GET /api/uc-open/formField/queryCurrentFields?marketEntityType=2(ACCOUNT)
    • GET /api/uc-open/formField/queryCurrentFields?marketEntityType=3(CONTACT)
  2. accountInfo
    • key 必须是 ACCOUNT 字段的 formFieldId 数字字符串,value 为用户值。
    • 必填缺失需先补齐;枚举值需在 options 范围内。
  3. contacts
    • 自动从用户输入提取联系人姓名/手机号并映射 CONTACT 的 formFieldId;
    • 支持多联系人;
    • 用户未提供联系人信息时传 [],不强行追问。
  4. 创建接口:
    • POST https://uc.marketup.cn/api/uc/v1/account/saveV2
    • JSON body 关键字段:accountInfocontactsaccountType(可选,DEFAULT_TYPE / ABM_TYPE)。

21. 修改客户信息(crmAccountAgent)

流程:取 ACCOUNT 字段定义 → 按字段逐条修改

  1. GET .../queryCurrentFields?marketEntityType=2,匹配目标字段的 formFieldId
  2. 每次只改一个字段,多个字段串行调用。
  3. 修改接口:
    • POST https://uc.marketup.cn/api/uc/v1/account/modify/profileData?accountId=<id>
    • body:{ "formFieldId": <number>, "value": "<string>" }
  4. 特殊处理:
    • 当目标字段是“客户所有人 / 负责人”(如 field_name = user_select),先查员工列表拿 companyUserId,再把该 ID 字符串作为 value 传入。

22. 查询客户公海配置(crmAccountAgent)

用户提到客户公海规则/配置/领取限制/回收规则时:

接口GET https://uc.marketup.cn/api/uc/v1/account/accountPool/-1

展示建议:

  • 领取规则 visibleRule
    • ALL_ACCOUNT:对所有成员开放
    • NONE_ACCOUNT:不对成员开放
  • receiveLimit:已开启/已关闭
  • autoRecycle:已开启/已关闭
  • 生效时间:executeTimeaccountMinCreateTime
  • 回收规则:逐条展示 namestagedayhourstate
    • 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
扁平查询:pagesizesortsortTypesearchValueleadsManageTypeSDR | SALE | NOT_PARTICIPATE_ASSIGN)等。


附:references(详细 curl / jq)