# Create or Update Contact — Apollo

> Creates a new contact or updates an existing one in your Apollo CRM. To create, omit contactId and provide at least an email. To update, provide the contactId and any fields to change. Use Search Contacts to find existing contacts by name…

- Key: `apollo_io_oauth-create-or-update-contact`
- Type: Action (Write)
- Version: 0.0.2
- App: Apollo (`apollo_io_oauth`) — https://pipedream.com/apps/apollo-io-oauth.md
- This page (HTML): https://pipedream.com/apps/apollo-io-oauth/actions/create-or-update-contact
- Hints: open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/apollo_io_oauth/actions/create-or-update-contact/create-or-update-contact.mjs

## Description

Creates a new contact or updates an existing one in your Apollo CRM. To create, omit `contactId` and provide at least an `email`. To update, provide the `contactId` and any fields to change. Use **Search Contacts** to find existing contacts by name or email before updating. Use **List Metadata** (type `contact_stages`) to discover valid stage IDs. The `accountId` links this contact to a company — use **Search Accounts** to find the account ID. [See the documentation](https://docs.apollo.io/reference/create-a-contact)

## Props

| Prop | Type | Required | Description |
|---|---|---|---|
| `contactId` | `string` | No | The ID of an existing contact to update. Omit this to create a new contact. |
| `email` | `string` | No | Email address of the contact. Required when creating. |
| `firstName` | `string` | No | First name of the contact. |
| `lastName` | `string` | No | Last name of the contact. |
| `title` | `string` | No | Job title of the contact. Example: "VP of Sales". |
| `accountId` | `string` | No | ID of the account (company) to link this contact to. Use Search Accounts to find account IDs. |
| `websiteUrl` | `string` | No | The organization website for Apollo to enrich data. Do NOT pass personal social media URLs. This is ignored if a valid email is provided. |
| `labelNames` | `string[]` | No | Tag names to apply to this contact. Example: ["VIP", "Decision Maker"]. Use List Metadata (type labels) to see existing labels. |
| `contactStageId` | `string` | No | The pipeline stage for this contact. Use List Metadata (type contact_stages) to discover valid stage IDs. |
| `address` | `string` | No | Full address string. Apollo will infer city, state, country, and timezone. |
| `phone` | `string` | No | Direct dial phone number for this contact. |

## Run it

**MCP**

```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": "apollo_io_oauth",
      },
    },
  },
)

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

const { tools } = await mcp.listTools()

// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
  name: "apollo_io_oauth-create-or-update-contact",
  arguments: {
    contactId: "Contact ID",
    email: "Email",
  },
})
```

**TypeScript**

```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: "apollo_io_oauth-create-or-update-contact",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    apollo_io_oauth: { authProvisionId: "apn_xxxxxxx" },
    contactId: "Contact ID",
    email: "Email",
  },
})

console.log(result)
```

**cURL**

```bash
curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
  -H "Content-Type: application/json" \
  -H "X-PD-Environment: production" \
  -H "Authorization: Bearer {access_token}" \
  -d '{
    "external_user_id": "{external_user_id}",
    "id": "apollo_io_oauth-create-or-update-contact",
    "configured_props": {
      "apollo_io_oauth": { "authProvisionId": "apn_xxxxxxx" },
      "contactId": "Contact ID",
      "email": "Email"
    }
  }'
```

---

- App: https://pipedream.com/apps/apollo-io-oauth.md · All apps: https://pipedream.com/apps
