curl --request POST \
--url https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff \
--header 'API-KEY: <api-key>' \
--header 'Content-Type: application/json' \
--header 'TENANT: <tenant>' \
--data '
{
"created": [
{}
],
"updated": [
{}
],
"deletedIds": [
"<string>"
]
}
'import requests
url = "https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff"
payload = {
"created": [{}],
"updated": [{}],
"deletedIds": ["<string>"]
}
headers = {
"TENANT": "<tenant>",
"API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {TENANT: '<tenant>', 'API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({created: [{}], updated: [{}], deletedIds: ['<string>']})
};
fetch('https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff', 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.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff",
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([
'created' => [
[
]
],
'updated' => [
[
]
],
'deletedIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"Content-Type: application/json",
"TENANT: <tenant>"
],
]);
$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.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff"
payload := strings.NewReader("{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TENANT", "<tenant>")
req.Header.Add("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.post("https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff")
.header("TENANT", "<tenant>")
.header("API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TENANT"] = '<tenant>'
request["API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"gcsPath": "<string>",
"originalFilename": "<string>",
"signedUrl": "<string>",
"name": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"noteId": "<string>",
"thumbnailSignedUrl": "<string>",
"annotations": [
{}
],
"patient": {
"id": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"firstName": "<string>",
"lastName": "<string>",
"phoneNumber": "<string>",
"email": "<string>",
"locationId": "<string>",
"externalId": "<string>",
"address": "<string>",
"addressLineTwo": "<string>",
"city": "<string>",
"state": "<string>",
"zipCode": "<string>",
"country": "<string>",
"addressValid": true,
"meta": {},
"isArchived": true,
"primaryLocationId": "<string>",
"gender": "<string>",
"pronouns": "<string>",
"preferredName": "<string>",
"dateOfBirth": "2023-12-25",
"patientMedications": [
"<string>"
],
"leadSource": "<string>",
"onSchedulingBlacklist": true,
"surchargeDisabled": true,
"optedInToSmsMarketing": true,
"optedInToEmailMarketing": true,
"optedInToSocialMedia": true,
"aiScribeConsent": true,
"tags": [
{
"id": "<string>",
"name": "<string>",
"isActive": true,
"createdDate": "2023-11-07T05:31:56Z",
"emoji": "<string>",
"color": "<string>",
"updatedDate": "2023-11-07T05:31:56Z"
}
],
"creditBalance": 123,
"preferredProviderId": "<string>",
"dosespotPatientId": "<string>"
},
"note": {
"id": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"visitDate": "2023-11-07T05:31:56Z"
},
"provider": {
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"createdDate": "2023-11-07T05:31:56Z"
},
"tags": [
{
"id": "<string>",
"name": "<string>",
"color": "<string>",
"createdDate": "2023-11-07T05:31:56Z"
}
],
"visibleToPatient": false,
"patientCaption": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Apply Attachment Annotation Diff
Apply a per-mark diff (created / updated / deleted_ids) to an attachment’s annotations in a single transaction, creating one history revision per call.
Replaces the previous per-mark POST/PATCH/DELETE trio: one round-trip, one new revision per Save click, all-or-nothing (no partial-save error path).
curl --request POST \
--url https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff \
--header 'API-KEY: <api-key>' \
--header 'Content-Type: application/json' \
--header 'TENANT: <tenant>' \
--data '
{
"created": [
{}
],
"updated": [
{}
],
"deletedIds": [
"<string>"
]
}
'import requests
url = "https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff"
payload = {
"created": [{}],
"updated": [{}],
"deletedIds": ["<string>"]
}
headers = {
"TENANT": "<tenant>",
"API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {TENANT: '<tenant>', 'API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({created: [{}], updated: [{}], deletedIds: ['<string>']})
};
fetch('https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff', 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.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff",
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([
'created' => [
[
]
],
'updated' => [
[
]
],
'deletedIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"Content-Type: application/json",
"TENANT: <tenant>"
],
]);
$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.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff"
payload := strings.NewReader("{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TENANT", "<tenant>")
req.Header.Add("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.post("https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff")
.header("TENANT", "<tenant>")
.header("API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decodahealth.com/attachments/{attachment_id}/annotations/apply-diff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TENANT"] = '<tenant>'
request["API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"created\": [\n {}\n ],\n \"updated\": [\n {}\n ],\n \"deletedIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"gcsPath": "<string>",
"originalFilename": "<string>",
"signedUrl": "<string>",
"name": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"noteId": "<string>",
"thumbnailSignedUrl": "<string>",
"annotations": [
{}
],
"patient": {
"id": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"firstName": "<string>",
"lastName": "<string>",
"phoneNumber": "<string>",
"email": "<string>",
"locationId": "<string>",
"externalId": "<string>",
"address": "<string>",
"addressLineTwo": "<string>",
"city": "<string>",
"state": "<string>",
"zipCode": "<string>",
"country": "<string>",
"addressValid": true,
"meta": {},
"isArchived": true,
"primaryLocationId": "<string>",
"gender": "<string>",
"pronouns": "<string>",
"preferredName": "<string>",
"dateOfBirth": "2023-12-25",
"patientMedications": [
"<string>"
],
"leadSource": "<string>",
"onSchedulingBlacklist": true,
"surchargeDisabled": true,
"optedInToSmsMarketing": true,
"optedInToEmailMarketing": true,
"optedInToSocialMedia": true,
"aiScribeConsent": true,
"tags": [
{
"id": "<string>",
"name": "<string>",
"isActive": true,
"createdDate": "2023-11-07T05:31:56Z",
"emoji": "<string>",
"color": "<string>",
"updatedDate": "2023-11-07T05:31:56Z"
}
],
"creditBalance": 123,
"preferredProviderId": "<string>",
"dosespotPatientId": "<string>"
},
"note": {
"id": "<string>",
"createdDate": "2023-11-07T05:31:56Z",
"visitDate": "2023-11-07T05:31:56Z"
},
"provider": {
"id": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"createdDate": "2023-11-07T05:31:56Z"
},
"tags": [
{
"id": "<string>",
"name": "<string>",
"color": "<string>",
"createdDate": "2023-11-07T05:31:56Z"
}
],
"visibleToPatient": false,
"patientCaption": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Headers
The tenant you are making this request on behalf of
Your api key
Path Parameters
Body
Per-mark diff applied to an attachment's annotations in one request.
created and updated are raw annotation dicts (the server stamps audit
fields). deleted_ids is the set of annotation ids to remove. Missing
targets for updated/deleted_ids are treated as a no-op (a concurrent
writer already removed them); collisions in created raise 409.
Response
Successful Response
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
