curl --request POST \
--url https://api.instaview.sk/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "John",
"lastName": "Doe",
"gdprExpiryDate": "2026-11-16",
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"metadata": {
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": [
"senior",
"remote-preferred"
],
"externalId": "CAND-12345"
},
"fields": {
"is_vip": true,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
},
"gender": "female",
"cvText": "Jane Doe\nSoftware Engineer\nExperience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}
'import requests
url = "https://api.instaview.sk/contacts"
payload = {
"firstName": "John",
"lastName": "Doe",
"gdprExpiryDate": "2026-11-16",
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"metadata": {
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": ["senior", "remote-preferred"],
"externalId": "CAND-12345"
},
"fields": {
"is_vip": True,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
},
"gender": "female",
"cvText": "Jane Doe
Software Engineer
Experience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}
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({
firstName: 'John',
lastName: 'Doe',
gdprExpiryDate: '2026-11-16',
email: 'john.doe@example.com',
phoneNumber: '+421915123456',
jobId: '123e4567-e89b-12d3-a456-426614174000',
jobIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
metadata: {
source: 'LinkedIn',
referredBy: 'Jane Smith',
tags: ['senior', 'remote-preferred'],
externalId: 'CAND-12345'
},
fields: {is_vip: true, order_number: 'SO-40128', renewal_date: '2026-04-01'},
gender: 'female',
cvText: 'Jane Doe\nSoftware Engineer\nExperience: ...',
workHistory: [
{
companyName: 'Google',
candidatePosition: 'Software Engineer',
referencePhone: '+1987654321',
id: '123e4567-e89b-12d3-a456-426614174000',
referenceName: 'Jane Smith',
startDate: '2020-01-01',
endDate: '2022-12-31'
}
]
})
};
fetch('https://api.instaview.sk/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.instaview.sk/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([
'firstName' => 'John',
'lastName' => 'Doe',
'gdprExpiryDate' => '2026-11-16',
'email' => 'john.doe@example.com',
'phoneNumber' => '+421915123456',
'jobId' => '123e4567-e89b-12d3-a456-426614174000',
'jobIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'metadata' => [
'source' => 'LinkedIn',
'referredBy' => 'Jane Smith',
'tags' => [
'senior',
'remote-preferred'
],
'externalId' => 'CAND-12345'
],
'fields' => [
'is_vip' => true,
'order_number' => 'SO-40128',
'renewal_date' => '2026-04-01'
],
'gender' => 'female',
'cvText' => 'Jane Doe
Software Engineer
Experience: ...',
'workHistory' => [
[
'companyName' => 'Google',
'candidatePosition' => 'Software Engineer',
'referencePhone' => '+1987654321',
'id' => '123e4567-e89b-12d3-a456-426614174000',
'referenceName' => 'Jane Smith',
'startDate' => '2020-01-01',
'endDate' => '2022-12-31'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.instaview.sk/contacts"
payload := strings.NewReader("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.instaview.sk/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "123e4567-e89b-12d3-a456-426614174000",
"firstName": "John",
"lastName": "Doe",
"status": "APPLIED",
"fields": {
"order_number": "SO-40128",
"is_vip": true,
"renewal_date": "2026-04-01"
},
"createdAt": "2025-11-20T10:30:00Z",
"updatedAt": "2025-11-20T10:30:00Z",
"jobId": "987e6543-e21b-12d3-a456-426614174000",
"jobIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"gdprExpiryDate": "2026-11-16",
"overallRating": 85,
"metadata": {
"source": "LinkedIn",
"externalId": "CAND-12345"
},
"analysisCount": 2,
"interviewCount": 3,
"links": {
"analyses": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/analyses",
"interviews": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/conversations"
},
"gender": "female",
"anonymizedCvText": "[NAME]\nSoftware Engineer\nExperience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}Create Contact
Creates a contact (optionally associated with one or more jobs) in the API key’s company.
curl --request POST \
--url https://api.instaview.sk/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "John",
"lastName": "Doe",
"gdprExpiryDate": "2026-11-16",
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"metadata": {
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": [
"senior",
"remote-preferred"
],
"externalId": "CAND-12345"
},
"fields": {
"is_vip": true,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
},
"gender": "female",
"cvText": "Jane Doe\nSoftware Engineer\nExperience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}
'import requests
url = "https://api.instaview.sk/contacts"
payload = {
"firstName": "John",
"lastName": "Doe",
"gdprExpiryDate": "2026-11-16",
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"jobIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"metadata": {
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": ["senior", "remote-preferred"],
"externalId": "CAND-12345"
},
"fields": {
"is_vip": True,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
},
"gender": "female",
"cvText": "Jane Doe
Software Engineer
Experience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}
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({
firstName: 'John',
lastName: 'Doe',
gdprExpiryDate: '2026-11-16',
email: 'john.doe@example.com',
phoneNumber: '+421915123456',
jobId: '123e4567-e89b-12d3-a456-426614174000',
jobIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
metadata: {
source: 'LinkedIn',
referredBy: 'Jane Smith',
tags: ['senior', 'remote-preferred'],
externalId: 'CAND-12345'
},
fields: {is_vip: true, order_number: 'SO-40128', renewal_date: '2026-04-01'},
gender: 'female',
cvText: 'Jane Doe\nSoftware Engineer\nExperience: ...',
workHistory: [
{
companyName: 'Google',
candidatePosition: 'Software Engineer',
referencePhone: '+1987654321',
id: '123e4567-e89b-12d3-a456-426614174000',
referenceName: 'Jane Smith',
startDate: '2020-01-01',
endDate: '2022-12-31'
}
]
})
};
fetch('https://api.instaview.sk/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.instaview.sk/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([
'firstName' => 'John',
'lastName' => 'Doe',
'gdprExpiryDate' => '2026-11-16',
'email' => 'john.doe@example.com',
'phoneNumber' => '+421915123456',
'jobId' => '123e4567-e89b-12d3-a456-426614174000',
'jobIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'metadata' => [
'source' => 'LinkedIn',
'referredBy' => 'Jane Smith',
'tags' => [
'senior',
'remote-preferred'
],
'externalId' => 'CAND-12345'
],
'fields' => [
'is_vip' => true,
'order_number' => 'SO-40128',
'renewal_date' => '2026-04-01'
],
'gender' => 'female',
'cvText' => 'Jane Doe
Software Engineer
Experience: ...',
'workHistory' => [
[
'companyName' => 'Google',
'candidatePosition' => 'Software Engineer',
'referencePhone' => '+1987654321',
'id' => '123e4567-e89b-12d3-a456-426614174000',
'referenceName' => 'Jane Smith',
'startDate' => '2020-01-01',
'endDate' => '2022-12-31'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.instaview.sk/contacts"
payload := strings.NewReader("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.instaview.sk/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"gdprExpiryDate\": \"2026-11-16\",\n \"email\": \"john.doe@example.com\",\n \"phoneNumber\": \"+421915123456\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"metadata\": {\n \"source\": \"LinkedIn\",\n \"referredBy\": \"Jane Smith\",\n \"tags\": [\n \"senior\",\n \"remote-preferred\"\n ],\n \"externalId\": \"CAND-12345\"\n },\n \"fields\": {\n \"is_vip\": true,\n \"order_number\": \"SO-40128\",\n \"renewal_date\": \"2026-04-01\"\n },\n \"gender\": \"female\",\n \"cvText\": \"Jane Doe\\nSoftware Engineer\\nExperience: ...\",\n \"workHistory\": [\n {\n \"companyName\": \"Google\",\n \"candidatePosition\": \"Software Engineer\",\n \"referencePhone\": \"+1987654321\",\n \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"referenceName\": \"Jane Smith\",\n \"startDate\": \"2020-01-01\",\n \"endDate\": \"2022-12-31\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "123e4567-e89b-12d3-a456-426614174000",
"firstName": "John",
"lastName": "Doe",
"status": "APPLIED",
"fields": {
"order_number": "SO-40128",
"is_vip": true,
"renewal_date": "2026-04-01"
},
"createdAt": "2025-11-20T10:30:00Z",
"updatedAt": "2025-11-20T10:30:00Z",
"jobId": "987e6543-e21b-12d3-a456-426614174000",
"jobIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"email": "john.doe@example.com",
"phoneNumber": "+421915123456",
"gdprExpiryDate": "2026-11-16",
"overallRating": 85,
"metadata": {
"source": "LinkedIn",
"externalId": "CAND-12345"
},
"analysisCount": 2,
"interviewCount": 3,
"links": {
"analyses": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/analyses",
"interviews": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/conversations"
},
"gender": "female",
"anonymizedCvText": "[NAME]\nSoftware Engineer\nExperience: ...",
"workHistory": [
{
"companyName": "Google",
"candidatePosition": "Software Engineer",
"referencePhone": "+1987654321",
"id": "123e4567-e89b-12d3-a456-426614174000",
"referenceName": "Jane Smith",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}POST /candidates is a permanent alias of this endpoint and keeps working unchanged, with the same scopes and the same response. See Resource names.Overview
A contact is the person on the other end of a conversation: the record holding their name, how to reach them, and whatever else you want to keep about them. Jobs are optional and can be attached at creation or later.Use Cases
- Application processing: create contacts from inbound applications, with a job attached
- ATS integration: sync contacts in from an external system
- Manual entry: add people you found some other way
- Building a list: keep contacts with no job assignment at all
- Bulk import: load many contacts at once
Job Association (Optional)
jobId to attach one at creation, or leave it out.- With a job: the contact is associated with that job immediately.
- Without one: the contact exists on its own, and jobs can be attached later through the update endpoint. Most callers outside hiring never send one.
- If provided, the job must exist and belong to your API key’s company.
Basic Contact Creation
With Job Association
{
"jobId": "job-uuid",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16"
}
Without Job Association
{
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16"
}
A Fuller Contact
{
"jobId": "job-uuid",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16",
"gender": "female",
"metadata": {
"source": "LinkedIn",
"externalId": "CONTACT-12345",
"notes": "Strong technical background",
"resumeUrl": "https://storage.example.com/resumes/jane-doe.pdf",
"linkedinUrl": "https://linkedin.com/in/janedoe"
},
"workHistory": [
{
"companyName": "Tech Corp",
"candidatePosition": "Software Engineer",
"referenceName": "Jane Smith",
"referencePhone": "+1234567890",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
}
resumeUrl and linkedinUrl are not built-in fields — they are shown inside the
free-form metadata object, which is where anything of your own belongs.metadata is not readable by an agent. It is your own scratch space — free-form,
unvalidated, and never placed in a prompt. If you want a value an agent can say, it has to
be a contact field: catalogued, typed, and addressable as {{contact.<key>}}. See
Update Contact.workHistory describes previous employment, and its candidatePosition field keeps that name
because it is the name the API accepts. It exists for reference calls: each entry can carry a
referenceName and referencePhone to call about that job.Company Scoping
Contacts are scoped to your API key’s company. When a job is attached, the job must belong to that company; a contact created without one is associated with your company anyway, and can only be reached through your company’s API keys. That is what keeps companies fully isolated from each other.Required Fields
firstName— 1-100 characterslastName— 1-100 charactersgdprExpiryDate— GDPR retention date, ISO 8601, and in the future (e.g."2026-11-16")- At least one way to reach them:
emailorphoneNumber(or both)
Optional Fields
- jobId: UUID of a job to attach (must exist and belong to your company)
- email: valid email address (required if
phoneNumberis absent) - phoneNumber: E.164 format, e.g.
+1234567890(required ifemailis absent) - gender:
"male"or"female". Used for gender-aware addressing on the call. Auto-detected from the name when omitted. - metadata: your own key-value pairs (max 10KB, 5 levels deep, 50 keys)
- fields: catalogued field values, keyed by catalog key — validated against the catalog, and the only values an agent can speak
Field Validation
The API enforces:- firstName/lastName: 1-100 characters (required)
- gdprExpiryDate: a valid ISO 8601 date in the future (required)
- email: valid email format (at least one of email or phoneNumber required)
- phoneNumber: starts with
+, E.164 format (at least one of email or phoneNumber required) - jobId: a valid UUID naming an existing job in your company (optional)
- gender:
"male"or"female"if present (optional) - metadata: max 10KB, max depth 5, max 50 keys (optional)
Setting Field Values on the Create
Send them asfields, keyed by catalog key, and the contact is created with its values in one
request:
POST /contacts
{
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"fields": {
"is_vip": true,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
}
}
fields is what was stored, so there is nothing to go and check.
The shape is flat — the same one
GET /contacts/{id} returns and
PATCH /contacts/{id} accepts. There is no
seeded-versus-your-own split in the payload because there is none to make: every key this
accepts is a catalogued key with writable: true, whether InstaView seeded it or you defined
it. Read GET /contact-fields for the keys
your company has.
422
naming it and the contact is not created. That is deliberate: a contact that exists
without the values you sent is a half-write you cannot detect without re-reading.422 by default. Pass
?createMissingFields=true
to have it defined for you as a string field instead — convenient for a first sync, and
opt-in per request because a typo would otherwise mint a permanent field in your catalog.
fields Is Not metadata
They are stored separately and read separately. fields is the validated door: every value is
checked against its field’s declared type, enum and reserved-key rules, and only values that
arrive through it are addressable as {{contact.<key>}}. metadata is your own scratch space,
free-form and never read by an agent, and nothing you put in it becomes a contact field however
you name the key.
Response Format
The response carries bothjobId (singular) and jobIds (array):
{
"id": "contact-uuid",
"jobId": "job-uuid", // First job (for backward compatibility)
"jobIds": ["job-uuid"], // Array of all job associations
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16",
"gender": "female",
"status": "APPLIED",
"fields": { // Catalogued values, as stored
"is_vip": true,
"order_number": "SO-40128"
},
"workHistory": [
{
"id": "work-history-uuid",
"companyName": "Tech Corp",
"candidatePosition": "Software Engineer",
"referenceName": "Jane Smith",
"referencePhone": "+1234567890",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
],
"createdAt": "2025-11-28T10:30:00Z",
"updatedAt": "2025-11-28T10:30:00Z"
}
Related Resources
Contacts Resource Guide
Jobs Resource Guide
Conversations Resource Guide
API Reference
Authorizations
API key for authentication using Bearer scheme
Query Parameters
Required for ATS API keys to specify which company to access. Ignored for standard company API keys.
Define any key in fields that your catalog does not know yet, as a STRING field, instead of rejecting the request. Off by default, because a typo would otherwise become a permanent field in your catalog — visible in every agent's variable palette until somebody deletes it. A key the platform reserves, a malformed key, and a company already at its field ceiling are all still refused.
Body
The contact's first name
1 - 100"John"
The contact's last name
1 - 100"Doe"
GDPR expiry date in ISO 8601 format (must be in the future)
"2026-11-16"
The contact's email address
"john.doe@example.com"
The contact's phone number in E.164 format
^\+[1-9]\d{1,14}$"+421915123456"
[Deprecated - use jobIds] Optional single job ID to associate.
"123e4567-e89b-12d3-a456-426614174000"
Optional array of job IDs to associate the contact with. If both jobId and jobIds are provided, jobIds takes precedence.
1 - 50 elementsCustom metadata for extensibility (key-value pairs, max 10KB, 5 levels deep, 50 keys)
{
"source": "LinkedIn",
"referredBy": "Jane Smith",
"tags": ["senior", "remote-preferred"],
"externalId": "CAND-12345"
}
Catalogued field values, keyed by catalog key — the same flat shape GET /contacts/{id} returns. Validated against each field's declared type, so an unknown key or a wrong-typed value is a 422 naming it, and the whole request — contact included — is rolled back. Read GET /contact-fields for the keys your company has. Not metadata: these are typed, and they are the only values an agent can speak.
{
"is_vip": true,
"order_number": "SO-40128",
"renewal_date": "2026-04-01"
}
The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.
male, female "female"
The contact's CV in plain text. This will be automatically anonymized.
50000"Jane Doe\nSoftware Engineer\nExperience: ..."
Optional work history items for the contact.
20Show child attributes
Show child attributes
Response
Contact created successfully
Contact ID
"123e4567-e89b-12d3-a456-426614174000"
The contact's first name
"John"
The contact's last name
"Doe"
Contact status
UNDEFINED, APPLIED, IN_PROCESS, REJECTED, ACCEPTED "APPLIED"
The contact's catalogued field values, keyed by field key — the counterpart of metadata, and the only half an agent can speak. Each key is defined in the company catalog (GET /contact-fields) and addressable in a flow as {{contact.<key>}}. Written through fields on POST /contacts and PATCH /contacts/{id}, never through metadata. A field with no value is absent rather than null; {} means none are set.
{
"order_number": "SO-40128",
"is_vip": true,
"renewal_date": "2026-04-01"
}
Created timestamp (UTC)
"2025-11-20T10:30:00Z"
Updated timestamp (UTC)
"2025-11-20T10:30:00Z"
[Deprecated] Single job ID; use jobIds instead.
"987e6543-e21b-12d3-a456-426614174000"
Jobs the contact is assigned to.
50The contact's email address
"john.doe@example.com"
The contact's phone number
"+421915123456"
GDPR expiry date. Currently returned as a date (no time). NOTE: We plan to migrate to a timestamp with timezone (timestamptz) for global correctness.
"2026-11-16"
Overall rating/match score (0-100)
0 <= x <= 10085
Your own scratch space on the contact: free-form, unvalidated, and never read by an agent. Replaced wholesale on update. Not the place for values you want an agent to say — those are fields.
{
"source": "LinkedIn",
"externalId": "CAND-12345"
}
Number of analyses for this contact. Not currently populated by any endpoint — treat as absent.
2
Number of conversations for this contact. Keeps its original field name, and is not currently populated by any endpoint — treat as absent.
3
Convenience links to related collections. Endpoints may be added incrementally.
{
"analyses": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/analyses",
"interviews": "/v1/public/contacts/123e4567-e89b-12d3-a456-426614174000/conversations"
}
The contact's gender. Used for gender-aware addressing on the call. Null if not explicitly set (auto-detected from the name).
male, female "female"
The contact's anonymized CV in plain text.
"[NAME]\nSoftware Engineer\nExperience: ..."
Work history items for the contact.
20Show child attributes
Show child attributes