Skip to main content
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.
Message sending remains available through the v1 API.
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-numbers provides a dedicated, paginated list of the numbers assigned to a workspace user.
  • Search available numbers. GET /phone-numbers/available lets 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.
Moving from v1. Phone number responses use 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}/recordings and GET /calls/{callId}/transcripts return paginated segments in the order they occurred, including multiple segments when recording was paused and resumed.
Discover and sync conversations. 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
REST APILatest version

Added

Consistent collection queries. Collection endpoints now share these conventions where sorting and filtering are supported:
  • Sort: Use sort=field:asc or sort=field:desc. Add more fields, separated by commas, to break ties.
  • Filter: Use field=value for an exact match or field[operator]=value for another comparison. Filters on different fields combine with AND; [in] matches any value in a comma-separated set.
  • Contacts: GET /contacts now accepts externalId and source, including externalId[in] and source[in] for multiple values.
See Sorting and filtering for syntax and operators, and each endpoint’s reference for its supported fields.
MCP

Added

Send feedback to the Quo product team. The new submit-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 payload id 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 in 2026-03-30:
WebhooksLatest version

Added

Undelivered message event for webhooks. Create and update webhook endpoints now support the message.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 the call.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 support events: 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 APIv1

Added

Tasks API. A new set of endpoints for managing tasks is now available.
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 the Quo-Api-Version header on every request:
Version policy. A new version is only introduced when a breaking change is necessary — for example, removing a field, changing a field’s type, or altering existing behavior in an incompatible way. New endpoints, new optional fields, and bug fixes are added to the current version without a new version being published. See Versioning for the full contract.
REST APIBug fixesv1

Minor Changes

  • Adds a property externalId to the contact model. Adds externalId and source as optional parameters to the Create Contact (POST /contacts) request.
  • Adds externalId and source as 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 totalItems result 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

1.1.0

Minor Changes

  • Adds a property, restrictions, to the objects in the response from list phone numbers (GET /phone-numbers). The new property contains information about regional restrictions for outbound calling and messaging from a phone number.
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 since query parameter on “list calls” and “list messages” has been deprecated. It used to incorrectly behave as a createdBefore. Please use createdAfter instead, or createdBefore to maintain current functionality.
  • The phoneNumberId field for “send text message” has been deprecated. Please use from instead.
  • /v0 endpoints have been deprecated. Please use /v1 instead.