REST APILatest version
Added
Read messages across your workspace.GET /messages now returns a paginated message history across all conversations, newest first. Unlike v1, you don’t need to specify a Quo phone number or conversation participants before retrieving messages.- Find the messages that matter. Filter by sender, exact recipient set, delivery status, direction, Quo phone number, sending user, and creation time. This makes it easier to build workspace-wide reporting or retrieve undelivered and failed messages.
- Retrieve a single message.
GET /messages/{messageId}returns the message’s text, conversation ID, delivery status, and attached media. Both read endpoints include media URLs and MIME types when present.
REST APILatest version
Added
Discover the numbers your integration can use.GET /phone-numbers and GET /phone-numbers/{phoneNumberId} are now available in the 2026-03-30 API. The list endpoint supports cursor pagination and filtering by an E.164 phone number.- Find a user’s assigned numbers.
GET /users/{userId}/phone-numbersprovides a dedicated, paginated list of the numbers assigned to a workspace user. - Search available numbers.
GET /phone-numbers/availablelets you find numbers by country, area code, city, region, a matching substring, or toll-free availability. This search is new to the API; it does not purchase or provision a number.
phoneNumber instead of number. Calling and messaging restrictions are included with include=restrictions, and assigned members are retrieved through GET /phone-numbers/{phoneNumberId}/users rather than embedded in each number.REST APILatest version
Added
Call history with summaries and voicemails in one request.GET /calls and GET /calls/{callId} are now available in the 2026-03-30 API. Add include=summary,voicemail to either endpoint to retrieve that context alongside the call, without separate requests for its summary or voicemail.- Find the calls you need. List calls across the workspace or filter by Quo phone number, user or AI agent (
actorId), participant, direction, status, and creation time. Results are paginated, newest first. - Understand who handled each call. Responses include group-call participants and their actor IDs, who answered or initiated the call, whether AI handled it, and routing and forwarding details.
- Retrieve recordings and transcripts.
GET /calls/{callId}/recordingsandGET /calls/{callId}/transcriptsreturn paginated segments in the order they occurred, including multiple segments when recording was paused and resumed.
GET /conversations returns a paginated list of workspace conversations. Filter by one or more Quo phone number IDs and by creation or update time, and sort by createdAt or updatedAt in either direction. Use updatedAt[gte] to retrieve conversations changed since your last sync. Responses include participants, the latest activity ID and timestamp, and mute and snooze timestamps.REST APILatest version
Added
More ways to manage contacts. The2026-03-30 API now supports creating, updating, and deleting contacts. You can also read a contact’s shares and manage notes and properties attached to a contact. The existing list and get-by-ID endpoints remain available.REST APILatest version
Added
Consistent collection queries. Collection endpoints now share these conventions where sorting and filtering are supported:- Sort: Use
sort=field:ascorsort=field:descwith a single field. - Filter: Use
field=valuefor an exact match orfield[operator]=valuefor another comparison. Filters on different fields combine with AND;[in]matches any value in a comma-separated set. - Contacts:
GET /contactsnow acceptsexternalIdandsource, includingexternalId[in]andsource[in]for multiple values.
MCP
Added
Send feedback to the Quo product team. The newsubmit-feedback tool passes along feedback about your phone-line or communications experience. It is opt-in: the client sends feedback only after you explicitly ask it to or accept its offer, and a submission cannot be edited or withdrawn. See Supported tools for details.MCP
Added
Skip done conversations.fetch-messages and fetch-call-transcripts now accept excludeDoneConversations. Set it to true on a whole-inbox query to leave out conversations that are currently marked done or snoozed. It defaults to false, so existing calls are unchanged, and queries for one contact always return that contact’s full history. See Supported tools for details.MCP
Improved
Custom fields on contacts.create-contact and update-contact now support your workspace’s custom fields. Set custom field values when you create a contact, and set or clear them on an existing contact. See Supported tools for details.REST APILatest version
Added
Get the organization.GET /organization retrieves information about your Quo workspace, including its name, subscription status, and creation/update timestamps.WebhooksLatest version
Improved
Webhook delivery correlation. Delivery list and detail results now include the payloadid as eventId and the primary resource ID as resourceId. Filter the delivery list by resourceId to find every delivery for one business resource. Deliveries created before September 2, 2026 return null for both fields, and the resourceId filter does not match them. Test deliveries also return null. The delivery id matches the webhook-id header and identifies detail and retry requests.REST APILatest version
Added
New endpoints supported for tasks in2026-03-30:GET /tasks— List tasksGET /tasks/{taskId}— Get a task by IDPOST /tasks— Create a taskPATCH /tasks/{taskId}— Update a task’s title and/or descriptionDELETE /tasks/{taskId}— Delete a taskPATCH /tasks/{taskId}/status— Update a task’s statusPOST /tasks/{taskId}/conversations— Link a task to a conversationDELETE /tasks/{taskId}/conversations— Unlink a task from a conversationPOST /tasks/{taskId}/users— Assign a task to a userDELETE /tasks/{taskId}/users— Unassign a task from a userPATCH /tasks/{taskId}/due-date— Set a task’s due dateDELETE /tasks/{taskId}/due-date— Remove a task’s due date
WebhooksLatest version
Added
Undelivered message event for webhooks. Create and update webhook endpoints now support themessage.undelivered event. It fires when an outbound message could not be delivered to the recipient or was blocked. An undelivered message is terminal and cannot be retried, unlike a message.failed event. See Webhook event payloads for the schema.MCP
Improved
Message attachments in fetch results.fetch-messages now returns MMS attachments alongside message text, including each attachment’s media type and URL. Connected agents can present images and files as clickable links, including messages that contain an attachment without accompanying text.Larger bulk sends. send-bulk-messages now supports 2–40 recipients per call, up from 20. Every recipient still receives a separate one-to-one message and cannot see the other recipients.Personalized bulk sends. send-bulk-messages can now send different content to each recipient using messages: [{to, content}]. For an identical message to everyone, continue using to with content; provide one mode or the other, not both. See Supported tools for details.REST APIv1
Added
media in message responses. GET /v1/messages and GET /v1/messages/{id} now include a media array on each message. Each item has a url for the attached media and a type for its MIME type.WebhooksLatest version
Added
Phone menu event for webhooks. Create and update webhook endpoints now support thecall.menu.selected event, which fires when a caller reaches a routing decision in a phone menu (IVR). See Webhook event payloads for the schema.REST APILatest version
Added
Get a contact by ID.GET /contacts/{contactId} retrieves detailed information about a specific contact in your Quo workspace using the contact’s unique identifier.WebhooksLatest version
Added
Task events for webhooks. Create and update webhook endpoints now supportevents: task.created, task.updated, task.deleted, task.completed, task.reopened, task.assigned, task.unassigned, task.overdue, task.linked, task.unlinked, task.duedate.updated, task.duedate.removed.REST APILatest version
Added
List contacts.GET /contacts returns a paginated list of contacts. Filter by external ID or source to narrow results.WebhooksLatest version
Added
Webhook API. The webhook API is now available in this version. Subscribe an HTTPS endpoint to real-time message, call, and contact events, with signed and automatically retried deliveries. See the overview and quickstart to get started.Managing subscriptions.POST /webhooks creates a subscription; companion endpoints list, update, and delete subscriptions, rotate the signing secret, inspect deliveries, retry a delivery, and send a test event. A workspace can have up to 50 webhooks.Events. Message (received, delivered, failed), the full call lifecycle, and contact (updated, deleted) events are supported. See Webhook event payloads for every schema.REST APIv1
Added
conversationId in message responses. All messages endpoints now include conversationId in the response body.Group messaging support. GET /v1/messages now supports retrieving group conversation messages via the participants array.REST APILatest version
Added
Mark a conversation as done.POST /conversations/{conversationId}/mark-as-done removes a conversation from the inbox without sending a message and returns the updated conversation.Mark a conversation as open. POST /conversations/{conversationId}/mark-as-open moves a conversation back to the inbox without sending a message and returns the updated conversation.REST APIv1
Added
Mark a conversation as done.POST /v1/conversations/{conversationId}/mark-as-done removes a conversation from the inbox without sending a message and returns the updated conversation.Mark a conversation as open. POST /v1/conversations/{conversationId}/mark-as-open moves a conversation back to the inbox without sending a message and returns the updated conversation.REST APIv1
Added
Group messages.POST /v1/messages now accepts up to 10 phone numbers in the to array, sending a single group message to all recipients at once. Sending to a single recipient is unchanged.REST APILatest version
Added
Mark a conversation as read.POST /conversations/{conversationId}/mark-as-read clears a conversation’s unread indicator without sending a message and returns the updated conversation.Retry a failed message. POST /messages/{messageId}/retry re-attempts delivery of a message in a failed state. Messages that have permanently failed with an error code, and messages in an undelivered state, cannot be retried.REST APIv1
Added
Mark a conversation as read.POST /v1/conversations/{conversationId}/mark-as-read clears a conversation’s unread indicator without sending a message and returns the updated conversation.REST APILatest version
Added
List users.GET /users returns a paginated list of users in your Quo workspace.Get user by ID. GET /users/{userId} retrieves detailed information about a specific workspace user.Webhooksv1
Added
Call lifecycle events. Five call lifecycle events are now supported by the beta webhook API, completing event parity with the legacy webhook system:call.answered, call.forwarded, call.missed, and call.voicemail.completed are new event types with no equivalent in the legacy webhook system.The beta webhook API now covers the full event surface of the legacy system, plus call.answered, call.forwarded, call.missed, and call.voicemail.completed — four event types with no equivalent in legacy. See the beta webhook overview and event payload reference for details.Webhooksv1
Added
Beta webhook API (open beta). A new webhook API is available in open beta. See the overview and quickstart to get started.Unified create endpoint.POST /webhooks replaces the four legacy create endpoints (/v1/webhooks/messages, /v1/webhooks/calls, /v1/webhooks/call-summaries, /v1/webhooks/call-transcripts). Message, call, and contact event types can be combined in a single subscription. Up to 50 webhooks per workspace.Supported event types at launch.Call lifecycle events (
call.ringing, call.answered, call.forwarded, call.missed, call.voicemail.completed) were not yet available at launch — they were added on May 26, 2026.Payload envelope. All events share a common data.resource / data.context / data.links structure. data.resource contains the primary business object; data.context contains routing metadata (phone number, conversation, participants, contact lookup). See Webhook event payloads.Payload versioning. Each subscription pins a payload version at creation via the x-quo-api-version header. Existing subscriptions are unaffected by future version changes. See Versioning policy for the current version.Signing. Deliveries use Standard-Webhooks-compatible headers (webhook-id, webhook-timestamp, webhook-signature) and a whsec_... base64 secret, compatible with the Svix SDK. This scheme is not interchangeable with the legacy OpenPhone-Signature header — update signature verification before routing beta traffic to an existing endpoint. See Validate webhook signatures.Delivery inspection. Send a signed test delivery (POST /webhooks/:id/events/test), browse delivery history and per-attempt responses (GET /webhooks/:id/events, GET /webhooks/:id/events/:eventId), and trigger manual retries (POST /webhooks/:id/events/:eventId/retry). See Webhook API reference.Signing secret rotation. POST /webhooks/:id/rotate issues a new whsec_... key for an existing subscription without changing its event subscriptions or apiVersion.For a side-by-side comparison with the legacy system and a no-downtime migration walkthrough, see Migrating from legacy.REST APILatest version
API versioning
The Quo API now uses header-based versioning. Specify your target version by passing theQuo-Api-Version header on every request:REST APIBug fixesv1
Minor Changes
- Adds a property
externalIdto the contact model. AddsexternalIdandsourceas optional parameters to the Create Contact (POST /contacts) request. - Adds
externalIdandsourceas optional parameters to the Update Contact (PATCH /contacts/:id) request. - Added a route to list contacts (
GET /contacts).
Patch Changes
- Fixed an issue where creating or updating a contact with an invalid custom field would result in 500 error. Sending an invalid custom field will now result in a 400 “Invalid Custom Field Item” error.
REST APIBug fixesv1
Patch Changes
- Fixed an issue where paginated endpoints would return a string token for the next page at the end of paginated results. Now, they will correctly return the next page token as
null. - Added a callout that the
totalItemsresult field for the paginated endpoints is not functioning as expected and is not returning the true total items count.
REST APIBug fixesv1
Patch Changes
- Fixes an issue where phone numbers in various routes were expected to be in E164 format, but the format was not being validated correctly.
REST APIv1
REST APIBug fixesv1
Patch Changes
- Fixed an issue with list calls (
GET /calls) where sending an empty participants param resulted in a 500 response. Sending an empty participants param will now result in a descriptive 400 response. - Fixes an issue where attempting to send a message to an international number would result in a 500 response if international messaging is not enabled in the workspace. With this fix, the 500 error response changed to a 403 with a descriptive message
- Fixes a bug where the GET call recordings endpoint sometimes returned an empty array.
- Fixes an issue that was preventing some call records from returning successfully from
GET /calls - Fixes an issue where getting a contact by id would result in a 500 instead of a 404 when contact is not found. Now this will respond in a 404 with a descriptive message.
- Fixes an issue where sending a message that contained only whitespace (
' ','\n', etc.) resulted in a 500 error response. Now, this will respond with 400 and a validation error message instead.
REST APIBug fixesv1
Patch Changes
- Fixes an issue with List Calls (
GET /calls) where the user ID applied by default when the user ID parameter was not sent was being set to the workspace owner instead of the phone number owner.
REST APIv1
1.0.0
Major Changes
OpenPhone’s Public API v1 release 🚀Changes from the beta version include:- The
sincequery parameter on “list calls” and “list messages” has been deprecated. It used to incorrectly behave as acreatedBefore. Please usecreatedAfterinstead, orcreatedBeforeto maintain current functionality. - The
phoneNumberIdfield for “send text message” has been deprecated. Please usefrominstead. /v0endpoints have been deprecated. Please use/v1instead.