Modify watchlist assets
curl --request PATCH \
--url https://api.messari.io/user-management/v1/watchlists/{id}/assets \
--header 'Content-Type: */*' \
--header 'X-Messari-API-Key: <api-key>' \
--data '
{
"assetIds": [
"<string>"
]
}
'import requests
url = "https://api.messari.io/user-management/v1/watchlists/{id}/assets"
payload = { "assetIds": ["<string>"] }
headers = {
"X-Messari-API-Key": "<api-key>",
"Content-Type": "*/*"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Messari-API-Key': '<api-key>', 'Content-Type': '*/*'},
body: JSON.stringify({assetIds: ['<string>']})
};
fetch('https://api.messari.io/user-management/v1/watchlists/{id}/assets', 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.messari.io/user-management/v1/watchlists/{id}/assets",
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([
'assetIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: */*",
"X-Messari-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.messari.io/user-management/v1/watchlists/{id}/assets"
payload := strings.NewReader("{\n \"assetIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Messari-API-Key", "<api-key>")
req.Header.Add("Content-Type", "*/*")
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.messari.io/user-management/v1/watchlists/{id}/assets")
.header("X-Messari-API-Key", "<api-key>")
.header("Content-Type", "*/*")
.body("{\n \"assetIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.messari.io/user-management/v1/watchlists/{id}/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Messari-API-Key"] = '<api-key>'
request["Content-Type"] = '*/*'
request.body = "{\n \"assetIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": null,
"data": {
"id": "BA3FDA7B",
"title": "DeFi Blue Chips",
"assetIds": [
"1e31218a-e44e-4285-820c-8282ee222035",
"21c795f5-1bfd-40c3-858e-e9d7e820c6d0",
"b3d5d66c-26a2-404c-9325-91dc714a722b"
],
"createdAt": "2026-03-27T14:11:02.612968Z",
"updatedAt": "2026-03-27T14:11:27.836661Z"
}
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}Watchlists
Update Watchlist Assets
Modify the assets in a specific watchlist by ID for the authenticated user
PATCH
/
user-management
/
v1
/
watchlists
/
{id}
/
assets
Modify watchlist assets
curl --request PATCH \
--url https://api.messari.io/user-management/v1/watchlists/{id}/assets \
--header 'Content-Type: */*' \
--header 'X-Messari-API-Key: <api-key>' \
--data '
{
"assetIds": [
"<string>"
]
}
'import requests
url = "https://api.messari.io/user-management/v1/watchlists/{id}/assets"
payload = { "assetIds": ["<string>"] }
headers = {
"X-Messari-API-Key": "<api-key>",
"Content-Type": "*/*"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-Messari-API-Key': '<api-key>', 'Content-Type': '*/*'},
body: JSON.stringify({assetIds: ['<string>']})
};
fetch('https://api.messari.io/user-management/v1/watchlists/{id}/assets', 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.messari.io/user-management/v1/watchlists/{id}/assets",
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([
'assetIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: */*",
"X-Messari-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.messari.io/user-management/v1/watchlists/{id}/assets"
payload := strings.NewReader("{\n \"assetIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-Messari-API-Key", "<api-key>")
req.Header.Add("Content-Type", "*/*")
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.messari.io/user-management/v1/watchlists/{id}/assets")
.header("X-Messari-API-Key", "<api-key>")
.header("Content-Type", "*/*")
.body("{\n \"assetIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.messari.io/user-management/v1/watchlists/{id}/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-Messari-API-Key"] = '<api-key>'
request["Content-Type"] = '*/*'
request.body = "{\n \"assetIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": null,
"data": {
"id": "BA3FDA7B",
"title": "DeFi Blue Chips",
"assetIds": [
"1e31218a-e44e-4285-820c-8282ee222035",
"21c795f5-1bfd-40c3-858e-e9d7e820c6d0",
"b3d5d66c-26a2-404c-9325-91dc714a722b"
],
"createdAt": "2026-03-27T14:11:02.612968Z",
"updatedAt": "2026-03-27T14:11:27.836661Z"
}
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}{
"data": "<unknown>",
"error": "<string>"
}Overview
Add or remove individual assets from a watchlist without replacing the entire asset list. This is useful for incrementally managing watchlist contents. Theaction field must be either add or remove, and assetIds specifies which asset UUIDs to add or remove.
To replace the entire asset list at once, use the Update Watchlist endpoint with the
assetIds field instead.⌘I

