Create a Contact

Endpoint essentials
API key accessapi/v1/contacts/create or Master API key
OAuth scopescontact_write
Credit usage0 credits
Learn more about API pricing and credits.

Contacts are people saved in Apollo.

Use the Create a Contact endpoint to add a new contact to your team's Apollo account.

By default, Apollo doesn't apply deduplication processes when you create a new contact via API. If your entry has the same name, email address, or other details as an existing contact, Apollo creates a new contact instead of updating the existing contact. To enable deduplication and prevent duplicate contacts, set the run_dedupe parameter to true.

To update an existing contact, use the Update a Contact endpoint instead.

What run_dedupe actually does

Setting run_dedupe to true does more than suppress a duplicate. On a match, Apollo updates that existing contact in place with your request's values and returns it. The response looks like a creation, but the id belongs to the pre-existing contact — so treating every 200 as "a new contact was created" doesn't hold once run_dedupe is on.

How Apollo picks the match. It checks these in order and stops at the first hit, so a match isn't necessarily on email:

  1. id, if you send one.
  2. CRM identifiers: salesforce_lead_id, salesforce_contact_id, hubspot_vid, or a previously merged CRM ID.
  3. person_id.
  4. email — compared against the contact's primary email and any additional emails stored on it.
  5. first_name plus last_name (or a full name) with a matching company, where the company matches on email domain, organization_id, or organization_name.

Because of step 5, a contact can be matched and updated even when the email you send differs from the stored one.

What the update writes. It's a field-level overwrite of the values you send, not a merge that prefers existing data:

  • Fields you send overwrite the stored values, with no warning and no record of the previous value.
  • Fields you omit are left untouched, so you don't need to resend the whole record.
  • An empty value clears the field rather than being ignored.
  • The contact's email can itself be overwritten when the match came from a CRM ID, person_id, or name-plus-company. email_status isn't re-verified, so it can keep reading verified while describing the previous address.
  • Protected once set: person_id, salesforce_lead_id, and salesforce_contact_id. LinkedIn-sourced photos won't replace an existing photo_url.

Recommended handling. To add records without changing existing ones, leave run_dedupe off (the default) and reconcile duplicates yourself. To upsert, set it to true and send the complete set of fields you want the contact to end up with, since omitted fields keep their old values. To edit a known contact, prefer Update a Contact with its id — explicit, with no matching involved.

Bulk Create Contacts differs: matched contacts are returned in existing_contacts without being modified.

Body Params
string

The first name of the contact you want to create. Example: Tim

string

The last name of the contact you want to create. Example: Zheng

string

The name of the contact's employer (company). Example: apollo

string

The current job title that the contact holds. Example: senior research analyst

string

The Apollo ID for the account. Example: 63f53afe4ceeca00016bdd2f

string

The email address of the contact. Example: [email protected]

string

The corporate website URL. Example: https://www.apollo.io/

label_names
array of strings

Lists to which the contact belongs.

label_names
string

The Apollo ID for the contact stage. Example: 6095a710bd01d100a506d4ae

string

The personal location for the contact. Example: Atlanta, United States

string

The primary phone number. Example: 555-555-0133

string

The work/office phone number. Example: +44 7700 900852

string

The mobile phone number. Example: 555-555-0133

string

The home phone number. Example: 555-555-0133

string

Alternative phone number. Example: 555-555-0133

typed_custom_fields
object

Add information to custom fields in Apollo.

Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.

To utilize this parameter successfully, call the Get a List of All Custom Fields endpoint and identify the id value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying id value for the picklist entry that you want to use as the input value.

Example: When the Get a List of All Custom Fields endpoint returns an id of field:

  • "60c39ed82bd02f01154c470a" (datetime)

then the value passed should be:

{"60c39ed82bd02f01154c470a": "2025-08-07"}

boolean
Defaults to false

Set to true to match against your existing contacts instead of always creating a new one. The default value is false.

When a match is found, Apollo updates that existing contact in place with the values you sent and returns it — the id in the response belongs to the pre-existing contact, not a new record. Fields you send overwrite the stored values, fields you omit are left untouched, and sending an empty value clears the field.

Matching is checked in order: id, CRM identifiers, person_id, email (against the contact's primary and additional emails), then name plus company. Because of the last rule, a contact can be matched and updated even when the email differs.

When deduplication is enabled, performance may be slightly impacted due to the additional matching checks. See the endpoint description for full details.

Headers
string
enum
Defaults to application/json

Generated from available response content types

Allowed:
Responses

Language
Credentials
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json
text/plain