curl --request PUT \
--url https://api.attio.com/v2/objects/{object}/records \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"values": {
"41252299-f8c7-4b5e-99c9-4ff8321d2f96": "Text value",
"multiselect_attribute": [
"Select option 1",
"Select option 2"
]
}
}
}
'import requests
url = "https://api.attio.com/v2/objects/{object}/records"
payload = { "data": { "values": {
"41252299-f8c7-4b5e-99c9-4ff8321d2f96": "Text value",
"multiselect_attribute": ["Select option 1", "Select option 2"]
} } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
values: {
'41252299-f8c7-4b5e-99c9-4ff8321d2f96': 'Text value',
multiselect_attribute: ['Select option 1', 'Select option 2']
}
}
})
};
fetch('https://api.attio.com/v2/objects/{object}/records', 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.attio.com/v2/objects/{object}/records",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'values' => [
'41252299-f8c7-4b5e-99c9-4ff8321d2f96' => 'Text value',
'multiselect_attribute' => [
'Select option 1',
'Select option 2'
]
]
]
]),
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.attio.com/v2/objects/{object}/records"
payload := strings.NewReader("{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.attio.com/v2/objects/{object}/records")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.attio.com/v2/objects/{object}/records")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": {
"workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c",
"object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
"record_id": "bf071e1f-6035-429d-b874-d83ea64ea13b"
},
"created_at": "2022-11-21T13:22:49.061281000Z",
"web_url": "https://app.attio.com/salarya/person/bf071e1f-6035-429d-b874-d83ea64ea13b",
"values": {}
}
}{
"status_code": 400,
"type": "invalid_request_error",
"code": "value_not_found",
"message": "No attribute was found for matching_attribute slug/ID \"my-attribute\"."
}{
"status_code": 404,
"type": "invalid_request_error",
"code": "not_found",
"message": "Object with slug/ID \"people\" not found."
}Upsert a record
Use this endpoint to create or update people, companies and other records. A matching attribute is used to search for existing records. If a record is found with the same value for the matching attribute, that record will be updated. If no record with the same value for the matching attribute is found, a new record will be created instead. If you would like to avoid matching, please use the Create record endpoint.
If the matching attribute is a multiselect attribute, new values will be added and existing values will not be deleted. For any other multiselect attribute, all values will be either created or deleted as necessary to match the list of supplied values.
Required scopes: record_permission:read-write, object_configuration:read.
curl --request PUT \
--url https://api.attio.com/v2/objects/{object}/records \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"values": {
"41252299-f8c7-4b5e-99c9-4ff8321d2f96": "Text value",
"multiselect_attribute": [
"Select option 1",
"Select option 2"
]
}
}
}
'import requests
url = "https://api.attio.com/v2/objects/{object}/records"
payload = { "data": { "values": {
"41252299-f8c7-4b5e-99c9-4ff8321d2f96": "Text value",
"multiselect_attribute": ["Select option 1", "Select option 2"]
} } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
values: {
'41252299-f8c7-4b5e-99c9-4ff8321d2f96': 'Text value',
multiselect_attribute: ['Select option 1', 'Select option 2']
}
}
})
};
fetch('https://api.attio.com/v2/objects/{object}/records', 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.attio.com/v2/objects/{object}/records",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'values' => [
'41252299-f8c7-4b5e-99c9-4ff8321d2f96' => 'Text value',
'multiselect_attribute' => [
'Select option 1',
'Select option 2'
]
]
]
]),
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.attio.com/v2/objects/{object}/records"
payload := strings.NewReader("{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.attio.com/v2/objects/{object}/records")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.attio.com/v2/objects/{object}/records")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"values\": {\n \"41252299-f8c7-4b5e-99c9-4ff8321d2f96\": \"Text value\",\n \"multiselect_attribute\": [\n \"Select option 1\",\n \"Select option 2\"\n ]\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": {
"workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c",
"object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
"record_id": "bf071e1f-6035-429d-b874-d83ea64ea13b"
},
"created_at": "2022-11-21T13:22:49.061281000Z",
"web_url": "https://app.attio.com/salarya/person/bf071e1f-6035-429d-b874-d83ea64ea13b",
"values": {}
}
}{
"status_code": 400,
"type": "invalid_request_error",
"code": "value_not_found",
"message": "No attribute was found for matching_attribute slug/ID \"my-attribute\"."
}{
"status_code": 404,
"type": "invalid_request_error",
"code": "not_found",
"message": "Object with slug/ID \"people\" not found."
}Authorizations
This API uses OAuth 2.0 with the authorization code grant flow.
Path Parameters
A UUID or slug to identify the object the record should belong to.
"people"
Query Parameters
The ID or slug of the attribute to use to check if a record already exists. The attribute must be unique.
"41252299-f8c7-4b5e-99c9-4ff8321d2f96"
Body
Show child attributes
Show child attributes
Response
Success
Success
Show child attributes
Show child attributes
Was this page helpful?