Skip to main content

Contact Record API

Create, read, update, and delete contact records. Contacts are individuals associated with customers, vendors, or partners.


Endpoints

MethodEndpointDescription
GET/record/v1/contactList all contacts
GET/record/v1/contact/{id}Get specific contact
POST/record/v1/contactCreate new contact
PATCH/record/v1/contact/{id}Update existing contact
DELETE/record/v1/contact/{id}Delete contact

Base URL

https://{account_id}.suitetalk.api.netsuite.com/services/rest/record/v1/contact

Key Fields

Identification

FieldTypeDescriptionRequired
idstringInternal ID (read-only)-
entityIdstringContact IDNo
salutationstringTitle/salutation (Mr., Mrs., Dr., etc.)No
firstNamestringFirst nameNo
middleNamestringMiddle nameNo
lastNamestringLast nameYes
suffixstringName suffix (Jr., Sr., III, etc.)No
titlestringJob titleNo
subsidiaryobjectPrimary subsidiaryYes (if OneWorld)

Contact Information

FieldTypeDescriptionRequired
emailstringPrimary email addressNo
altEmailstringAlternate emailNo
phonestringPrimary phoneNo
homePhonestringHome phoneNo
mobilePhonestringMobile phoneNo
officePhonestringOffice phoneNo
faxstringFax numberNo

Relationships

FieldTypeDescriptionRequired
companyobjectAssociated customer/vendor/partnerNo
supervisorobjectReports to (contact reference)No
subsidiaryobjectPrimary subsidiaryYes (if OneWorld)

Status & Preferences

FieldTypeDescriptionRequired
isInactivebooleanInactive flagNo
isPrivatebooleanPrivate contact (visible only to creator)No
globalSubscriptionStatusobjectEmail subscription statusNo

Additional Information

FieldTypeDescriptionRequired
commentsstringNotes/commentsNo
defaultAddressstringDefault address textNo
imageobjectContact photo/image fileNo
assistantNamestringAssistant's nameNo
assistantPhonestringAssistant's phoneNo

Social Media

FieldTypeDescription
socialProfileFacebookstringFacebook profile URL
socialProfileTwitterstringTwitter handle
socialProfileLinkedInstringLinkedIn profile URL
socialProfileGooglePlusstringGoogle+ profile URL

Sublists/Collections

FieldTypeDescription
addressBookcollectionContact addresses

Example: Create Contact for Customer

POST /record/v1/contact
Content-Type: application/json
Authorization: Bearer {access_token}
{
"salutation": "Mr.",
"firstName": "John",
"middleName": "A.",
"lastName": "Smith",
"title": "Purchasing Manager",
"company": {
"id": "456"
},
"email": "john.smith@acmecorp.com",
"phone": "555-0500",
"mobilePhone": "555-0501",
"officePhone": "555-0100 ext. 234",
"subsidiary": {
"id": "1"
},
"comments": "Primary contact for purchasing decisions. Prefers email communication.",
"isPrivate": false
}

Response

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/contact/890"
}
],
"id": "890",
"refName": "John Smith",
"entityId": "CONT-890",
"salutation": "Mr.",
"firstName": "John",
"middleName": "A.",
"lastName": "Smith",
"title": "Purchasing Manager",
"email": "john.smith@acmecorp.com",
"phone": "555-0500",
"mobilePhone": "555-0501",
"company": {
"id": "456",
"refName": "Acme Corporation"
},
"subsidiary": {
"id": "1",
"refName": "Parent Company"
},
"isInactive": false,
"isPrivate": false
}

Example: Update Contact

PATCH /record/v1/contact/890
Content-Type: application/json
Authorization: Bearer {access_token}
{
"email": "j.smith@acmecorp.com",
"title": "Senior Purchasing Manager",
"mobilePhone": "555-0999",
"comments": "Promoted to Senior Purchasing Manager. Updated contact preferences."
}

Response

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/contact/890"
}
],
"id": "890",
"refName": "John Smith",
"firstName": "John",
"lastName": "Smith",
"title": "Senior Purchasing Manager",
"email": "j.smith@acmecorp.com",
"mobilePhone": "555-0999",
"company": {
"id": "456",
"refName": "Acme Corporation"
}
}

Example: Create Standalone Contact

Contacts don't require a company association:

POST /record/v1/contact
Content-Type: application/json
Authorization: Bearer {access_token}
{
"firstName": "Sarah",
"lastName": "Johnson",
"email": "sarah.j@email.com",
"phone": "555-0600",
"subsidiary": {
"id": "1"
},
"comments": "Industry analyst - not associated with specific account",
"isPrivate": false
}

