curl --request POST \
--url https://api-public.skipcall.app/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "John",
"lastName": "Doe",
"phoneNumbers": [
"+33612345678"
],
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"allowPhoneCalls": true,
"customFields": {
"industry": "Technology",
"team_size": "50-100"
}
}
'import requests
url = "https://api-public.skipcall.app/v1/contacts"
payload = {
"firstName": "John",
"lastName": "Doe",
"phoneNumbers": ["+33612345678"],
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"allowPhoneCalls": True,
"customFields": {
"industry": "Technology",
"team_size": "50-100"
}
}
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',
phoneNumbers: ['+33612345678'],
email: 'john.doe@example.com',
company: 'Acme Inc.',
city: 'Paris',
country: 'France',
url: 'https://example.com',
linkedinUrl: 'https://linkedin.com/in/johndoe',
linkedinSalesUrl: 'https://linkedin.com/sales/people/johndoe',
role: 'CTO',
allowPhoneCalls: true,
customFields: {industry: 'Technology', team_size: '50-100'}
})
};
fetch('https://api-public.skipcall.app/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-public.skipcall.app/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([
'firstName' => 'John',
'lastName' => 'Doe',
'phoneNumbers' => [
'+33612345678'
],
'email' => 'john.doe@example.com',
'company' => 'Acme Inc.',
'city' => 'Paris',
'country' => 'France',
'url' => 'https://example.com',
'linkedinUrl' => 'https://linkedin.com/in/johndoe',
'linkedinSalesUrl' => 'https://linkedin.com/sales/people/johndoe',
'role' => 'CTO',
'allowPhoneCalls' => true,
'customFields' => [
'industry' => 'Technology',
'team_size' => '50-100'
]
]),
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-public.skipcall.app/v1/contacts"
payload := strings.NewReader("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\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-public.skipcall.app/v1/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-public.skipcall.app/v1/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 \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"firstName": "John",
"lastName": "Doe",
"allowPhoneCalls": true,
"callCount": 5,
"teamId": "550e8400-e29b-41d4-a716-446655440000",
"phoneNumbers": [
"+33612345678"
],
"customFields": {
"Industry": "Technology",
"Size": "50-100"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"lastModificationSource": "SKIPCALL",
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"lastCallAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key",
"status": 401
}
}{
"error": {
"code": "PLAN_NOT_ELIGIBLE",
"message": "API access requires INTERMÉDIAIRE or EXPERT plan",
"status": 403
}
}Create a contact
Creates a new contact in your organization
curl --request POST \
--url https://api-public.skipcall.app/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "John",
"lastName": "Doe",
"phoneNumbers": [
"+33612345678"
],
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"allowPhoneCalls": true,
"customFields": {
"industry": "Technology",
"team_size": "50-100"
}
}
'import requests
url = "https://api-public.skipcall.app/v1/contacts"
payload = {
"firstName": "John",
"lastName": "Doe",
"phoneNumbers": ["+33612345678"],
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"allowPhoneCalls": True,
"customFields": {
"industry": "Technology",
"team_size": "50-100"
}
}
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',
phoneNumbers: ['+33612345678'],
email: 'john.doe@example.com',
company: 'Acme Inc.',
city: 'Paris',
country: 'France',
url: 'https://example.com',
linkedinUrl: 'https://linkedin.com/in/johndoe',
linkedinSalesUrl: 'https://linkedin.com/sales/people/johndoe',
role: 'CTO',
allowPhoneCalls: true,
customFields: {industry: 'Technology', team_size: '50-100'}
})
};
fetch('https://api-public.skipcall.app/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-public.skipcall.app/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([
'firstName' => 'John',
'lastName' => 'Doe',
'phoneNumbers' => [
'+33612345678'
],
'email' => 'john.doe@example.com',
'company' => 'Acme Inc.',
'city' => 'Paris',
'country' => 'France',
'url' => 'https://example.com',
'linkedinUrl' => 'https://linkedin.com/in/johndoe',
'linkedinSalesUrl' => 'https://linkedin.com/sales/people/johndoe',
'role' => 'CTO',
'allowPhoneCalls' => true,
'customFields' => [
'industry' => 'Technology',
'team_size' => '50-100'
]
]),
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-public.skipcall.app/v1/contacts"
payload := strings.NewReader("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\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-public.skipcall.app/v1/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-public.skipcall.app/v1/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 \"phoneNumbers\": [\n \"+33612345678\"\n ],\n \"email\": \"john.doe@example.com\",\n \"company\": \"Acme Inc.\",\n \"city\": \"Paris\",\n \"country\": \"France\",\n \"url\": \"https://example.com\",\n \"linkedinUrl\": \"https://linkedin.com/in/johndoe\",\n \"linkedinSalesUrl\": \"https://linkedin.com/sales/people/johndoe\",\n \"role\": \"CTO\",\n \"allowPhoneCalls\": true,\n \"customFields\": {\n \"industry\": \"Technology\",\n \"team_size\": \"50-100\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"firstName": "John",
"lastName": "Doe",
"allowPhoneCalls": true,
"callCount": 5,
"teamId": "550e8400-e29b-41d4-a716-446655440000",
"phoneNumbers": [
"+33612345678"
],
"customFields": {
"Industry": "Technology",
"Size": "50-100"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"lastModificationSource": "SKIPCALL",
"email": "john.doe@example.com",
"company": "Acme Inc.",
"city": "Paris",
"country": "France",
"url": "https://example.com",
"linkedinUrl": "https://linkedin.com/in/johndoe",
"linkedinSalesUrl": "https://linkedin.com/sales/people/johndoe",
"role": "CTO",
"lastCallAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key",
"status": 401
}
}{
"error": {
"code": "PLAN_NOT_ELIGIBLE",
"message": "API access requires INTERMÉDIAIRE or EXPERT plan",
"status": 403
}
}Authorizations
Enter your API Key (sk_live_xxx or sk_test_xxx)
Headers
Target workspace id (from GET /v1/workspaces). Required for multi-workspace API keys to designate which workspace to write to; omit for single-workspace keys, where it is resolved automatically. Must be within the API key scope.
Body
First name of the contact
1 - 100"John"
Last name of the contact
1 - 100"Doe"
Phone numbers in E.164 format (e.g., +33612345678)
1 - 20 elements["+33612345678"]
Email address of the contact
"john.doe@example.com"
Company name
200"Acme Inc."
City
200"Paris"
Country
200"France"
Website URL
"https://example.com"
LinkedIn profile URL
"https://linkedin.com/in/johndoe"
LinkedIn Sales Navigator URL
"https://linkedin.com/sales/people/johndoe"
Role / job title
200"CTO"
Whether the contact accepts phone calls. Defaults to true.
true
Custom field values keyed by the custom field slug (the stable, immutable identifier returned by GET /custom-fields). Custom fields must already exist for the team (use the Custom Fields endpoints to create them). For backwards compatibility this endpoint also accepts keys matching the custom field name, but this fallback is deprecated and will be removed in a future release — migrate your integrations to use slugs.
Show child attributes
Show child attributes
{
"industry": "Technology",
"team_size": "50-100"
}
Response
The created contact
"550e8400-e29b-41d4-a716-446655440000"
"John"
"Doe"
true
5
"550e8400-e29b-41d4-a716-446655440000"
["+33612345678"]
Show child attributes
Show child attributes
{
"Industry": "Technology",
"Size": "50-100"
}
SKIPCALL, API "john.doe@example.com"
"Acme Inc."
"Paris"
"France"
"https://example.com"
"https://linkedin.com/in/johndoe"
"https://linkedin.com/sales/people/johndoe"
"CTO"