客户.io CLI(cio(中文(简体) )
客户首个CLI.io APIs.
800+出行路线+100+CDP 管道路线,每端码为0. 单人 cio api <path> 命令覆盖每个终点。 每个命令都会返回结构化的JSON来出局. 每个错误都会将结构化的JSON返回到 stderr.
AI代理是主要消费者. 使用 cio schema 在召唤他们之前先回顾一下终点.
安装
npm i -g @customerio/cli
cio --help
要从源头构建 :
go install github.com/customerio/cli@latest
卸载
# If installed via npm
npm uninstall -g @customerio/cli
# If installed via go install
rm -f "$(go env GOPATH)/bin/cio"
要删除已存储的证书和缓存数据 :
rm -rf ~/.cio
安装代理技能
这回转船a SKILLL.MD (英语) 所以克劳德代码,光标,代码,Windsurf,以及其他支持的代理 打开代理技能 懂得驾驶CLI.
CLI 可以直接安装当前技能 :
# Installs the bootstrap skill; prompts for global (~/.claude, ~/.agents)
# vs. project (./.claude, ./.agents)
cio skills install
cio skills install --global # install for every project
cio skills install --project # install into the current directory
cio skills install --target claude # Claude Code only (use --target codex for Codex)
cio skills install --dry-run # show what would be written
cio skills install --force # overwrite an existing SKILL.md
这只安装了Client.io riottrap技能——它的 SKILL.md 路由索引写入 <target>/skills/<name>/ 克劳德代码( Claude Code) (.claude和公开代理技能公约(.agents)克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克克 所有其他参考文献(Journey, CDP, Design Studio, 配方)均由后端服务,并按要求通过 cio skills read <skill>,因此没有其它内容是本地复制的,内容保持不变.
或者通过开放代理技能工具安装:
npx skills add customerio/cli
认证
使用CLI 软件 服务账户符号 (单位:千美元)sa_live_...用于认证。 这些通过OAuth 2.0客户端证书交换短寿命的JWT,就像 gh auth。 。 。 .
新到客户。 io?
从 CLI 创建账户 . start 电子邮件给您一个6位数的代码,以及
verify 检查它,创建账户并保存其证书,所以你
之后不需要登录.
cio auth signup start --json '{"email":"[email protected]"}'
cio auth signup verify --json '{
"email": "[email protected]",
"code": "123456",
"company_name": "Acme",
"first_name": "Ada",
"last_name": "Lovelace",
"data_center": "us"
}'
data_center 实值 us 或者说 eu。AI代理可以为用户运行此功能; 完整
流量在 cio skills read cio/auth.md。 。 。 .
登录
# Interactive — prints the browser login URL, then prompts for the minted token
cio auth login
# Read from stdin (for CI/automation; login still auto-discovers region)
echo "$SA_TOKEN" | cio auth login --with-token
# Verify auth works
cio auth status
# Print raw token
cio auth token
# Logout
cio auth logout
调试解析命令
--token旗帜(最高优先级)CIO_TOKEN环境变量~/.cio/config.json文件( 最低优先级)
使用时 CIO_TOKEN 或者说 --token 直接根据正常命令,您可以
还需要 CIO_REGION=us|eu 或者说 --api-url。 。 。 .
简介
保留多个证书集——生产,中转,多个客户账户 在一个配置文件中,并在它们之间切换。 每张相片都有自己的标语, 区域,以及可选的自定义基础 URL.
# Log into a named profile (custom --api-url is remembered; switches to it)
echo "$STAGING_TOKEN" | cio auth login --profile staging --with-token --api-url https://<staging-host>
# List profiles (the saved default is marked current)
cio profile list
# Use a profile for one command…
cio --profile staging api /v1/campaigns
# …or a whole session
export CIO_PROFILE=staging
# Change the default, or remove a profile
cio profile use default
cio profile remove staging
剖面分辨率 : --profile 旗帜 □ CIO_PROFILE * 储存 current_profile
→ default中,将移动到 default
配置自动。 配置文件名称可能包含字母,数字, ., (中文(简体) ), -, (中文(简体) ),
财务报告和审定财务报表 _。 。 。 .
cio auth login 无 --profile 重新校正任何配置文件
目前选中, 并不总是 default - 通过 --profile <name> 目标a
具体一个. cio profile list 标记已保存的默认值( e)current_profile, (中文(简体) ),
每个命令 --profile 编号 : CIO_PROFILE 覆盖不变 .
如何运作
- 您提供服务账户代号( Y)
sa_live_...从客户.io UI 账户设置 管理API证书 服务账户),或cio auth signup verify为新账户保存一个 - CLI通过JWT交换
POST /v1/service_accounts/oauth/token - JWT 本地缓存, 过期时自动刷新
- 所有 API 调用
Authorization: Bearer <jwt>
覆盖每个命令
cio --token sa_live_xxx api /v1/environments/{environment_id}/campaigns --params '{"environment_id": "123"}'
CIO_TOKEN=sa_live_xxx cio api /v1/environments/{environment_id}/campaigns --params '{"environment_id": "123"}'
使用量
使用 cio api <path> 用于任何 API 端点。 路径占位符从 --params。HTTP 方法默认为获取(如果 --json ); 以 -X数字 :
--params 使用 JSON 对象; URL- query 语法(--params 'type=event&size=200'也予以接受。 重复 --params 将数值分拆为不同旗帜(--params type=event --params size=200; 不止一次给定的密钥是一个错误。 在查询中,一个赤裸的 + 被否定为模棱两可——写作 %20 用于空间和 %2B 用于加(email=a%[email protected]),或使用JSON形式,两者都是字面的.
# List campaigns in workspace 123
cio api /v1/environments/{environment_id}/campaigns --params '{"environment_id": "123"}'
# Get a specific campaign
cio api /v1/environments/{environment_id}/campaigns/{campaign_id} \
--params '{"environment_id": "123", "campaign_id": "456"}'
# Create a campaign
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' \
--json '{"campaign": {"name": "Welcome Flow", "type": "none"}}'
# Explicit method override
cio api /v1/environments/{environment_id}/campaigns/{campaign_id} -X DELETE \
--params '{"environment_id": "123", "campaign_id": "456"}'
# Introspect endpoints
cio schema # list all resources
cio schema campaigns # list endpoints for a resource
cio schema campaigns.list # full schema for a method
cio schema GET /v1/environments/{environment_id}/campaigns # by HTTP method + path
cio schema campaigns.list --compact # flattened one line per field instead of JSON Schema
账户ID回落
包含路径 {account_id} 从账户中自动填入存储的ID cio auth login所以,你不需要传递它 在每一个电话:
cio api /v1/accounts/{account_id}/environments
过 --params '{"account_id": "..."}' 要覆盖,或设置 CIO_ACCESS_TOKEN 以禁用后退(预交换的JWT可能属于不同的账户).
用 Jq 过滤
# Filter with --jq to save context window
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' \
--jq '.campaigns[] | {id, name, state}'
# Complex filtering
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' \
--jq '.campaigns[] | select(.state == "active") | {id, name}'
写入操作
# Always dry-run first
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' \
--json '{"campaign": {"name": "Welcome Flow", "type": "none"}}' --dry-run
# Then execute (removes --dry-run)
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' \
--json '{"campaign": {"name": "Welcome Flow", "type": "none"}}'
倾斜
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' --page 2 --limit 50
# Auto-paginate (emits NDJSON — one JSON object per line)
cio api /v1/environments/{environment_id}/campaigns \
--params '{"environment_id": "123"}' --page-all
全球旗帜
| 旗帜 | 信封瓦尔 | 说明 |
|---|---|---|
--token <value> | CIO_TOKEN | 服务账户符号覆盖 |
--profile <name> | CIO_PROFILE | 要使用的配置配置配置文件 |
-X, --method | HTTP 方法覆盖( 默认: 获取, 或者如果 -- json ) | |
--json <payload> | Raw JSON 请求正文或 @filename 从文件读取 | |
--params <json> | 查询参数为 JSON ~ 查询字符串 | |
--jq <expr> | jq 表达式过滤器( 通过gojq) | |
--dry-run | 验证 + 打印请求, 跳过执行 | |
--api-url <url> | API 基础 URL 覆盖 | |
--timeout <duration> | CIO_TIMEOUT | HTTP 请求超时( 默认: 30s) |
--page <n> | 页码 | |
--limit <n> | 页面大小 | |
--page-all | 自动粘贴, 释放 NDJSON |
cio api 重试 GET 和 HEAD 的超时程序, 并仅在请求时写入
未发送。 写入发送后未重试的回复时间
他们可能已经申请了. --timeout 仍然限制每次 HTTP 尝试,并且
默认为30s.
超时与 HTTP 429 共享现有的重试限制和指数回放
可重试5xx回复. CIO_MAX_RETRIES 默认为3次复试, 共4次
尝试; 设置为 0 以禁用这些重试 。 呼叫者取消或过期
呼叫截止时间停止重复 。 因此,重复超时的时间可能比
--timeout 总计。 若为 --page-all 它会用完复读器,会出错
,并将任何更早的页面保留在 stdout; 呼叫者必须在退出状态之前检查其退出状态
使用输出作为完整结果.
退出代码
| 代码 | 含义 |
|---|---|
| 0 个 | 成绩 |
| 1个 | 一般错误 |
| 2个 | 校验/ 输入错误 |
| 3个 | 认证错误 |
| 页:1 | 授权错误 |
| 页:1 | API 错误( 4xx/5xx) |
错误格式
{"error":true,"code":"AUTH_ERROR","message":"Not authenticated.","details":{"status_code":401}}
建筑
CLI使用一个 常规 api 命令 + 路由注册 结构 :
cio api <path>——一个使用 API 路径的单一命令{placeholder}段落- OpenAPI 规格从第一次使用的活的 API 下载,并在本地缓存
~/.cio/cache/specs/(24h TTL,基于ETag的有条件刷新). 使用cio schema --refresh强制重新卸载. internal/routes/enrichment.json— OpenAPI spec中尚未注释的路由摘要,参数描述,查询参数
# Discover resources
cio schema
# List endpoints for a resource
cio schema campaigns
# Inspect a method's parameters
cio schema campaigns.list
# Make an API call
cio api /v1/environments/{environment_id}/campaigns --params '{"environment_id": "123"}'
# CDP Pipelines (workspace_id = environment_id)
cio api /cdp/api/workspaces/{workspace_id}/sources --params '{"workspace_id": "123"}'
cio schema sources
发展
go build -o cio .
go test ./...
go test ./... -v -run TestAuthLogin
许可证
根据Apache License 2.0颁发的许可,并附有《共同条款限制》。 见 自由主义。 。 。 .