# Quo — Pipedream Connect

> Modern business phone for startups and small businesses

- API slug: `openphone` (use in MCP headers and tool keys)
- Auth: API key (Pipedream-managed)
- Categories: Communication
- Website: https://www.quo.com/
- This page (HTML): https://pipedream.com/apps/openphone
- Tools: 17 actions · 4 triggers

## Connect via MCP (recommended)

- Endpoint: `https://remote.mcp.pipedream.net/v3`
- Headers: `Authorization: Bearer <token>` · `x-pd-project-id` · `x-pd-environment` · `x-pd-external-user-id` · `x-pd-app-slug: openphone`

```ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const accessToken = await pd.rawAccessToken

const transport = new StreamableHTTPClientTransport(
  new URL("https://remote.mcp.pipedream.net/v3"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "x-pd-project-id": process.env.PIPEDREAM_PROJECT_ID!,
        "x-pd-environment": "production",
        "x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
        "x-pd-app-slug": "openphone",
      },
    },
  },
)

const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)

const { tools } = await mcp.listTools()

// e.g. run Create Contact:
const result = await mcp.callTool({
  name: "openphone-create-contact",
  arguments: {
    firstName: "First Name",
    lastName: "Last Name",
  },
})
```

Docs: [MCP guide](https://pipedream.com/docs/connect/mcp/developers.md)

## API proxy

For a Quo endpoint with no pre-built tool, the proxy forwards your request with the connected user's credentials attached.

```bash
# The path segment is the target URL, URL-safe base64 encoded:
# https://api.openphone.com/v1/phone-numbers

curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkub3BlbnBob25lLmNvbS92MS9waG9uZS1udW1iZXJz?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
  -H "Authorization: Bearer {access_token}" \
  -H "x-pd-environment: production"
```

Docs: [API proxy guide](https://pipedream.com/docs/connect/api-proxy.md)

## SDK

```ts
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const result = await pd.actions.run({
  id: "openphone-create-contact",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    openphone: { authProvisionId: "apn_xxxxxxx" },
    firstName: "First Name",
    lastName: "Last Name",
  },
})
```

Docs: [Managed auth guide](https://pipedream.com/docs/connect/managed-auth/quickstart.md) · [Tools guide](https://pipedream.com/docs/connect/components.md)

## Actions (17)

### `openphone-create-contact` — Create Contact (Write)

Create a new contact in OpenPhone. Example: call with firstName="Jane", lastName="Doe", phoneNumbers=[{"name": "Mobile", "value": "+15551234567"}] → returns the created contact record, including its id. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/create-contact.md

### `openphone-create-task` — Create Task (Write)

Create a task tied to an OpenPhone conversation. Example: call with conversationId="CN123abc", title="Follow up with customer re: onboarding", description="Customer asked about pricing tiers." → returns the created task record, including its id. Use List Conversations or List Messages to find the…

Full schema: https://pipedream.com/apps/openphone/actions/create-task.md

### `openphone-delete-contact` — Delete Contact (Write)

Permanently delete a contact by ID. This cannot be undone. Example: call with contactId from List Contacts → the contact is removed and the response confirms deletion. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/delete-contact.md

### `openphone-delete-task` — Delete Task (Write)

Permanently delete a task by ID. This cannot be undone. Use List Tasks to find task IDs. Example: call with taskId="TK123abc" → the task is removed and the response confirms deletion. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/delete-task.md

### `openphone-get-call` — Get Call (Read-only)

Retrieve a single call by its ID, including its summary and transcript when available. Summary and transcript are fetched from OpenPhone's separate /summary and /transcript endpoints and merged into the result; they are null if OpenPhone has not yet generated them. Use List Calls to find call IDs…

Full schema: https://pipedream.com/apps/openphone/actions/get-call.md

### `openphone-list-calls` — List Calls (Read-only)

Retrieve a paginated list of calls from OpenPhone. Requires both a phone number ID and a participant to scope the results — the API rejects calls missing either. Use List Phone Numbers to find valid phone number IDs. Example: call with phoneNumberId="PN123abc", participants="+15551234567" → returns…

Full schema: https://pipedream.com/apps/openphone/actions/list-calls.md

### `openphone-list-contacts` — List Contacts (Read-only)

Retrieve a paginated list of contacts. Optionally filter by external IDs and/or sources. All contacts for the organization are returned only when neither externalIds nor sources is provided. Example: call with no filters → returns up to 10 contacts for the organization. Use fields to return only…

Full schema: https://pipedream.com/apps/openphone/actions/list-contacts.md

### `openphone-list-conversations` — List Conversations (Read-only)

Retrieve a paginated list of conversations. Can be filtered by user and/or phone numbers. Defaults to all conversations in the organization. Results are returned in descending order based on the most recent conversation. Example: call with no filters → returns up to 10 of the most recently active…

Full schema: https://pipedream.com/apps/openphone/actions/list-conversations.md

### `openphone-list-from-options` — List From Options (Read-only)

List your OpenPhone phone numbers as selectable sender options, for use as the from value in Send a Text Message. Example: call with no inputs → returns a list of {label, value} pairs, one per phone number, where value is the phone number ID to pass as from. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/list-from-options.md

### `openphone-list-messages` — List Messages (Read-only)

Retrieve a paginated list of messages from OpenPhone, scoped to a phone number and a participant — both are required by the API. Optionally narrow further to one conversation with conversationId. Example: call with phoneNumberId="PN123abc", participants=["+15551234567"] → returns up to 10 recent…

Full schema: https://pipedream.com/apps/openphone/actions/list-messages.md

### `openphone-list-phone-numbers` — List Phone Numbers (Read-only)

Retrieve the list of phone numbers and users associated with your OpenPhone workspace. Example: call with no inputs → returns each phone number's id, number, name, and the users assigned to it. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/list-phone-numbers.md

### `openphone-list-tasks` — List Tasks (Read-only)

Retrieve a paginated list of tasks, optionally filtered by conversation. Use List Conversations or List Messages to find a conversationId. Example: call with no filters → returns up to 50 recent tasks across the organization. Use fields to return only specific fields per task. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/list-tasks.md

### `openphone-list-users` — List Users (Read-only)

Retrieve a paginated list of users in your OpenPhone workspace. Use this to find a user's ID before assigning a task or filtering calls/messages/conversations by userId. Example: call with no inputs → returns up to 10 users, each with id, name, and email. See the documentation

Full schema: https://pipedream.com/apps/openphone/actions/list-users.md

### `openphone-send-message` — Send a Text Message (Write)

Send a text message from one of your OpenPhone numbers to a recipient. Use List Phone Numbers (or List From Options) to find a valid from value. Example: call with from="PN123abc", to="+15551234567", content="Hi, following up on your request." → sends the message and returns the created message…

Full schema: https://pipedream.com/apps/openphone/actions/send-message.md

### `openphone-update-contact` — Update Contact (Write)

Update one or more fields on an existing contact. Only the fields you provide are changed; omitted fields are left as-is. Run List Contacts to find a contactId. Example: call with contactId from List Contacts and company="Acme Corp" → updates just the company field and returns the updated contact…

Full schema: https://pipedream.com/apps/openphone/actions/update-contact.md

### `openphone-update-conversation` — Update Conversation Status (Write)

Update the status of an OpenPhone conversation. Set conversationStatus to done, open, or read; the action routes to the corresponding OpenPhone endpoint (mark-as-done, mark-as-open, mark-as-read). Use List Conversations or List Messages to find the conversationId. Example: call with…

Full schema: https://pipedream.com/apps/openphone/actions/update-conversation.md

### `openphone-update-task` — Update Task (Write)

Update an existing task's title and description by ID. NOTE: the OpenPhone update endpoint only modifies title and description (both required on every update); due date and assignee are managed via other endpoints. Use List Tasks to find task IDs. Example: call with taskId="TK123abc", title="Follow…

Full schema: https://pipedream.com/apps/openphone/actions/update-task.md

## Triggers (4)

### `openphone-new-call-recording-completed-instant` — New Call Recording Completed (Instant) (Instant)

Emit new event when a call recording has finished.

Full schema: https://pipedream.com/apps/openphone/triggers/new-call-recording-completed-instant.md

### `openphone-new-incoming-call-completed-instant` — New Incoming Call Completed (Instant) (Instant)

Emit new event when an incoming call is completed, including calls not picked up or voicemails left.

Full schema: https://pipedream.com/apps/openphone/triggers/new-incoming-call-completed-instant.md

### `openphone-new-message-received-instant` — New Message Received (Instant) (Instant)

Emit new event when a new message is received

Full schema: https://pipedream.com/apps/openphone/triggers/new-message-received-instant.md

### `openphone-new-outgoing-call-completed-instant` — New Outgoing Call Completed (Instant) (Instant)

Emit new event when an outgoing call has ended.

Full schema: https://pipedream.com/apps/openphone/triggers/new-outgoing-call-completed-instant.md

---

- All apps: https://pipedream.com/apps — index: https://pipedream.com/llms.txt
- Pipedream docs for agents: https://pipedream.com/docs/llms.txt
