curl --request GET \
--url https://public-api.etoro.com/api/v1/data/stockback/promo-status \
--header 'x-api-key: <api-key>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-user-key: <api-key>'import requests
url = "https://public-api.etoro.com/api/v1/data/stockback/promo-status"
headers = {
"x-request-id": "<x-request-id>",
"x-api-key": "<api-key>",
"x-user-key": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'x-request-id': '<x-request-id>',
'x-api-key': '<api-key>',
'x-user-key': '<api-key>'
}
};
fetch('https://public-api.etoro.com/api/v1/data/stockback/promo-status', 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/data/stockback/promo-status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>",
"x-request-id: <x-request-id>",
"x-user-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"
"net/http"
"io"
)
func main() {
url := "https://public-api.etoro.com/api/v1/data/stockback/promo-status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-request-id", "<x-request-id>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-user-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://public-api.etoro.com/api/v1/data/stockback/promo-status")
.header("x-request-id", "<x-request-id>")
.header("x-api-key", "<api-key>")
.header("x-user-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.etoro.com/api/v1/data/stockback/promo-status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-request-id"] = '<x-request-id>'
request["x-api-key"] = '<api-key>'
request["x-user-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"isOptedIn": true,
"selectedStock": "AAPL",
"currentIsPi": false,
"rewardChannel": "stockback",
"currentClub": "Silver",
"currentCountry": "GB",
"expectedCurrentMonthUsd": 12.34,
"stockbackLifetimeUsd": 100.5,
"cashbackLifetimeUsd": 50.25,
"totalLifetimeUsd": 150.75
}{
"error": {
"code": "gcid_required",
"message": "This endpoint requires a gateway-issued GCID"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "stockback_promo_status_not_found",
"message": "Stockback promo status was not found"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "data_integrity_error",
"message": "The requested resource could not be resolved"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "dependency_unavailable",
"message": "The requested resource is temporarily unavailable"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}Get the caller's StockBack/Cashback promo status
Rate limit: 60 requests per 60 seconds. This is the default shared quota — it is shared with every other endpoint that has no dedicated limit, so requests across those endpoints all draw from the same budget.
Returns the calling customer’s current StockBack/Cashback promo enrollment and lifetime USD reward figures - opted-in status, selected stock, professional-investor status, reward channel, club tier, country, this month’s expected reward, and lifetime StockBack/Cashback/total USD earned. This is user-scoped: the caller is identified by their own gateway-issued GCID, not a path or query parameter, so it always answers for ‘me’. A customer who is not (or not yet) enrolled in the promo still returns 200, with every value field null, rather than 404 - a 404 means no row exists for this GCID at all, which is a data-completeness gap, not simply ‘not enrolled’.
curl --request GET \
--url https://public-api.etoro.com/api/v1/data/stockback/promo-status \
--header 'x-api-key: <api-key>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-user-key: <api-key>'import requests
url = "https://public-api.etoro.com/api/v1/data/stockback/promo-status"
headers = {
"x-request-id": "<x-request-id>",
"x-api-key": "<api-key>",
"x-user-key": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'x-request-id': '<x-request-id>',
'x-api-key': '<api-key>',
'x-user-key': '<api-key>'
}
};
fetch('https://public-api.etoro.com/api/v1/data/stockback/promo-status', 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/data/stockback/promo-status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>",
"x-request-id: <x-request-id>",
"x-user-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"
"net/http"
"io"
)
func main() {
url := "https://public-api.etoro.com/api/v1/data/stockback/promo-status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-request-id", "<x-request-id>")
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-user-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://public-api.etoro.com/api/v1/data/stockback/promo-status")
.header("x-request-id", "<x-request-id>")
.header("x-api-key", "<api-key>")
.header("x-user-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.etoro.com/api/v1/data/stockback/promo-status")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-request-id"] = '<x-request-id>'
request["x-api-key"] = '<api-key>'
request["x-user-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"isOptedIn": true,
"selectedStock": "AAPL",
"currentIsPi": false,
"rewardChannel": "stockback",
"currentClub": "Silver",
"currentCountry": "GB",
"expectedCurrentMonthUsd": 12.34,
"stockbackLifetimeUsd": 100.5,
"cashbackLifetimeUsd": 50.25,
"totalLifetimeUsd": 150.75
}{
"error": {
"code": "gcid_required",
"message": "This endpoint requires a gateway-issued GCID"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "stockback_promo_status_not_found",
"message": "Stockback promo status was not found"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "data_integrity_error",
"message": "The requested resource could not be resolved"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}{
"error": {
"code": "dependency_unavailable",
"message": "The requested resource is temporarily unavailable"
},
"requestId": "3f6c1b7e-9a41-4c2e-8f0d-1b2a3c4d5e6f"
}Authorizations
API key of the application. Only valid together with the x-user-key header — the pair is an alternative to OAuth bearer authentication, never sent alongside it. The pair is granted the same permissions the operation's OAuth scopes describe.
Demo credential for trying the API from these docs: lhgfaslk21490FAScVPkdsb53F9dNkfHG4faZSG5vfjndfcfgdssdgsdHF4663
User-specific authentication key. Only valid together with the x-api-key header — the pair is an alternative to OAuth bearer authentication, never sent alongside it.
Demo credential for trying the API from these docs: eyJlYW4iOiJVbnJlZ2lzdGVyZWRBcHBsaWNhdGlvbiIsImVrIjoiOE5sZ2cwcW5EUVdROUFNWGpXT2lmOWktZnpidG5KcUlqWGJ3WHJZZkpZcldrbG90ZEhvLVBjSWhQaU8xU1ZtMW84aU1WZGZqN2xWNzFjLXFxLmcybXE1dnh4Q1hUT25xaWRUaTFlcEhmVk1fIn0_
Headers
A unique request identifier.
"dcce8e27-c2c5-43da-b669-a499ec37ecdb"
Response
The caller's current StockBack/Cashback promo status.
The caller's current StockBack/Cashback promo enrollment and lifetime USD figures. Every field is nullable: a caller not (yet) enrolled in the promo still returns 200 with mostly-null values.
Whether the caller is currently opted into the StockBack promo.
true
Ticker symbol of the stock the caller selected for StockBack, if opted in.
"AAPL"
Whether the caller is currently classified as a Professional Investor.
false
The channel this caller's reward is delivered through.
"stockback"
The caller's current eToro Club tier.
"Silver"
The caller's current country.
"GB"
Reward expected to accrue this calendar month, in USD.
12.34
Lifetime StockBack reward earned, in USD.
100.5
Lifetime Cashback reward earned, in USD.
50.25
Lifetime total reward earned (StockBack + Cashback), in USD.
150.75