curl --request POST \
--url https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-user-key: <x-user-key>' \
--data '
[
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1,
"itemAddedReason": "Manual",
"itemAddedDate": "2023-11-07T05:31:56Z",
"market": {
"id": "<string>",
"symbolName": "<string>",
"displayName": "<string>",
"assetTypeId": 123,
"assetTypeSubCategoryId": 123,
"exchangeId": 123,
"hasExpirationDate": true,
"avatar": {
"small": "<string>",
"medium": "<string>",
"large": "<string>",
"svg": {
"url": "<string>",
"backgroundColor": "<string>",
"textColor": "<string>"
}
}
}
}
]
'import requests
url = "https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items"
payload = [
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1,
"itemAddedReason": "Manual",
"itemAddedDate": "2023-11-07T05:31:56Z",
"market": {
"id": "<string>",
"symbolName": "<string>",
"displayName": "<string>",
"assetTypeId": 123,
"assetTypeSubCategoryId": 123,
"exchangeId": 123,
"hasExpirationDate": True,
"avatar": {
"small": "<string>",
"medium": "<string>",
"large": "<string>",
"svg": {
"url": "<string>",
"backgroundColor": "<string>",
"textColor": "<string>"
}
}
}
}
]
headers = {
"x-request-id": "<x-request-id>",
"x-api-key": "<x-api-key>",
"x-user-key": "<x-user-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-request-id': '<x-request-id>',
'x-api-key': '<x-api-key>',
'x-user-key': '<x-user-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify([
{
itemId: 12345,
itemType: 'Instrument',
itemRank: 1,
itemAddedReason: 'Manual',
itemAddedDate: '2023-11-07T05:31:56Z',
market: {
id: '<string>',
symbolName: '<string>',
displayName: '<string>',
assetTypeId: 123,
assetTypeSubCategoryId: 123,
exchangeId: 123,
hasExpirationDate: true,
avatar: {
small: '<string>',
medium: '<string>',
large: '<string>',
svg: {url: '<string>', backgroundColor: '<string>', textColor: '<string>'}
}
}
}
])
};
fetch('https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items', 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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items",
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([
[
'itemId' => 12345,
'itemType' => 'Instrument',
'itemRank' => 1,
'itemAddedReason' => 'Manual',
'itemAddedDate' => '2023-11-07T05:31:56Z',
'market' => [
'id' => '<string>',
'symbolName' => '<string>',
'displayName' => '<string>',
'assetTypeId' => 123,
'assetTypeSubCategoryId' => 123,
'exchangeId' => 123,
'hasExpirationDate' => true,
'avatar' => [
'small' => '<string>',
'medium' => '<string>',
'large' => '<string>',
'svg' => [
'url' => '<string>',
'backgroundColor' => '<string>',
'textColor' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-request-id: <x-request-id>",
"x-user-key: <x-user-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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items"
payload := strings.NewReader("[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-request-id", "<x-request-id>")
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("x-user-key", "<x-user-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items")
.header("x-request-id", "<x-request-id>")
.header("x-api-key", "<x-api-key>")
.header("x-user-key", "<x-user-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-request-id"] = '<x-request-id>'
request["x-api-key"] = '<x-api-key>'
request["x-user-key"] = '<x-user-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"status": 200,
"watchlists": [
{
"watchlistId": "12345",
"name": "Tech Watchlist",
"Gcid": 12345,
"watchlistType": "Static",
"totalItems": 100,
"isDefault": true,
"isUserSelectedDefault": true,
"watchlistRank": 1,
"dynamicUrl": "<string>",
"items": [
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1
}
],
"relatedAssets": [
12345,
67890
]
}
],
"exception": {
"invalidItems": [
"<string>"
],
"reason": "<string>",
"message": "<string>"
},
"meta": {
"pageNumber": 0,
"itemsPerPage": 100,
"maxItemsInWatchlistLimit": 1000,
"maxWatchlistsLimit": 10
},
"isSucceeded": true
}Create default watchlist with selected items
Rate limit: 20 requests per 60 seconds. This is a shared quota — the same budget is consumed by a group of related endpoints, so calling any of them reduces what is left for the others (you cannot call each at the full rate independently). Endpoints sharing this quota:
DELETE /api/v1/watchlists/{watchlistId}DELETE /api/v1/watchlists/{watchlistId}/itemsPOST /api/v1/watchlistsPOST /api/v1/watchlists/newasdefault-watchlistPOST /api/v1/watchlists/{watchlistId}/itemsPUT /api/v1/watchlists/rank/{watchlistId}PUT /api/v1/watchlists/setUserSelectedUserDefault/{watchlistId}PUT /api/v1/watchlists/{watchlistId}PUT /api/v1/watchlists/{watchlistId}/items
Creates a default watchlist populated with the specified items.
curl --request POST \
--url https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-user-key: <x-user-key>' \
--data '
[
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1,
"itemAddedReason": "Manual",
"itemAddedDate": "2023-11-07T05:31:56Z",
"market": {
"id": "<string>",
"symbolName": "<string>",
"displayName": "<string>",
"assetTypeId": 123,
"assetTypeSubCategoryId": 123,
"exchangeId": 123,
"hasExpirationDate": true,
"avatar": {
"small": "<string>",
"medium": "<string>",
"large": "<string>",
"svg": {
"url": "<string>",
"backgroundColor": "<string>",
"textColor": "<string>"
}
}
}
}
]
'import requests
url = "https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items"
payload = [
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1,
"itemAddedReason": "Manual",
"itemAddedDate": "2023-11-07T05:31:56Z",
"market": {
"id": "<string>",
"symbolName": "<string>",
"displayName": "<string>",
"assetTypeId": 123,
"assetTypeSubCategoryId": 123,
"exchangeId": 123,
"hasExpirationDate": True,
"avatar": {
"small": "<string>",
"medium": "<string>",
"large": "<string>",
"svg": {
"url": "<string>",
"backgroundColor": "<string>",
"textColor": "<string>"
}
}
}
}
]
headers = {
"x-request-id": "<x-request-id>",
"x-api-key": "<x-api-key>",
"x-user-key": "<x-user-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-request-id': '<x-request-id>',
'x-api-key': '<x-api-key>',
'x-user-key': '<x-user-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify([
{
itemId: 12345,
itemType: 'Instrument',
itemRank: 1,
itemAddedReason: 'Manual',
itemAddedDate: '2023-11-07T05:31:56Z',
market: {
id: '<string>',
symbolName: '<string>',
displayName: '<string>',
assetTypeId: 123,
assetTypeSubCategoryId: 123,
exchangeId: 123,
hasExpirationDate: true,
avatar: {
small: '<string>',
medium: '<string>',
large: '<string>',
svg: {url: '<string>', backgroundColor: '<string>', textColor: '<string>'}
}
}
}
])
};
fetch('https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items', 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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items",
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([
[
'itemId' => 12345,
'itemType' => 'Instrument',
'itemRank' => 1,
'itemAddedReason' => 'Manual',
'itemAddedDate' => '2023-11-07T05:31:56Z',
'market' => [
'id' => '<string>',
'symbolName' => '<string>',
'displayName' => '<string>',
'assetTypeId' => 123,
'assetTypeSubCategoryId' => 123,
'exchangeId' => 123,
'hasExpirationDate' => true,
'avatar' => [
'small' => '<string>',
'medium' => '<string>',
'large' => '<string>',
'svg' => [
'url' => '<string>',
'backgroundColor' => '<string>',
'textColor' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-api-key: <x-api-key>",
"x-request-id: <x-request-id>",
"x-user-key: <x-user-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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items"
payload := strings.NewReader("[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-request-id", "<x-request-id>")
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("x-user-key", "<x-user-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items")
.header("x-request-id", "<x-request-id>")
.header("x-api-key", "<x-api-key>")
.header("x-user-key", "<x-user-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.etoro.com/api/v1/watchlists/default-watchlist/selected-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-request-id"] = '<x-request-id>'
request["x-api-key"] = '<x-api-key>'
request["x-user-key"] = '<x-user-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"itemId\": 12345,\n \"itemType\": \"Instrument\",\n \"itemRank\": 1,\n \"itemAddedReason\": \"Manual\",\n \"itemAddedDate\": \"2023-11-07T05:31:56Z\",\n \"market\": {\n \"id\": \"<string>\",\n \"symbolName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"assetTypeId\": 123,\n \"assetTypeSubCategoryId\": 123,\n \"exchangeId\": 123,\n \"hasExpirationDate\": true,\n \"avatar\": {\n \"small\": \"<string>\",\n \"medium\": \"<string>\",\n \"large\": \"<string>\",\n \"svg\": {\n \"url\": \"<string>\",\n \"backgroundColor\": \"<string>\",\n \"textColor\": \"<string>\"\n }\n }\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"status": 200,
"watchlists": [
{
"watchlistId": "12345",
"name": "Tech Watchlist",
"Gcid": 12345,
"watchlistType": "Static",
"totalItems": 100,
"isDefault": true,
"isUserSelectedDefault": true,
"watchlistRank": 1,
"dynamicUrl": "<string>",
"items": [
{
"itemId": 12345,
"itemType": "Instrument",
"itemRank": 1
}
],
"relatedAssets": [
12345,
67890
]
}
],
"exception": {
"invalidItems": [
"<string>"
],
"reason": "<string>",
"message": "<string>"
},
"meta": {
"pageNumber": 0,
"itemsPerPage": 100,
"maxItemsInWatchlistLimit": 1000,
"maxWatchlistsLimit": 10
},
"isSucceeded": true
}Authorizations
eToro OAuth2. Each operation lists the scopes that grant access as separate security requirements (OpenAPI OR semantics): the caller's token only needs ONE of them — you do NOT need all of them. The same scopes back the x-api-key/x-user-key credential pair.
Headers
A unique request identifier.
"5a314860-89e6-4e68-a91b-4bead530e093"
API key for authentication.
"lhgfaslk21490FAScVPkdsb53F9dNkfHG4faZSG5vfjndfcfgdssdgsdHF4663"
User-specific authentication key.
"eyJlYW4iOiJVbnJlZ2lzdGVyZWRBcHBsaWNhdGlvbiIsImVrIjoiOE5sZ2cwcW5EUVdROUFNWGpXT2lmOWktZnpidG5KcUlqWGJ3WHJZZkpZcldrbG90ZEhvLVBjSWhQaU8xU1ZtMW84aU1WZGZqN2xWNzFjLXFxLmcybXE1dnh4Q1hUT25xaWRUaTFlcEhmVk1fIn0_"
Body
Items to include in the default watchlist
Unique identifier of the financial instrument
12345
Type of the financial instrument (e.g., 'Instrument', 'Person')
"Instrument"
Ranking position of the item in the watchlist
1
Reason the item was added to the watchlist
"Manual"
Date and time the item was added
Market metadata for the instrument when included
Show child attributes
Show child attributes
Response
Default watchlist created successfully
Response containing multiple watchlists with metadata
HTTP status code of the response
200
List of user watchlists
Show child attributes
Show child attributes
Exception details when the request partially failed
Show child attributes
Show child attributes
Response metadata including pagination info
Show child attributes
Show child attributes
Whether the request succeeded
true