Skip to main content
June 18, 2026
Messages endpoints: conversationId in responses and participants filter

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.
June 16, 2026
Mark conversations as done or open

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.
June 16, 2026
Group messages

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.
June 15, 2026
Mark a conversation as read

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.
June 8, 2026
Tasks endpoints

Added

Tasks API. A new set of endpoints for managing tasks is now available.
MethodEndpointDescription
GET/v1/tasksList tasks with cursor-based pagination.
POST/v1/tasksCreate a task linked to a phone number, conversation, or activity.
GET/v1/tasks/{taskId}Get a task by ID.
PUT/v1/tasks/{taskId}Update a task’s title and description.
DELETE/v1/tasks/{taskId}Delete a task by ID.
POST/v1/tasks/{taskId}/completeMark a task as completed.
POST/v1/tasks/{taskId}/reopenReopen a completed task.
POST/v1/tasks/{taskId}/assignAssign a user to a task.
POST/v1/tasks/{taskId}/unassignRemove a user from a task’s assignees.
POST/v1/tasks/{taskId}/change-due-dateSet a task’s due date.
POST/v1/tasks/{taskId}/remove-due-dateClear a task’s due date.
POST/v1/tasks/{taskId}/link-conversationLink a task to a conversation.
POST/v1/tasks/{taskId}/unlink-conversationUnlink a conversation from a task.
May 26, 2026
Webhooks beta: call events

Added

Call lifecycle events. Five call lifecycle events are now supported by the beta webhook API, completing event parity with the legacy webhook system:
Event typeWhen it fires
call.ringingA call started ringing (incoming or outgoing).
call.answeredA call connected. Also fires when an outgoing call reaches voicemail.
call.forwardedAn incoming call was forwarded. Includes forwardedFrom and forwardedTo phone numbers.
call.missedAn incoming call ended without being answered.
call.voicemail.completedA voicemail finished processing. Correlate with the source call via resource.callId.
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.
May 11, 2026
Webhooks open beta

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.
Event typeWhen it fires
message.receivedAn inbound message was received.
message.deliveredAn outbound message was delivered.
call.completedA call ended. Includes final status and duration.
call.recording.completedA call recording finished processing.
call.summary.completedAn AI call summary finished generating.
call.transcript.completedA call transcript finished processing.
contact.updatedA contact was created or updated.
contact.deletedA contact was deleted.
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.
January 22, 2025
1.2.0

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.
December 6, 2024
1.1.2

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.
November 25, 2024
1.1.1

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.
November 7, 2024
1.1.0

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.
November 4, 2024
1.0.2

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.
October 22, 2024
1.0.1

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.
October 21, 2024
1.0.0

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.