Create a contact
curl --request POST \
--url https://api.vegaminds.com/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"first_name": "Jordan",
"last_name": "Ellis",
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": true
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": true
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": true
}
]
}
'import requests
url = "https://api.vegaminds.com/v1/contacts"
payload = {
"first_name": "Jordan",
"last_name": "Ellis",
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": True
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": True
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: 'Jordan',
last_name: 'Ellis',
company_name: 'Ellis Design Studio',
job_title: 'Founder',
birth_date: '1978-04-12',
contact_type: 'client',
email_addresses: [{address: 'jordan.ellis@example.com', kind: 'personal', is_primary: true}],
phone_numbers: [{number: '+1 207-555-0142', kind: 'personal', is_primary: true}],
mailing_addresses: [
{
street_line_1: '48 Harbor Lane',
city: 'Portland',
state: 'ME',
zipcode: '04101',
country: 'US',
kind: 'personal',
is_primary: true
}
]
})
};
fetch('https://api.vegaminds.com/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"is_external": false,
"id": "1f128fef-f499-4c88-a53e-75f235ccb65a",
"first_name": "Jordan",
"middle_name": null,
"last_name": "Ellis",
"nickname": null,
"suffix": null,
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": true
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": true
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"street_line_2": null,
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": true
}
],
"households": [
{
"id": "46852331-f25c-4fcc-9d16-2162c96be9ad",
"name": "Ellis family"
}
],
"created_on": "2026-03-02T14:05:11Z",
"updated_on": "2026-10-28T09:41:37Z",
"important_information": "Prefers afternoon calls.",
"financial_planning": "College savings and retirement.",
"investments": null,
"living_story": null,
"services": [
"financial_planning"
],
"custom_fields": [
{
"name": "Preferred review month",
"value": "April"
}
],
"roles": [],
"related_contacts": [],
"related_to_contacts": [],
"related_households": [],
"related_to_households": [],
"owner": null,
"creator": null,
"gender": null,
"marital_status": null,
"occupation": null,
"client_since_date": null,
"investment_objective": null,
"time_horizon": null,
"risk_tolerance": null,
"investment_experience": null,
"linkedin_url": null,
"twitter_name": null,
"gross_annual_income": null,
"assets": null,
"non_liquid_assets": null,
"liabilities": null
}{
"error": {
"code": "invalid_request",
"message": "The request body is invalid.",
"fields": {
"email_addresses[0].address": "Must be an email address."
}
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "invalid_token",
"message": "The access token is invalid, expired or revoked."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "insufficient_scope",
"message": "This request needs the contacts:write scope, which the user did not grant. Connect the user again, asking for it."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Wait the number of seconds in the Retry-After header, then try again."
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Try again later, and contact Vega support with the request id if it keeps happening."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}Contacts
Create a contact
Creates a contact owned by the connected user. It needs a first name or a last name.
POST
/
contacts
Create a contact
curl --request POST \
--url https://api.vegaminds.com/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"first_name": "Jordan",
"last_name": "Ellis",
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": true
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": true
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": true
}
]
}
'import requests
url = "https://api.vegaminds.com/v1/contacts"
payload = {
"first_name": "Jordan",
"last_name": "Ellis",
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": True
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": True
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: 'Jordan',
last_name: 'Ellis',
company_name: 'Ellis Design Studio',
job_title: 'Founder',
birth_date: '1978-04-12',
contact_type: 'client',
email_addresses: [{address: 'jordan.ellis@example.com', kind: 'personal', is_primary: true}],
phone_numbers: [{number: '+1 207-555-0142', kind: 'personal', is_primary: true}],
mailing_addresses: [
{
street_line_1: '48 Harbor Lane',
city: 'Portland',
state: 'ME',
zipcode: '04101',
country: 'US',
kind: 'personal',
is_primary: true
}
]
})
};
fetch('https://api.vegaminds.com/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"is_external": false,
"id": "1f128fef-f499-4c88-a53e-75f235ccb65a",
"first_name": "Jordan",
"middle_name": null,
"last_name": "Ellis",
"nickname": null,
"suffix": null,
"company_name": "Ellis Design Studio",
"job_title": "Founder",
"birth_date": "1978-04-12",
"contact_type": "client",
"email_addresses": [
{
"address": "jordan.ellis@example.com",
"kind": "personal",
"is_primary": true
}
],
"phone_numbers": [
{
"number": "+1 207-555-0142",
"kind": "personal",
"is_primary": true
}
],
"mailing_addresses": [
{
"street_line_1": "48 Harbor Lane",
"street_line_2": null,
"city": "Portland",
"state": "ME",
"zipcode": "04101",
"country": "US",
"kind": "personal",
"is_primary": true
}
],
"households": [
{
"id": "46852331-f25c-4fcc-9d16-2162c96be9ad",
"name": "Ellis family"
}
],
"created_on": "2026-03-02T14:05:11Z",
"updated_on": "2026-10-28T09:41:37Z",
"important_information": "Prefers afternoon calls.",
"financial_planning": "College savings and retirement.",
"investments": null,
"living_story": null,
"services": [
"financial_planning"
],
"custom_fields": [
{
"name": "Preferred review month",
"value": "April"
}
],
"roles": [],
"related_contacts": [],
"related_to_contacts": [],
"related_households": [],
"related_to_households": [],
"owner": null,
"creator": null,
"gender": null,
"marital_status": null,
"occupation": null,
"client_since_date": null,
"investment_objective": null,
"time_horizon": null,
"risk_tolerance": null,
"investment_experience": null,
"linkedin_url": null,
"twitter_name": null,
"gross_annual_income": null,
"assets": null,
"non_liquid_assets": null,
"liabilities": null
}{
"error": {
"code": "invalid_request",
"message": "The request body is invalid.",
"fields": {
"email_addresses[0].address": "Must be an email address."
}
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "invalid_token",
"message": "The access token is invalid, expired or revoked."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "insufficient_scope",
"message": "This request needs the contacts:write scope, which the user did not grant. Connect the user again, asking for it."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Wait the number of seconds in the Retry-After header, then try again."
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Try again later, and contact Vega support with the request id if it keeps happening."
},
"request_id": "3f6c1e9a-2b7d-4c58-9e41-8a0d5b7f2c16"
}Authorizations
Body
application/json
A contact needs a first name or a last name. An empty string is the same as null.
Response
The created contact.
True when this record has an active integration link, including an export from Vega. This is current linkage, not historical origin, and is independent of linked contacts or households. Associated records cannot be patched or deleted through this API, except that a meeting may patch reviewed alone. No provider/account details are exposed.