Response

{
"links": [
{
"rel": "self",
"href": "https://1234567.suitetalk.api.netsuite.com/services/rest/record/v1/contact/891"
}
],
"id": "891",
"refName": "Sarah Johnson",
"firstName": "Sarah",
"lastName": "Johnson",
"email": "sarah.j@email.com",
"phone": "555-0600",
"isInactive": false
}

Example: Add Contact with Address

POST /record/v1/contact
Content-Type: application/json
Authorization: Bearer {access_token}
{
"firstName": "Michael",
"lastName": "Chen",
"company": {
"id": "456"
},
"email": "michael.chen@acmecorp.com",
"phone": "555-0700",
"subsidiary": {
"id": "1"
},
"addressBook": {
"items": [
{
"defaultShipping": false,
"defaultBilling": false,
"label": "Office Address",
"addressBookAddress": {
"addr1": "456 Business Park Drive",
"addr2": "Suite 200",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": {
"refName": "US"
},
"attention": "Michael Chen"
}
}
]
}
}

Query Filters

Find Contacts by Company

GET /record/v1/contact?q=company='456'

Find Contacts by Email

GET /record/v1/contact?q=email='john.smith@acmecorp.com'

Find Active Contacts

GET /record/v1/contact?q=isInactive=false

Find Contacts by Name

GET /record/v1/contact?q=firstName='John' AND lastName='Smith'

Find Contacts by Last Name Pattern

GET /record/v1/contact?q=lastName LIKE 'Smith%'

Find Contacts by Phone

GET /record/v1/contact?q=phone LIKE '555-05%'

Find Private Contacts

GET /record/v1/contact?q=isPrivate=true

Find Contacts by Subsidiary

GET /record/v1/contact?q=subsidiary='1'

Common Use Cases

1. Primary Contact on Customer Record

When creating a customer, you can reference a contact:

// First, create the contact
const contact = await createContact({
firstName: "John",
lastName: "Smith",
email: "john@acme.com",
company: { id: customerId },
subsidiary: { id: "1" }
});

// Then reference on customer record
await patchCustomer(customerId, {
contact: { id: contact.id }
});

2. Multiple Contacts per Customer

Use the Customer's contactRoles sublist to associate multiple contacts with different roles:

// On customer record
await patchCustomer(customerId, {
contactRoles: {
items: [
{
contact: { id: "890" },
role: { id: "1" }, // Purchasing
isPrimary: true,
email: true,
giveAccess: true
},
{
contact: { id: "891" },
role: { id: "2" }, // Billing
email: true,
giveAccess: false
},
{
contact: { id: "892" },
role: { id: "3" }, // Technical
email: true,
giveAccess: true
}
]
}
});

Contacts can be associated with specific customer addresses:

await createContact({
firstName: "Jane",
lastName: "Doe",
company: { id: "456" },
email: "jane@acme.com",
subsidiary: { id: "1" },
addressBook: {
items: [
{
addressBookAddress: {
addr1: "789 Main Street",
city: "New York",
state: "NY",
zip: "10001",
country: { refName: "US" }
}
}
]
}
});

4. Set Contact as Transaction Contact

When creating transactions, specify the contact:

// Sales Order
await createSalesOrder({
entity: { id: "456" },
custbody_contact: { id: "890" },
// ... other fields
});

// Invoice
await createInvoice({
entity: { id: "456" },
custbody_contact: { id: "890" },
// ... other fields
});

5. Manage Email Subscription Status

// Opt-in contact for marketing emails
await patchContact(contactId, {
globalSubscriptionStatus: { id: "CONFIRMED_OPT_IN" }
});

// Opt-out contact from marketing emails
await patchContact(contactId, {
globalSubscriptionStatus: { id: "SOFT_OPT_OUT" }
});

6. Create Private Contact

// Create contact visible only to creator and admins
await createContact({
firstName: "Confidential",
lastName: "Contact",
email: "confidential@example.com",
subsidiary: { id: "1" },
isPrivate: true,
comments: "Confidential negotiation contact"
});

7. Update Contact Social Media

await patchContact(contactId, {
socialProfileLinkedIn: "https://linkedin.com/in/johnsmith",
socialProfileTwitter: "@johnsmith",
socialProfileFacebook: "https://facebook.com/johnsmith"
});

Important Notes

