curl --request PATCH \
--url https://api.ctrl-hub.com/v3/notifications \
--header 'Content-Type: application/vnd.api+json' \
--header 'X-Session-Token: <api-key>' \
--data '
{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"saved": true,
"archived": true
}
}
]
}
'import requests
url = "https://api.ctrl-hub.com/v3/notifications"
payload = { "data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"saved": True,
"archived": True
}
}
] }
headers = {
"X-Session-Token": "<api-key>",
"Content-Type": "application/vnd.api+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Session-Token': '<api-key>', 'Content-Type': 'application/vnd.api+json'},
body: JSON.stringify({
data: [
{
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'notifications',
attributes: {saved: true, archived: true}
}
]
})
};
fetch('https://api.ctrl-hub.com/v3/notifications', 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.ctrl-hub.com/v3/notifications",
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([
'data' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'type' => 'notifications',
'attributes' => [
'saved' => true,
'archived' => true
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/vnd.api+json",
"X-Session-Token: <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.ctrl-hub.com/v3/notifications"
payload := strings.NewReader("{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Session-Token", "<api-key>")
req.Header.Add("Content-Type", "application/vnd.api+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.ctrl-hub.com/v3/notifications")
.header("X-Session-Token", "<api-key>")
.header("Content-Type", "application/vnd.api+json")
.body("{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ctrl-hub.com/v3/notifications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Session-Token"] = '<api-key>'
request["Content-Type"] = 'application/vnd.api+json'
request.body = "{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"title": "<string>",
"body": "<string>",
"status": "unread",
"saved": true,
"reason": "assigned",
"channels": [
"inbox"
],
"notification_type": {
"domain": "documents",
"entity": "document",
"kind": "approved"
},
"link": "/documents/0197f9e5-6a2b-7c3d-8e4f-5a6b7c8d9e0f",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"meta": {
"created_at": "2023-11-07T05:31:56Z",
"read_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z"
}
}
],
"meta": {
"pagination": {
"counts": {
"pages": 1,
"resources": 1
},
"current_page": 1,
"offsets": {
"next": null,
"previous": null
},
"requested": {
"limit": 10,
"offset": 0
}
},
"features": {
"include": {
"options": [
"related.resource"
]
}
},
"stats": {
"unread": {
"total": 123,
"by_domain": {}
}
}
},
"jsonapi": {
"version": "1.0"
}
}{
"id": "98ca4a78-b66f-4234-9719-aaf832ee6669",
"status": "400",
"title": "A validation error was encountered",
"source": {
"parameter": "include"
},
"meta": {
"resource": "wrong_value"
}
}{
"id": "05fc9c8d-73b9-4697-9337-57f7a567a48f",
"status": "401",
"title": "You are not authorised to access this resource",
"detail": "In order to access this resource, you need the 'admin' role.",
"code": "AUTH.001"
}{
"id": "fe9d9a69-f0a7-4fdc-bb2c-176027f316c5",
"status": "500",
"title": "Internal Server Error",
"detail": "An unexpected error occurred on the server."
}Update several notifications
Change the read, saved or archived state of a set of your own notifications in one request — the operation behind a multi-select in the inbox.
Each entry carries its own attributes, so one call can mark some notifications
read and archive others. The semantics per notification are exactly those of
PATCH /v3/notifications/{notification_id}: any combination of the three states,
anything omitted left alone, and marking read keeps the first read time.
Ids that are not in your own inbox are ignored rather than rejected. A selection in the console can go stale between rendering and acting on it, and failing the whole request because one row has since been archived elsewhere would be worse than quietly doing the rest. The response is the notifications that were actually updated, so the caller can see what took effect.
There is no delete. Archiving is how an inbox is cleared, and the history is kept
so that a replayed event cannot put something you have already dealt with back in
front of you. To clear everything at once, use mark-all-read and
archive-all-read, which do it in a single write rather than by listing every id.
curl --request PATCH \
--url https://api.ctrl-hub.com/v3/notifications \
--header 'Content-Type: application/vnd.api+json' \
--header 'X-Session-Token: <api-key>' \
--data '
{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"saved": true,
"archived": true
}
}
]
}
'import requests
url = "https://api.ctrl-hub.com/v3/notifications"
payload = { "data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"saved": True,
"archived": True
}
}
] }
headers = {
"X-Session-Token": "<api-key>",
"Content-Type": "application/vnd.api+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Session-Token': '<api-key>', 'Content-Type': 'application/vnd.api+json'},
body: JSON.stringify({
data: [
{
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
type: 'notifications',
attributes: {saved: true, archived: true}
}
]
})
};
fetch('https://api.ctrl-hub.com/v3/notifications', 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.ctrl-hub.com/v3/notifications",
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([
'data' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'type' => 'notifications',
'attributes' => [
'saved' => true,
'archived' => true
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/vnd.api+json",
"X-Session-Token: <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.ctrl-hub.com/v3/notifications"
payload := strings.NewReader("{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Session-Token", "<api-key>")
req.Header.Add("Content-Type", "application/vnd.api+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.ctrl-hub.com/v3/notifications")
.header("X-Session-Token", "<api-key>")
.header("Content-Type", "application/vnd.api+json")
.body("{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ctrl-hub.com/v3/notifications")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Session-Token"] = '<api-key>'
request["Content-Type"] = 'application/vnd.api+json'
request.body = "{\n \"data\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"type\": \"notifications\",\n \"attributes\": {\n \"saved\": true,\n \"archived\": true\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "notifications",
"attributes": {
"title": "<string>",
"body": "<string>",
"status": "unread",
"saved": true,
"reason": "assigned",
"channels": [
"inbox"
],
"notification_type": {
"domain": "documents",
"entity": "document",
"kind": "approved"
},
"link": "/documents/0197f9e5-6a2b-7c3d-8e4f-5a6b7c8d9e0f",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"meta": {
"created_at": "2023-11-07T05:31:56Z",
"read_at": "2023-11-07T05:31:56Z",
"archived_at": "2023-11-07T05:31:56Z"
}
}
],
"meta": {
"pagination": {
"counts": {
"pages": 1,
"resources": 1
},
"current_page": 1,
"offsets": {
"next": null,
"previous": null
},
"requested": {
"limit": 10,
"offset": 0
}
},
"features": {
"include": {
"options": [
"related.resource"
]
}
},
"stats": {
"unread": {
"total": 123,
"by_domain": {}
}
}
},
"jsonapi": {
"version": "1.0"
}
}{
"id": "98ca4a78-b66f-4234-9719-aaf832ee6669",
"status": "400",
"title": "A validation error was encountered",
"source": {
"parameter": "include"
},
"meta": {
"resource": "wrong_value"
}
}{
"id": "05fc9c8d-73b9-4697-9337-57f7a567a48f",
"status": "401",
"title": "You are not authorised to access this resource",
"detail": "In order to access this resource, you need the 'admin' role.",
"code": "AUTH.001"
}{
"id": "fe9d9a69-f0a7-4fdc-bb2c-176027f316c5",
"status": "500",
"title": "Internal Server Error",
"detail": "An unexpected error occurred on the server."
}Authorizations
Session token for authentication.
Body
The changes to make, one entry per notification. Each entry carries its own attributes, so a single request can mark some notifications read and archive others. Anything omitted from an entry is left as it is. Ids that are not in your own inbox — someone else's, or notifications that were only ever delivered by email — are ignored rather than rejected, so one stale id in a selection does not fail the whole action.
1 - 200 elementsShow child attributes
Show child attributes