Quo
2026-03-29
新闻来源:网淘吧
围观:16
电脑广告
手机广告
Quo
通过托管的 OAuth 认证访问 Quo API。发送短信、管理通话和联系人,以及获取通话录音和文本记录。
快速开始
# List phone numbers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/quo/v1/phone-numbers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('User-Agent', 'Maton/1.0')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
基础 URL
https://gateway.maton.ai/quo/{native-api-path}
将{native-api-path}替换为实际的 Quo API 端点路径。网关会将请求代理到api.openphone.com并自动注入您的 OAuth 令牌。
认证
所有请求都需要在 Authorization 头部中包含 Maton API 密钥,以及一个 User-Agent 头部:
Authorization: Bearer $MATON_API_KEY
User-Agent: Maton/1.0
环境变量:将您的 API 密钥设置为MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
获取您的 API 密钥
复制您的 API 密钥
在以下网址管理您的 Quo OAuth 连接https://ctrl.maton.ai.
列出连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=quo&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
创建连接
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'quo'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
获取连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
响应:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "quo",
"metadata": {}
}
}
在浏览器中打开返回的url以完成 OAuth 授权。
删除连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
指定连接
如果您有多个 Quo 连接,请使用Maton-Connection请求头来指定要使用哪一个:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/quo/v1/phone-numbers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('User-Agent', 'Maton/1.0')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
如果省略,网关将使用默认的(最早创建的)活动连接。
API 参考
电话号码
列出电话号码
GET /quo/v1/phone-numbers
可选查询参数:
userId- 按用户 ID 筛选(模式为:^US(.*)$回复:
用户
{
"data": [
{
"id": "PN123abc",
"number": "+15555555555",
"formattedNumber": "(555) 555-5555",
"name": "Main Line",
"users": [
{
"id": "US123abc",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "admin"
}
],
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:00:00Z"
}
]
}
用户列表
查询参数:
GET /quo/v1/users?maxResults=50
maxResults
(必需)- 每页结果数(1-50,默认:10)pageToken- 分页令牌回复:
按ID获取用户
{
"data": [
{
"id": "US123abc",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "owner",
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:00:00Z"
}
],
"totalItems": 10,
"nextPageToken": null
}
消息
GET /quo/v1/users/{userId}
发送文本消息
请求体:
POST /quo/v1/messages
Content-Type: application/json
{
"content": "Hello, world!",
"from": "PN123abc",
"to": ["+15555555555"]
}
content
(必需)- 消息文本(1-1600个字符)from(必需)- 电话号码ID(PN*)或E.164格式to(必需)- 包含单个收件人的数组,采用E.164格式userId- 用户ID(默认为电话所有者)setInboxStatussetInboxStatus- 设置为“已完成”以标记对话完成
响应(202):
{
"id": "AC123abc",
"to": ["+15555555555"],
"from": "+15555555555",
"text": "Hello, world!",
"phoneNumberId": "PN123abc",
"direction": "outgoing",
"userId": "US123abc",
"status": "queued",
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:00:00Z"
}
列出消息
GET /quo/v1/messages?phoneNumberId=PN123abc&participants[]=+15555555555&maxResults=100
查询参数:
电话号码ID(必需)- 电话号码ID参与者(必需)- 采用E.164格式的参与者电话号码数组最大结果数(必需)- 每页结果数(1-100,默认:10)用户ID- 按用户ID筛选创建时间晚于- ISO 8601时间戳创建时间早于- ISO 8601时间戳页面令牌- 分页令牌
按ID获取消息
GET /quo/v1/messages/{messageId}
通话
列出通话
GET /quo/v1/calls?phoneNumberId=PN123abc&participants[]=+15555555555&maxResults=100
查询参数:
phoneNumberId(必填)- 电话号码IDparticipants(必填)- 包含单个参与者电话号码的数组,采用E.164格式(最多1个)maxResults(必填)- 每页结果数(1-100,默认:10)userId- 按用户ID筛选createdAfter- ISO 8601时间戳createdBefore- ISO 8601时间戳pageToken- 分页令牌
响应:
{
"data": [
{
"id": "AC123abc",
"phoneNumberId": "PN123abc",
"userId": "US123abc",
"direction": "incoming",
"status": "completed",
"duration": 120,
"participants": ["+15555555555"],
"answeredAt": "2022-01-01T00:00:00Z",
"completedAt": "2022-01-01T00:02:00Z",
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:02:00Z"
}
],
"totalItems": 50,
"nextPageToken": "..."
}
按ID获取通话
GET /quo/v1/calls/{callId}
获取通话录音
GET /quo/v1/call-recordings/{callId}
响应:
{
"data": [
{
"id": "REC123abc",
"duration": 120,
"startTime": "2022-01-01T00:00:00Z",
"status": "completed",
"type": "voicemail",
"url": "https://..."
}
]
}
录音状态值:absent,completed,deleted,失败,进行中,已暂停,处理中,已停止,正在停止
获取通话摘要
GET /quo/v1/call-summaries/{callId}
获取通话记录
GET /quo/v1/call-transcripts/{callId}
获取通话语音邮件
GET /quo/v1/call-voicemails/{callId}
联系人
列出联系人
GET /quo/v1/contacts?maxResults=50
查询参数:
maxResults(必需)- 每页结果数(1-50,默认值:10)externalIds- 外部标识符数组sources- 来源指示符数组pageToken- 分页令牌
响应:
{
"data": [
{
"id": "CT123abc",
"externalId": null,
"source": null,
"defaultFields": {
"company": "Acme Corp",
"firstName": "Jane",
"lastName": "Doe",
"role": "Manager",
"emails": [{"name": "work", "value": "jane@example.com", "id": "EM1"}],
"phoneNumbers": [{"name": "mobile", "value": "+15555555555", "id": "PH1"}]
},
"customFields": [],
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:00:00Z",
"createdByUserId": "US123abc"
}
],
"totalItems": 100,
"nextPageToken": "..."
}
按ID获取联系人
GET /quo/v1/contacts/{contactId}
创建联系人
POST /quo/v1/contacts
Content-Type: application/json
{
"defaultFields": {
"firstName": "Jane",
"lastName": "Doe",
"company": "Acme Corp",
"phoneNumbers": [{"name": "mobile", "value": "+15555555555"}],
"emails": [{"name": "work", "value": "jane@example.com"}]
}
}
更新联系人
PATCH /quo/v1/contacts/{contactId}
Content-Type: application/json
{
"defaultFields": {
"company": "New Company"
}
}
删除联系人
DELETE /quo/v1/contacts/{contactId}
获取联系人自定义字段
GET /quo/v1/contact-custom-fields
对话
列出对话
GET /quo/v1/conversations?maxResults=100
查询参数:
maxResults(必填)- 每页结果数(1-100,默认值:10)phoneNumbers- 电话号码ID或E.164号码数组(1-100项)userId- 按用户ID筛选createdAfter- ISO 8601时间戳createdBefore- ISO 8601时间戳updatedAfter- ISO 8601时间戳updatedBefore- ISO 8601时间戳excludeInactive- 是否排除非活动对话的布尔值页面令牌- 分页令牌
响应:
{
"data": [
{
"id": "CV123abc",
"phoneNumberId": "PN123abc",
"name": "Jane Doe",
"participants": ["+15555555555"],
"assignedTo": "US123abc",
"lastActivityAt": "2022-01-01T00:00:00Z",
"createdAt": "2022-01-01T00:00:00Z",
"updatedAt": "2022-01-01T00:00:00Z"
}
],
"totalItems": 50,
"nextPageToken": "..."
}
分页
Quo使用基于令牌的分页。包含maxResults以设置页面大小,并使用pageToken来检索后续页面。
GET /quo/v1/contacts?maxResults=50&pageToken=eyJsYXN0SWQiOi...
响应包含分页信息:
{
"data": [...],
"totalItems": 150,
"nextPageToken": "eyJsYXN0SWQiOi..."
}
当nextPageToken为null时,表示您已到达最后一页。
代码示例
JavaScript
const response = await fetch(
'https://gateway.maton.ai/quo/v1/phone-numbers',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'User-Agent': 'Maton/1.0'
}
}
);
const data = await response.json();
Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/quo/v1/phone-numbers',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'User-Agent': 'Maton/1.0'
}
)
data = response.json()
发送短信示例
import os
import requests
response = requests.post(
'https://gateway.maton.ai/quo/v1/messages',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'User-Agent': 'Maton/1.0',
'Content-Type': 'application/json'
},
json={
'content': 'Hello from Quo!',
'from': 'PN123abc',
'to': ['+15555555555']
}
)
data = response.json()
注意事项
- 电话号码ID以
PN - 开头
用户ID以 - US
交流电 - 电话号码必须采用 E.164 格式(例如,
+15555555555) - 短信定价:每段 0.01 美元(美国/加拿大);国际费率适用
- 每条消息最多 1600 个字符
- 列出通话功能要求恰好有1名参与者(仅限1对1对话)
- 重要提示:所有 API 请求都需要一个
User-Agent请求头(例如,User-Agent: Maton/1.0)。没有此请求头的请求将被阻止。 - 重要提示:使用 curl 命令时,如果 URL 包含方括号(
participants[]),请使用curl -g以禁用通配符解析 - 重要提示:当将 curl 输出通过管道传递给
jq或其他命令时,像$MATON_API_KEY在某些shell环境下可能无法正确展开
错误处理
| 状态码 | 含义 |
|---|---|
| 400 | 错误请求(例如:参与者过多、格式无效) |
| 401 | Maton API密钥无效或缺失 |
| 402 | 短信余额不足 |
| 403 | 无权访问此电话号码 |
| 404 | 未找到资源 |
| 429 | 请求频率受限 |
| 500 | 服务器错误 |
故障排除:API密钥问题
- 请检查
MATON_API_KEY环境变量是否已设置:
echo $MATON_API_KEY
- 通过列出连接验证API密钥是否有效:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
故障排除:无效应用名称
- 确保您的URL路径以
quo开头。例如:
- 正确示例:
https://gateway.maton.ai/quo/v1/phone-numbers - 错误示例:
https://gateway.maton.ai/openphone/v1/phone-numbers
资源
文章底部电脑广告
手机广告位-内容正文底部
上一篇:ClickUp MCP
下一篇:Aubrai Longevity Research


微信扫一扫,打赏作者吧~