Required Fields

  • lastName: Last name is required
  • subsidiary: Required in OneWorld accounts
  • firstName, middleName, and other fields are optional

Contact vs Customer

  • Contact: Individual person
  • Customer: Company or individual that you sell to
  • Contacts are often associated with company customers but can exist independently
  • Individual customers (isPerson=true) are both a customer record and represent a person

Private Contacts

Setting isPrivate=true makes the contact visible only to:

  • The user who created it
  • Administrators
  • Users with "View Private Contacts" permission

Use private contacts for sensitive relationships or confidential negotiations.

Email Subscription Status

The globalSubscriptionStatus field controls whether the contact receives marketing emails:

StatusDescription
SOFT_OPT_INImplied consent (default)
CONFIRMED_OPT_INExplicitly opted in
SOFT_OPT_OUTUnsubscribed
CONFIRMED_OPT_OUTExplicitly opted out

Respect these settings when sending marketing communications to comply with regulations like GDPR and CAN-SPAM.

Contact Roles

When associating contacts with customers via contactRoles:

  • role: Define the contact's function (Purchasing, Billing, Technical, etc.)
  • isPrimary: Designate one contact as primary
  • email: Include in email communications
  • giveAccess: Provide customer center access

Multiple Phone Numbers

NetSuite supports several phone number fields:

  • phone: Primary phone (general use)
  • officePhone: Direct office line
  • homePhone: Personal/home number
  • mobilePhone: Cell/mobile number
  • fax: Fax number
  • assistantPhone: Assistant's contact number

Deleting Contacts

  • Cannot delete contacts referenced on transactions
  • Cannot delete contacts with customer center access
  • Consider marking as inactive instead: isInactive: true

Best Practices

  • Always include email address for business contacts
  • Use title field to capture job role
  • Populate mobile and office phone when available
  • Use comments field for important context or preferences
  • Keep contact information up to date
  • Use contact roles to define relationships clearly
  • Respect privacy settings and email preferences
  • Use entityId for external system integration

Contact Role Configuration

Common Contact Roles

RoleDescriptionTypical Use
PurchasingBuying decisionsPurchase orders, quotes
Billing/AccountingFinancial mattersInvoices, payments
TechnicalProduct/service supportSupport cases, technical discussions
Executive SponsorStrategic relationshipHigh-level communications
OperationsDay-to-day operationsShipping, delivery coordination
LegalContracts and agreementsContract review, legal matters

Setting Up Contact Roles

// Create customer with multiple contact roles
await patchCustomer(customerId, {
contactRoles: {
items: [
{
contact: { id: "890" },
role: { refName: "Purchasing" },
isPrimary: true,
email: true,
giveAccess: true
},
{
contact: { id: "891" },
role: { refName: "Billing" },
email: true,
giveAccess: false
},
{
contact: { id: "892" },
role: { refName: "Technical" },
email: true,
giveAccess: true
}
]
}
});

Integration Scenarios

1. CRM Integration

Sync contacts from external CRM:

// Map CRM contact to NetSuite
const crmContact = getCRMContact(crmId);

const nsContact = await createContact({
firstName: crmContact.firstName,
lastName: crmContact.lastName,
email: crmContact.email,
phone: crmContact.phone,
mobilePhone: crmContact.mobile,
title: crmContact.jobTitle,
company: { id: crmContact.nsCustomerId },
subsidiary: { id: "1" },
// Store CRM ID for future sync
externalId: crmContact.id
});

2. Customer Portal

Create contact with customer center access:

const contact = await createContact({
firstName: "Portal",
lastName: "User",
email: "user@customer.com",
company: { id: customerId },
subsidiary: { id: "1" }
});

// Enable customer center access via customer record
await patchCustomer(customerId, {
contactRoles: {
items: [
{
contact: { id: contact.id },
role: { refName: "Primary Contact" },
isPrimary: true,
giveAccess: true,
email: true
}
]
}
});

3. Email Marketing Integration

Manage email subscription status:

// Sync opt-in from marketing platform
async function syncEmailPreference(contactEmail, optInStatus) {
const contacts = await getContacts(`email='${contactEmail}'`);

if (contacts.length > 0) {
const status = optInStatus ? "CONFIRMED_OPT_IN" : "SOFT_OPT_OUT";

await patchContact(contacts[0].id, {
globalSubscriptionStatus: { id: status }
});
}
}

See Also

  • Customer - Associate contacts with customers
  • Vendor - Associate contacts with vendors
  • Sales Order - Specify contact on transactions