Quo 📞
Query your Quo (formerly OpenPhone) business phone — calls, texts, contacts,
transcripts.
Setup
API key from my.quo.com → Settings → API. Configure via gateway under
skills.entries.quo.apiKey. OpenClaw injects it as QUO_API_KEY automatically.
What Users Ask
- "What's my Quo number?"
- "Show recent conversations"
- "Get the transcript from that call"
- "What was the summary of my call with [person]?"
- "List my business contacts"
- "Send a text to [number]"
- "Show my recent calls with [number]"
- "Any missed calls today?"
- "Who called the office?"
- "Text [person] from my work number"
- "Check my voicemails"
- "What messages came in on the business line?"
- "Who is this number?"
- "Show me everything from this number"
- "Show conversations from unknown numbers"
CLI Reference
{baseDir}/quo numbers List phone numbers
{baseDir}/quo conversations [filters] List conversations
{baseDir}/quo contacts [--limit N] List contacts
{baseDir}/quo search-phone <phone> [--refresh] Find contact by phone (cached)
{baseDir}/quo gather <phone> [--since ISO] [--until ISO] [--limit N] [--refresh]
{baseDir}/quo custom-fields List contact custom fields
{baseDir}/quo users List workspace users
{baseDir}/quo summary <callId> Get AI call summary
{baseDir}/quo transcript <callId> Get full dialogue transcript
{baseDir}/quo recordings <callId> Get recording URLs
{baseDir}/quo voicemails <callId> Get voicemail + transcript
{baseDir}/quo send --from <num> --to <num> <message>
{baseDir}/quo messages --number-id <id> --participant <phone> [--limit N]
{baseDir}/quo calls --number-id <id> --participant <phone> [--limit N] [--created-after ISO] [--created-before ISO]
{baseDir}/quo raw [METHOD] <endpoint> [json-body]
Conversation Filters
--phone <number-or-id> Filter by Quo phone line (repeatable)
--updated-after ISO Conversations updated after date
--updated-before ISO Conversations updated before date
--created-after ISO Conversations created after date
--created-before ISO Conversations created before date
--include-inactive Include inactive/snoozed conversations
--unknown Only show conversations with unrecognized numbers
--limit N Max results (default 10)
API Endpoints
Full OpenAPI spec:
https://openphone-public-api-prod.s3.us-west-2.amazonaws.com/public/openphone-public-api-v1-prod.json
| Endpoint |
Method |
Description |
/v1/phone-numbers |
GET |
List phone numbers |
/v1/conversations |
GET |
List conversations (filterable) |
/v1/messages |
GET |
List messages for a conversation |
/v1/messages |
POST |
Send a text message |
/v1/messages/{id} |
GET |
Get message by ID |
/v1/calls |
GET |
List calls (with date filters) |
/v1/calls/{callId} |
GET |
Get call by ID |
/v1/call-summaries/{callId} |
GET |
AI-generated call summary |
/v1/call-transcripts/{id} |
GET |
Full dialogue transcript with speaker attribution |
/v1/call-recordings/{callId} |
GET |
Recording URLs (MP3) |
/v1/call-voicemails/{callId} |
GET |
Voicemail + transcript |
/v1/contacts |
GET |
List contacts (paginated) |
/v1/contacts |
POST |
Create a contact |
/v1/contacts/{id} |
GET |
Get contact by ID |
/v1/contacts/{id} |
PATCH |
Update contact (replaces entire defaultFields!) |
/v1/contacts/{id} |
DELETE |
Delete a contact |
/v1/contact-custom-fields |
GET |
List custom contact fields |
/v1/users |
GET |
List workspace users |
/v1/webhooks/* |
Various |
Webhook management for messages, calls, summaries, transcripts |
Key Data Formats
Transcript Response
Returns dialogue[] array with speaker-attributed entries:
{
"data": {
"callId": "AC...",
"dialogue": [
{
"content": "Hello",
"start": 0.16,
"end": 0.48,
"identifier": "+15551234567",
"userId": "US..."
},
{
"content": "Hi, my name is Jane",
"start": 1.0,
"end": 2.5,
"identifier": "+15559876543",
"userId": null
}
]
}
}
Contact Fields
defaultFields: firstName, lastName, company, role, emails[], phoneNumbers[]
customFields: Array of {key, value} pairs (keys from /contact-custom-fields)
- ⚠️ PATCH replaces entire
defaultFields — always include ALL existing fields
Custom Fields (example workspace)
Property Associated (key: 1712532493777, type: string)
Address (key: 1700067557182, type: address)
Notes
- Transcripts require call recording enabled in Quo settings
- Phone numbers in E.164 format (+1XXXXXXXXXX)
- Contacts API has no phone number search —
search-phone, --unknown, and gather
use a local cache at /tmp/quo-contacts-cache.json (5-min TTL, use --refresh to
rebuild)
- Voicemail endpoint returns single object (not array)
gather defaults to last 30 days, text only (no audio URLs or media)
1---2name: quo3description: Quo (formerly OpenPhone) business phone system — check calls, texts, voicemails, missed calls, send SMS/texts, manage contacts, read call transcripts and summaries, get recordings. Use for anything related to the work phone or business line.4---56# Quo 📞78Query your Quo (formerly OpenPhone) business phone — calls, texts, contacts,9transcripts.1011## Setup1213API key from my.quo.com → Settings → API. Configure via gateway under14`skills.entries.quo.apiKey`. OpenClaw injects it as `QUO_API_KEY` automatically.1516## What Users Ask1718- "What's my Quo number?"19- "Show recent conversations"20- "Get the transcript from that call"21- "What was the summary of my call with [person]?"22- "List my business contacts"23- "Send a text to [number]"24- "Show my recent calls with [number]"25- "Any missed calls today?"26- "Who called the office?"27- "Text [person] from my work number"28- "Check my voicemails"29- "What messages came in on the business line?"30- "Who is this number?"31- "Show me everything from this number"32- "Show conversations from unknown numbers"3334## CLI Reference3536```37{baseDir}/quo numbers List phone numbers38{baseDir}/quo conversations [filters] List conversations39{baseDir}/quo contacts [--limit N] List contacts40{baseDir}/quo search-phone <phone> [--refresh] Find contact by phone (cached)41{baseDir}/quo gather <phone> [--since ISO] [--until ISO] [--limit N] [--refresh]42{baseDir}/quo custom-fields List contact custom fields43{baseDir}/quo users List workspace users44{baseDir}/quo summary <callId> Get AI call summary45{baseDir}/quo transcript <callId> Get full dialogue transcript46{baseDir}/quo recordings <callId> Get recording URLs47{baseDir}/quo voicemails <callId> Get voicemail + transcript48{baseDir}/quo send --from <num> --to <num> <message>49{baseDir}/quo messages --number-id <id> --participant <phone> [--limit N]50{baseDir}/quo calls --number-id <id> --participant <phone> [--limit N] [--created-after ISO] [--created-before ISO]51{baseDir}/quo raw [METHOD] <endpoint> [json-body]52```5354### Conversation Filters5556```57--phone <number-or-id> Filter by Quo phone line (repeatable)58--updated-after ISO Conversations updated after date59--updated-before ISO Conversations updated before date60--created-after ISO Conversations created after date61--created-before ISO Conversations created before date62--include-inactive Include inactive/snoozed conversations63--unknown Only show conversations with unrecognized numbers64--limit N Max results (default 10)65```6667## API Endpoints6869Full OpenAPI spec:70https://openphone-public-api-prod.s3.us-west-2.amazonaws.com/public/openphone-public-api-v1-prod.json7172| Endpoint | Method | Description |73| ------------------------------ | ------- | -------------------------------------------------------------- |74| `/v1/phone-numbers` | GET | List phone numbers |75| `/v1/conversations` | GET | List conversations (filterable) |76| `/v1/messages` | GET | List messages for a conversation |77| `/v1/messages` | POST | Send a text message |78| `/v1/messages/{id}` | GET | Get message by ID |79| `/v1/calls` | GET | List calls (with date filters) |80| `/v1/calls/{callId}` | GET | Get call by ID |81| `/v1/call-summaries/{callId}` | GET | AI-generated call summary |82| `/v1/call-transcripts/{id}` | GET | Full dialogue transcript with speaker attribution |83| `/v1/call-recordings/{callId}` | GET | Recording URLs (MP3) |84| `/v1/call-voicemails/{callId}` | GET | Voicemail + transcript |85| `/v1/contacts` | GET | List contacts (paginated) |86| `/v1/contacts` | POST | Create a contact |87| `/v1/contacts/{id}` | GET | Get contact by ID |88| `/v1/contacts/{id}` | PATCH | Update contact (**replaces entire defaultFields!**) |89| `/v1/contacts/{id}` | DELETE | Delete a contact |90| `/v1/contact-custom-fields` | GET | List custom contact fields |91| `/v1/users` | GET | List workspace users |92| `/v1/webhooks/*` | Various | Webhook management for messages, calls, summaries, transcripts |9394## Key Data Formats9596### Transcript Response9798Returns `dialogue[]` array with speaker-attributed entries:99100```json101{102 "data": {103 "callId": "AC...",104 "dialogue": [105 {106 "content": "Hello",107 "start": 0.16,108 "end": 0.48,109 "identifier": "+15551234567",110 "userId": "US..."111 },112 {113 "content": "Hi, my name is Jane",114 "start": 1.0,115 "end": 2.5,116 "identifier": "+15559876543",117 "userId": null118 }119 ]120 }121}122```123124### Contact Fields125126- `defaultFields`: firstName, lastName, company, role, emails[], phoneNumbers[]127- `customFields`: Array of {key, value} pairs (keys from `/contact-custom-fields`)128- ⚠️ PATCH replaces entire `defaultFields` — always include ALL existing fields129130### Custom Fields (example workspace)131132- `Property Associated` (key: `1712532493777`, type: string)133- `Address` (key: `1700067557182`, type: address)134135## Notes136137- Transcripts require call recording enabled in Quo settings138- Phone numbers in E.164 format (+1XXXXXXXXXX)139- Contacts API has no phone number search — `search-phone`, `--unknown`, and `gather`140 use a local cache at `/tmp/quo-contacts-cache.json` (5-min TTL, use `--refresh` to141 rebuild)142- Voicemail endpoint returns single object (not array)143- `gather` defaults to last 30 days, text only (no audio URLs or media)