curl --request POST \
--url https://api.monaco.com/v1/contacts/ \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane@acme.com",
"linkedin_url": "https://linkedin.com/in/janesmith",
"first_name": "Jane",
"last_name": "Smith",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"location": "San Francisco, CA",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"domain": "acme.com",
"do_not_contact": false,
"tags": [
"550e8400-e29b-41d4-a716-446655440001"
],
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
}
'import requests
url = "https://api.monaco.com/v1/contacts/"
payload = {
"email": "jane@acme.com",
"linkedin_url": "https://linkedin.com/in/janesmith",
"first_name": "Jane",
"last_name": "Smith",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"location": "San Francisco, CA",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"domain": "acme.com",
"do_not_contact": False,
"tags": ["550e8400-e29b-41d4-a716-446655440001"],
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'jane@acme.com',
linkedin_url: 'https://linkedin.com/in/janesmith',
first_name: 'Jane',
last_name: 'Smith',
title: 'VP of Engineering',
phone_number: '+1-555-123-4567',
location: 'San Francisco, CA',
account_id: '550e8400-e29b-41d4-a716-446655440000',
domain: 'acme.com',
do_not_contact: false,
tags: ['550e8400-e29b-41d4-a716-446655440001'],
'custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d': 'economic_buyer'
})
};
fetch('https://api.monaco.com/v1/contacts/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.monaco.com/v1/contacts/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'jane@acme.com',
'linkedin_url' => 'https://linkedin.com/in/janesmith',
'first_name' => 'Jane',
'last_name' => 'Smith',
'title' => 'VP of Engineering',
'phone_number' => '+1-555-123-4567',
'location' => 'San Francisco, CA',
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'domain' => 'acme.com',
'do_not_contact' => false,
'tags' => [
'550e8400-e29b-41d4-a716-446655440001'
],
'custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d' => 'economic_buyer'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.monaco.com/v1/contacts/"
payload := strings.NewReader("{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.monaco.com/v1/contacts/")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.monaco.com/v1/contacts/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "con_abc123",
"account_id": "acc_def456",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@acme.com",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"linkedin_url": "https://linkedin.com/in/janesmith",
"location": "San Francisco, CA",
"source": "api",
"do_not_contact": false,
"notes": "Met at SaaStr 2025",
"scoring": {
"heat_score": "Hot"
},
"tags": [],
"created_at": "2026-04-21T12:00:00Z",
"updated_at": "2026-04-21T12:00:00Z",
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
},
"meta": {
"timestamp": "2026-04-21T12:00:00Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Create a Contact
Creates a new contact.
Identifiers — either email or linkedin_url must be provided. If only linkedin_url is supplied, you must also provide account_id or domain so the contact can be associated with an account.
Account resolution priority — Monaco resolves the contact’s account in this order:
account_id(if provided)domain(if provided)- the domain parsed from
email
Enrichment — on creation, Monaco synchronously enriches the contact (name, title, company association, etc.) and, if needed, resolves or creates the associated account. This can make create requests take several seconds to complete; clients should use generous timeouts (10s+) and avoid issuing creates on hot paths.
curl --request POST \
--url https://api.monaco.com/v1/contacts/ \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane@acme.com",
"linkedin_url": "https://linkedin.com/in/janesmith",
"first_name": "Jane",
"last_name": "Smith",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"location": "San Francisco, CA",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"domain": "acme.com",
"do_not_contact": false,
"tags": [
"550e8400-e29b-41d4-a716-446655440001"
],
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
}
'import requests
url = "https://api.monaco.com/v1/contacts/"
payload = {
"email": "jane@acme.com",
"linkedin_url": "https://linkedin.com/in/janesmith",
"first_name": "Jane",
"last_name": "Smith",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"location": "San Francisco, CA",
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"domain": "acme.com",
"do_not_contact": False,
"tags": ["550e8400-e29b-41d4-a716-446655440001"],
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'jane@acme.com',
linkedin_url: 'https://linkedin.com/in/janesmith',
first_name: 'Jane',
last_name: 'Smith',
title: 'VP of Engineering',
phone_number: '+1-555-123-4567',
location: 'San Francisco, CA',
account_id: '550e8400-e29b-41d4-a716-446655440000',
domain: 'acme.com',
do_not_contact: false,
tags: ['550e8400-e29b-41d4-a716-446655440001'],
'custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d': 'economic_buyer'
})
};
fetch('https://api.monaco.com/v1/contacts/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.monaco.com/v1/contacts/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'jane@acme.com',
'linkedin_url' => 'https://linkedin.com/in/janesmith',
'first_name' => 'Jane',
'last_name' => 'Smith',
'title' => 'VP of Engineering',
'phone_number' => '+1-555-123-4567',
'location' => 'San Francisco, CA',
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'domain' => 'acme.com',
'do_not_contact' => false,
'tags' => [
'550e8400-e29b-41d4-a716-446655440001'
],
'custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d' => 'economic_buyer'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.monaco.com/v1/contacts/"
payload := strings.NewReader("{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.monaco.com/v1/contacts/")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.monaco.com/v1/contacts/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jane@acme.com\",\n \"linkedin_url\": \"https://linkedin.com/in/janesmith\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Smith\",\n \"title\": \"VP of Engineering\",\n \"phone_number\": \"+1-555-123-4567\",\n \"location\": \"San Francisco, CA\",\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"domain\": \"acme.com\",\n \"do_not_contact\": false,\n \"tags\": [\n \"550e8400-e29b-41d4-a716-446655440001\"\n ],\n \"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\": \"economic_buyer\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "con_abc123",
"account_id": "acc_def456",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@acme.com",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"linkedin_url": "https://linkedin.com/in/janesmith",
"location": "San Francisco, CA",
"source": "api",
"do_not_contact": false,
"notes": "Met at SaaStr 2025",
"scoring": {
"heat_score": "Hot"
},
"tags": [],
"created_at": "2026-04-21T12:00:00Z",
"updated_at": "2026-04-21T12:00:00Z",
"custom_field_1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "economic_buyer"
},
"meta": {
"timestamp": "2026-04-21T12:00:00Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Body
Request body for creating a contact via POST or upserting via PUT.
Custom fields can be passed as additional keys prefixed with custom_field_.
Email address of the contact. Either email or linkedin_url is required.
"jane@acme.com"
LinkedIn profile URL. Either email or linkedin_url is required.
"https://linkedin.com/in/janesmith"
First name of the contact
"Jane"
Last name of the contact
"Smith"
Job title of the contact
"VP of Engineering"
Phone number of the contact
"+1-555-123-4567"
Location of the contact
"San Francisco, CA"
ID of the account to associate the contact with
Domain of the contact's company (used for account resolution)
"acme.com"
Whether the contact has opted out of outreach
List of tag IDs to associate with the contact