curl --request POST \
--url https://api.gumnut.ai/api/people/bulk-update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"updates": [
{
"id": "<string>",
"change": {
"name": "<string>",
"birth_date": "2023-12-25",
"is_hidden": true,
"is_favorite": true,
"thumbnail_face_id": "<string>"
}
}
]
}
'import requests
url = "https://api.gumnut.ai/api/people/bulk-update"
payload = { "updates": [
{
"id": "<string>",
"change": {
"name": "<string>",
"birth_date": "2023-12-25",
"is_hidden": True,
"is_favorite": True,
"thumbnail_face_id": "<string>"
}
}
] }
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({
updates: [
{
id: '<string>',
change: {
name: '<string>',
birth_date: '2023-12-25',
is_hidden: true,
is_favorite: true,
thumbnail_face_id: '<string>'
}
}
]
})
};
fetch('https://api.gumnut.ai/api/people/bulk-update', 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.gumnut.ai/api/people/bulk-update",
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([
'updates' => [
[
'id' => '<string>',
'change' => [
'name' => '<string>',
'birth_date' => '2023-12-25',
'is_hidden' => true,
'is_favorite' => true,
'thumbnail_face_id' => '<string>'
]
]
]
]),
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.gumnut.ai/api/people/bulk-update"
payload := strings.NewReader("{\n \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\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.gumnut.ai/api/people/bulk-update")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gumnut.ai/api/people/bulk-update")
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 \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Update multiple people
Updates name, birth date, visibility, favorite status, or thumbnail on multiple people in one transactional call. Each item carries the target person id and the per-person change — different fields can be changed on different people in the same request. Atomic: a duplicate id, an unknown or inaccessible id, or any per-item failure rejects the whole batch and writes nothing.
Items apply in request order, and each rename is checked against the names left by earlier items: swapping two people’s names, or giving two people the same name, returns 409. Renaming to another record’s name in the same library, including hidden people, also returns 409. Names ignore case and surrounding whitespace; retrying the same collision does not resolve it.
update_person edits a single person.
curl --request POST \
--url https://api.gumnut.ai/api/people/bulk-update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"updates": [
{
"id": "<string>",
"change": {
"name": "<string>",
"birth_date": "2023-12-25",
"is_hidden": true,
"is_favorite": true,
"thumbnail_face_id": "<string>"
}
}
]
}
'import requests
url = "https://api.gumnut.ai/api/people/bulk-update"
payload = { "updates": [
{
"id": "<string>",
"change": {
"name": "<string>",
"birth_date": "2023-12-25",
"is_hidden": True,
"is_favorite": True,
"thumbnail_face_id": "<string>"
}
}
] }
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({
updates: [
{
id: '<string>',
change: {
name: '<string>',
birth_date: '2023-12-25',
is_hidden: true,
is_favorite: true,
thumbnail_face_id: '<string>'
}
}
]
})
};
fetch('https://api.gumnut.ai/api/people/bulk-update', 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.gumnut.ai/api/people/bulk-update",
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([
'updates' => [
[
'id' => '<string>',
'change' => [
'name' => '<string>',
'birth_date' => '2023-12-25',
'is_hidden' => true,
'is_favorite' => true,
'thumbnail_face_id' => '<string>'
]
]
]
]),
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.gumnut.ai/api/people/bulk-update"
payload := strings.NewReader("{\n \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\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.gumnut.ai/api/people/bulk-update")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gumnut.ai/api/people/bulk-update")
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 \"updates\": [\n {\n \"id\": \"<string>\",\n \"change\": {\n \"name\": \"<string>\",\n \"birth_date\": \"2023-12-25\",\n \"is_hidden\": true,\n \"is_favorite\": true,\n \"thumbnail_face_id\": \"<string>\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Gumnut API key (apikey_...) sent as a Bearer token in the Authorization header. Create and manage keys in the Gumnut app, or with the API key endpoints while signed in to it.
Body
Bulk-update request body — heterogeneous per-person changes in one call.
List of per-person updates. Each item carries the target person id and the change to apply to it; different fields can be changed on different people in the same request. Up to 200 items per request.
1 - 200 elementsShow child attributes
Show child attributes
Response
Successful Response
Empty acknowledgment returned by bulk_update_people.