curl --request PATCH \
--url https://app.tryspecter.com/api/v1/lists/investors/{listId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"add_ids": [
"inv_8297154210e592f8e05ce8e9"
],
"delete_ids": []
}
'import requests
url = "https://app.tryspecter.com/api/v1/lists/investors/{listId}"
payload = {
"add_ids": ["inv_8297154210e592f8e05ce8e9"],
"delete_ids": []
}
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({add_ids: ['inv_8297154210e592f8e05ce8e9'], delete_ids: []})
};
fetch('https://app.tryspecter.com/api/v1/lists/investors/{listId}', 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://app.tryspecter.com/api/v1/lists/investors/{listId}",
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([
'add_ids' => [
'inv_8297154210e592f8e05ce8e9'
],
'delete_ids' => [
]
]),
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://app.tryspecter.com/api/v1/lists/investors/{listId}"
payload := strings.NewReader("{\n \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\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://app.tryspecter.com/api/v1/lists/investors/{listId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/lists/investors/{listId}")
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 \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\n}"
response = http.request(request)
puts response.read_body{
"id": "5868fd24-b559-44db-8647-7535bd58451a",
"name": "My Watchlist",
"is_global": false,
"shared_with": [
"user_xxx"
],
"investors": [
{
"investor_id": "inv_84f563826c689ceb42aff52a",
"created_at": "2026-07-17T16:22:17.352985Z"
}
],
"created_at": "2026-07-17T16:22:17.352985Z",
"updated_at": "2026-07-17T16:22:17.352985Z"
}{
"errorCode": "INVALID_LIST_UUID",
"message": "List id must be a valid UUID."
}{
"errorCode": "API_KEY_MISSING",
"message": "No API Key was presented on the header X-API-KEY"
}{
"errorCode": "NOT_PERMITTED",
"message": "You do not have permission to access this resource."
}{
"errorCode": "<string>",
"message": "<string>"
}{
"errorCode": "<string>",
"message": "<string>"
}Update investor list
Adds and/or removes investor IDs from an existing investor list in a single request.
What you need
A list ID (UUID) shared with the API, and the investor IDs to add and/or remove. You need a investor list ID. Get one from Get all investor lists.
Behaviour
- Provide
add_idsand/ordelete_ids; you can send either or both. listIdmust be a UUID, otherwise400.- The list must be shared with the API to be modifiable.
What you do next
- Check the result. Pull the updated members with Get investor list results.
curl --request PATCH \
--url https://app.tryspecter.com/api/v1/lists/investors/{listId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"add_ids": [
"inv_8297154210e592f8e05ce8e9"
],
"delete_ids": []
}
'import requests
url = "https://app.tryspecter.com/api/v1/lists/investors/{listId}"
payload = {
"add_ids": ["inv_8297154210e592f8e05ce8e9"],
"delete_ids": []
}
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({add_ids: ['inv_8297154210e592f8e05ce8e9'], delete_ids: []})
};
fetch('https://app.tryspecter.com/api/v1/lists/investors/{listId}', 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://app.tryspecter.com/api/v1/lists/investors/{listId}",
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([
'add_ids' => [
'inv_8297154210e592f8e05ce8e9'
],
'delete_ids' => [
]
]),
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://app.tryspecter.com/api/v1/lists/investors/{listId}"
payload := strings.NewReader("{\n \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\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://app.tryspecter.com/api/v1/lists/investors/{listId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryspecter.com/api/v1/lists/investors/{listId}")
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 \"add_ids\": [\n \"inv_8297154210e592f8e05ce8e9\"\n ],\n \"delete_ids\": []\n}"
response = http.request(request)
puts response.read_body{
"id": "5868fd24-b559-44db-8647-7535bd58451a",
"name": "My Watchlist",
"is_global": false,
"shared_with": [
"user_xxx"
],
"investors": [
{
"investor_id": "inv_84f563826c689ceb42aff52a",
"created_at": "2026-07-17T16:22:17.352985Z"
}
],
"created_at": "2026-07-17T16:22:17.352985Z",
"updated_at": "2026-07-17T16:22:17.352985Z"
}{
"errorCode": "INVALID_LIST_UUID",
"message": "List id must be a valid UUID."
}{
"errorCode": "API_KEY_MISSING",
"message": "No API Key was presented on the header X-API-KEY"
}{
"errorCode": "NOT_PERMITTED",
"message": "You do not have permission to access this resource."
}{
"errorCode": "<string>",
"message": "<string>"
}{
"errorCode": "<string>",
"message": "<string>"
}Authorizations
Path Parameters
The ID of the list being requested.
Body
Response
The list including investor ids
List Id
"5868fd24-b559-44db-8647-7535bd58451a"
Name of the list
"My Watchlist"
true when the list is a global list curated by Specter and available to all users. false for lists owned by your organization.
false
The Specter user IDs this list is shared with, or an empty array when it is not shared. Resolve an ID to a person with Get organization members.
["user_xxx"]
The investors included in this list
Show child attributes
Show child attributes
Date (YYYY:MM:DD) the list was created.
"2026-07-17T16:22:17.352985Z"
Date (YYYY:MM:DD) the list was last updated.
"2026-07-17T16:22:17.352985Z"
Was this page helpful?