curl --request PATCH \
--url https://api.getdialed.ai/v1/data/stores/{store}/records/{key} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"layer_data": {
"friendly_name": "West Region Main",
"owner_team": "Support"
}
}
'import requests
url = "https://api.getdialed.ai/v1/data/stores/{store}/records/{key}"
payload = { "layer_data": {
"friendly_name": "West Region Main",
"owner_team": "Support"
} }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({layer_data: {friendly_name: 'West Region Main', owner_team: 'Support'}})
};
fetch('https://api.getdialed.ai/v1/data/stores/{store}/records/{key}', 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.getdialed.ai/v1/data/stores/{store}/records/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'layer_data' => [
'friendly_name' => 'West Region Main',
'owner_team' => 'Support'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/data/stores/{store}/records/{key}"
payload := strings.NewReader("{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.getdialed.ai/v1/data/stores/{store}/records/{key}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/data/stores/{store}/records/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2026-08-01T09:00:00Z",
"key": "+15551234567",
"resolved": {
"campaign": "Inbound Main",
"e164": "+15551234567",
"friendly_name": "West Region Main",
"status": "active"
},
"resolved_config_version": 1,
"updated_at": "2026-08-20T12:00:00Z"
}{
"detail": "Authentication required"
}{
"detail": "Record not found"
}{
"detail": "Validation error"
}{
"detail": "Rate limit exceeded"
}Edit a store record
Writes your manual assertions to one record and returns the updated resolved view. The edit becomes the record’s manual layer and obeys the same rules as every other source: your precedence decides whether it wins a field, the change is recorded in the record’s history, and a change to a resolved value emits the store’s change event. A field your precedence does not allow manual to write is refused. A record that does not exist, or belongs to another account, returns 404.
curl --request PATCH \
--url https://api.getdialed.ai/v1/data/stores/{store}/records/{key} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"layer_data": {
"friendly_name": "West Region Main",
"owner_team": "Support"
}
}
'import requests
url = "https://api.getdialed.ai/v1/data/stores/{store}/records/{key}"
payload = { "layer_data": {
"friendly_name": "West Region Main",
"owner_team": "Support"
} }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({layer_data: {friendly_name: 'West Region Main', owner_team: 'Support'}})
};
fetch('https://api.getdialed.ai/v1/data/stores/{store}/records/{key}', 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.getdialed.ai/v1/data/stores/{store}/records/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'layer_data' => [
'friendly_name' => 'West Region Main',
'owner_team' => 'Support'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/data/stores/{store}/records/{key}"
payload := strings.NewReader("{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.getdialed.ai/v1/data/stores/{store}/records/{key}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/data/stores/{store}/records/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"layer_data\": {\n \"friendly_name\": \"West Region Main\",\n \"owner_team\": \"Support\"\n }\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2026-08-01T09:00:00Z",
"key": "+15551234567",
"resolved": {
"campaign": "Inbound Main",
"e164": "+15551234567",
"friendly_name": "West Region Main",
"status": "active"
},
"resolved_config_version": 1,
"updated_at": "2026-08-20T12:00:00Z"
}{
"detail": "Authentication required"
}{
"detail": "Record not found"
}{
"detail": "Validation error"
}{
"detail": "Rate limit exceeded"
}Authorizations
Body
A manual edit to one record.
The values you send replace your manual assertions on this record wholesale:
a field you omit stops being asserted manually, and resolution falls through
to the next source that asserts it. Send {} to withdraw every manual
assertion.
The edit is written as the manual layer and obeys the same rules as every
other source — your precedence decides whether it wins a field, and a field
your precedence excludes manual from is refused rather than stored where it
could never be read.
The values you assert for this record. Every key must be a field the store declares and that your precedence allows manual to write.
Response
Successful Response
One record of a store: its resolved view, and optionally its layers.
resolved is the single view computed from the record's layers by your
precedence. Request include=layers to also see each source's own
assertions and provenance.
The record's key, in the store's canonical key format.
The resolved view — one value per field, taken from the highest-precedence source asserting it. A field no source asserts is absent rather than null.
Which precedence version produced this resolved view. A value behind the store's current config_version means the view is awaiting recompute.
When the record was first written by any source.
When any source last wrote to the record.
Each source's own assertions, keyed by source name. Present only when include=layers was requested.
Show child attributes
Show child attributes