Query Quo business phone - calls, texts, contacts, transcripts
Query your Quo (formerly OpenPhone) business phone β calls, texts, contacts, transcripts.
API key from my.quo.com β Settings β API. Configure via gateway under
skills.entries.quo.apiKey. OpenClaw injects it as QUO_API_KEY automatically.
{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]
--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)
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 |
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
}
]
}
}
defaultFields: firstName, lastName, company, role, emails[], phoneNumbers[]customFields: Array of {key, value} pairs (keys from /contact-custom-fields)defaultFields β always include ALL existing fieldsProperty Associated (key: 1712532493777, type: string)Address (key: 1700067557182, type: address)search-phone, --unknown, and gather
use a local cache at /tmp/quo-contacts-cache.json (5-min TTL, use --refresh to
rebuild)gather defaults to last 30 days, text only (no audio URLs or media)