← Back to Skills Marketplace
marian2js

eToro API

by Mariano Pardo · GitHub ↗ · v1.0.0
cross-platform ⚠ suspicious
488
Downloads
0
Stars
1
Active Installs
1
Versions
Install in OpenClaw
/install etoro-api
Description
Enables agents to interact with the eToro API to access market data, portfolio and social features, and execute trades programmatically.
README (SKILL.md)

eToro Public API

Base URL: https://public-api.etoro.com/api/v1

About

This skill allows to interact with the user's eToro account programatically, including executing trades.

Authentication & Required Headers

Keys (request from the user on install)

  • Public API Key: application
  • User Key: user account
  • Environment: Real Portfolio or Virtual Portfolio (real/demo)

Key generation (user-facing):

  1. Log in to eToro.
  2. Settings > Trading.
  3. Create New Key.
  4. Choose Environment (Real or Virtual/Demo) and Permissions (Read or Write).
  5. Verify identity and copy the generated User Key.

Headers (every request):

  • x-request-id: unique UUID per request
  • x-api-key: Public API Key (\x3CPUBLIC_KEY>)
  • x-user-key: User Key (\x3CUSER_KEY>)

Example:

curl -X GET "https://public-api.etoro.com/api/v1/watchlists" \
  -H "x-request-id: \x3CUUID>" \
  -H "x-api-key: \x3CPUBLIC_KEY>" \
  -H "x-user-key: \x3CUSER_KEY>"

Request Conventions

  • All paths below are relative to the Base URL (which already includes /api/v1).
    Example: GET /watchlists means GET https://public-api.etoro.com/api/v1/watchlists.
  • Query params go in the URL, path params go in the URL path.
  • For query params that are documented as array, send them as comma-separated values (e.g., instrumentIds=1001,1002).
  • Pagination patterns vary by endpoint:
    • Search: pageNumber, pageSize
    • People search & trade history: page, pageSize
    • Feeds: take, offset
    • Watchlist items listing: pageNumber, itemsPerPage
  • Casing matters for request bodies:
    • Trading execution uses PascalCase fields (e.g., InstrumentID, IsBuy, Leverage).
    • Market close body uses InstrumentId (capital I, lowercase d).
    • Watchlist items use ItemId, ItemType, ItemRank.
    • Feeds post body uses lower camel (owner, message, tags, mentions, attachments).
  • Some responses may use different casing for similar concepts (e.g., instrumentId vs InstrumentID). When extracting IDs, handle both if present.

Demo vs Real Trading

  • Use demo execution endpoints (contain /demo/) for testing and paper trading.
  • Use non-demo execution endpoints for real trading.
  • For portfolio/PnL:
    • Demo: /trading/info/demo/*
    • Real: /trading/info/portfolio and /trading/info/real/pnl
  • Ensure your key environment matches the endpoint (Virtual vs Real). Each User Key is associated with a specific environment.

Use Defaults

  • Important: You don't need to specify all parameters. If the user doesn't specify leverage for example, don't send it on the API request.

Quick Start (Demo Trade)

  1. Resolve instrumentId using search.
    fields is required on search requests.
curl -X GET "https://public-api.etoro.com/api/v1/market-data/search?internalSymbolFull=BTC&fields=instrumentId,internalSymbolFull,displayname" \
  -H "x-api-key: \x3CPUBLIC_KEY>" \
  -H "x-user-key: \x3CUSER_KEY>" \
  -H "x-request-id: \x3CUUID>"
  1. Place a demo market order by amount (PascalCase body):
curl -X POST "https://public-api.etoro.com/api/v1/trading/execution/demo/market-open-orders/by-amount" \
  -H "x-api-key: \x3CPUBLIC_KEY>" \
  -H "x-user-key: \x3CUSER_KEY>" \
  -H "x-request-id: \x3CUUID>" \
  -H "Content-Type: application/json" \
  -d '{
    "InstrumentID": 100000,
    "IsBuy": true,
    "Leverage": 1,
    "Amount": 100
  }'

Common IDs

  • instrumentId: from Search or Instruments metadata
  • positionId: from Portfolio endpoints
  • orderId: from execution responses or Portfolio endpoints
  • marketId: used by instrument feed endpoints (typically available in instrument metadata/search fields)
  • userId: numeric eToro user ID (often referred to as CID in responses; discover via People endpoints/search)
  • watchlistId: from watchlists list/create endpoints

Market Data (Requests)

Search instruments

  • GET /market-data/search
  • Required query: fields (comma-separated list of instrument fields to return)
  • Optional: searchText, pageSize, pageNumber, sort
  • The Search endpoint supports filtering by fields returned in results; for exact symbol lookup, use internalSymbolFull as a query param and verify the exact match.
  • Recommended minimal fields when you need IDs: include the instrument identifier (may appear as instrumentId or InstrumentID), plus internalSymbolFull and displayname (and marketId if you plan to use Feeds).

Metadata

  • GET /market-data/instruments
    Filters: instrumentIds, exchangeIds, stocksIndustryIds, instrumentTypeIds.

Prices & history

  • GET /market-data/instruments/rates
    Required: instrumentIds (comma-separated).
  • GET /market-data/instruments/history/closing-price
    Returns historical closing prices for all instruments (bulk).
  • GET /market-data/instruments/{instrumentId}/history/candles/{direction}/{interval}/{candlesCount}
    direction: asc or desc. candlesCount max 1000.
    Use only supported interval values (confirm via docs if unsure).

Reference data

  • GET /market-data/exchanges (optional exchangeIds)
  • GET /market-data/instrument-types
  • GET /market-data/stocks-industries (optional stocksIndustryIds)

Trading Execution (Requests)

Requires a key with appropriate permissions (typically Write) and the correct environment (Demo vs Real).

Market Open Orders (by amount)

Endpoints:

  • POST /trading/execution/demo/market-open-orders/by-amount
  • POST /trading/execution/market-open-orders/by-amount

Body (PascalCase, JSON):

  • Required: InstrumentID, IsBuy, Leverage, Amount
  • Optional: StopLossRate, TakeProfitRate, IsTslEnabled, IsNoStopLoss, IsNoTakeProfit

Market Open Orders (by units)

Endpoints:

  • POST /trading/execution/demo/market-open-orders/by-units
  • POST /trading/execution/market-open-orders/by-units

Body (PascalCase, JSON):

  • Required: InstrumentID, IsBuy, Leverage, AmountInUnits
  • Optional: StopLossRate, TakeProfitRate, IsTslEnabled, IsNoStopLoss, IsNoTakeProfit

Cancel Market Open Orders

Endpoints:

  • DELETE /trading/execution/demo/market-open-orders/{orderId}
  • DELETE /trading/execution/market-open-orders/{orderId}

Market Close Orders

Endpoints:

  • POST /trading/execution/demo/market-close-orders/positions/{positionId}
  • POST /trading/execution/market-close-orders/positions/{positionId}
  • DELETE /trading/execution/demo/market-close-orders/{orderId}
  • DELETE /trading/execution/market-close-orders/{orderId}

Body (JSON):

  • Required: InstrumentId
  • Optional: UnitsToDeduct (number or null)

Partial close: set UnitsToDeduct.
Full close: set UnitsToDeduct to null.
You must close by positionId, not by symbol.

Market-if-touched (Limit) Orders

Endpoints:

  • POST /trading/execution/demo/limit-orders
  • DELETE /trading/execution/demo/limit-orders/{orderId}
  • POST /trading/execution/limit-orders
  • DELETE /trading/execution/limit-orders/{orderId}

Body (PascalCase, JSON):

  • Required: InstrumentID, IsBuy, Leverage, Rate, and one of Amount or AmountInUnits
  • Optional: StopLossRate, TakeProfitRate, IsTslEnabled, IsNoStopLoss, IsNoTakeProfit
  • Do not send: IsDiscounted, CID

Trading Info & Portfolio (Requests)

  • GET /trading/info/demo/pnl
  • GET /trading/info/real/pnl
  • GET /trading/info/demo/portfolio
  • GET /trading/info/portfolio
    Use these to discover positionId and orderId for close/cancel flows.
  • GET /trading/info/trade/history
    Required: minDate (YYYY-MM-DD). Optional: page, pageSize.

Watchlists (Requests)

User watchlists

  • GET /watchlists
    Optional: itemsPerPageForSingle, ensureBuiltinWatchlists, addRelatedAssets.
  • GET /watchlists/{watchlistId}
    Optional: pageNumber, itemsPerPage.
  • POST /watchlists
    Query: name (required), type, dynamicQuery (optional). (Uses query params, not a JSON body.)
  • PUT /watchlists/{watchlistId}
    Query: newName (required). (Uses query params, not a JSON body.)
  • DELETE /watchlists/{watchlistId}

Watchlist items (body schema)

WatchlistItemDto fields:

  • ItemId (required, int)
  • ItemType (required, string: Instrument or Person)
  • ItemRank (optional, int)

Endpoints:

  • POST /watchlists/{watchlistId}/items
  • PUT /watchlists/{watchlistId}/items
  • DELETE /watchlists/{watchlistId}/items

Example body:

[
  { "ItemId": 12345, "ItemType": "Instrument", "ItemRank": 1 },
  { "ItemId": 67890, "ItemType": "Instrument", "ItemRank": 2 }
]

Default watchlists

  • POST /watchlists/default-watchlist/selected-items
  • GET /watchlists/default-watchlists/items
    Optional: itemsLimit, itemsPerPage.
  • POST /watchlists/newasdefault-watchlist
    Query: name (required), type, dynamicQuery (optional).
  • PUT /watchlists/setUserSelectedUserDefault/{watchlistId}
  • PUT /watchlists/rank/{watchlistId}
    Query: newRank (required).

Public watchlists

  • GET /watchlists/public/{userId}
  • GET /watchlists/public/{userId}/{watchlistId}

Feeds (Requests)

Read feeds

  • GET /feeds/instrument/{marketId}
    Optional: requesterUserId, take, offset, badgesExperimentIsEnabled, reactionsPageSize.
  • GET /feeds/user/{userId}
    Optional: requesterUserId, take, offset, badgesExperimentIsEnabled, reactionsPageSize.

Notes:

  • marketId is associated with an instrument (typically available via instrument metadata/search if you include it in fields).
  • userId is a numeric user identifier (CID). If you only have a username, discover the numeric ID via People endpoints (see User Info & Analytics).

Create post

  • POST /feeds/post
  • Body fields (lower camel, JSON):
    • owner (int)
    • message (string)
    • tags: { "tags": [{ "name": "...", "id": "..." }] }
    • mentions: { "mentions": [{ "userName": "...", "id": "...", "isDirect": true }] }
    • attachments: array of objects with url, title, host, description, mediaType, and optional media.

Minimal example:

{ "message": "Hello eToro feed!" }

Curated Lists & Recommendations (Requests)

  • GET /curated-lists
  • GET /market-recommendations/{itemsCount}

Popular Investors (Copiers)

  • GET /pi-data/copiers

User Info & Analytics (Requests)

  • GET /user-info/people
    Optional: usernames, cidList.
    Use this to map username ↔ CID (userId) when you need numeric userId for feeds/public watchlists.
  • GET /user-info/people/search
    Required: period. Optional: page, pageSize, sort, popularInvestor, gainMax, maxDailyRiskScoreMin, maxDailyRiskScoreMax, maxMonthlyRiskScoreMin, maxMonthlyRiskScoreMax, weeksSinceRegistrationMin, countryId, instrumentId, instrumentPctMin, instrumentPctMax, isTestAccount, and other filters.
  • GET /user-info/people/{username}/gain
  • GET /user-info/people/{username}/daily-gain
    Required: minDate, maxDate, type (Daily or Period).
  • GET /user-info/people/{username}/portfolio/live
  • GET /user-info/people/{username}/tradeinfo
    Required: period (e.g., LastTwoYears).

Responses & Schemas

For response schemas and full examples, refer to:

Usage Guidance
This skill's documentation shows it will ask you for an eToro Public API Key and a User Key and can execute real trades — but the registry metadata didn't declare any required credentials. Before installing: (1) confirm the skill's origin (source is listed as unknown despite an eToro homepage link); (2) demand that the publisher declare required credentials in the metadata; (3) for testing only give a demo/virtual User Key with limited permissions (prefer Read-only or demo keys); (4) do not provide real trading keys unless you fully trust the skill and its publisher and you are prepared for the agent to place orders; (5) prefer explicit prompts/consent before any real-trade API call and check logs/confirmations. If the publisher cannot justify why credentials are omitted from metadata, treat the skill as untrusted.
Capability Analysis
Type: OpenClaw Skill Name: etoro-api Version: 1.0.0 The skill provides programmatic access to the eToro API, enabling actions such as executing real financial trades, accessing portfolio data, and managing watchlists. While the documentation in `SKILL.md` is clean and does not contain explicit prompt injection attempts or malicious instructions (e.g., data exfiltration to unauthorized endpoints, backdoors, or arbitrary command execution), the inherent capability to perform financial transactions with real money and access sensitive financial data makes this skill high-risk. This falls under 'risky capabilities without clear malicious intent', warranting a 'suspicious' classification due to the significant potential for financial loss or misuse if the agent is compromised or misconfigured, even if the skill itself is designed for a legitimate purpose.
Capability Assessment
Purpose & Capability
The skill's stated purpose (interact with eToro, including executing trades) matches the SKILL.md content. However, the registry metadata declares no required credentials or primary credential, while the runtime instructions clearly require a Public API Key and a User Key (with Real vs Demo environments). This mismatch is unexpected for a trading integration and reduces transparency about what sensitive inputs the skill will request.
Instruction Scope
The SKILL.md stays within the scope of an eToro API client (detailed endpoints, headers, casing rules, demo vs real endpoints, and example requests). It explicitly documents how to perform live trading and demo trading. It does not instruct the agent to read unrelated files or system state. The notable point: it tells the agent to 'request keys from the user on install' (i.e., prompt for secrets) even though those secrets aren't declared in the registry metadata.
Install Mechanism
This is an instruction-only skill with no install spec and no code files — nothing is written to disk by an installer, which is lower risk from an install perspective.
Credentials
The runtime instructions require sensitive credentials (Public API Key and User Key) and environment selection (Real vs Virtual) to operate — reasonable for the stated purpose — but the skill metadata lists no required env vars or primary credential. That lack of declared secrets is disproportionate to the documented runtime needs and may hide what the agent will ask the user to provide.
Persistence & Privilege
The skill is not marked always:true and defaults allow model invocation (normal behavior). There is no indication the skill will modify other skills or request persistent system-wide privileges.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install etoro-api
  3. After installation, invoke the skill by name or use /etoro-api
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial release of the etoro-api skill, providing programmatic access to eToro's trading and market data API. - Enables agents to access eToro market data, portfolio information, and social features. - Supports executing trades, including buy/sell orders, using demo or real accounts. - Includes detailed authentication and key management instructions. - Covers endpoints for searching instruments, managing watchlists, and retrieving trading history. - Provides request conventions, parameter casing, and guidelines for using both demo and real environments.
Metadata
Slug etoro-api
Version 1.0.0
License
All-time Installs 1
Active Installs 1
Total Versions 1
Frequently Asked Questions

What is eToro API?

Enables agents to interact with the eToro API to access market data, portfolio and social features, and execute trades programmatically. It is an AI Agent Skill for Claude Code / OpenClaw, with 488 downloads so far.

How do I install eToro API?

Run "/install etoro-api" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is eToro API free?

Yes, eToro API is completely free (open-source). You can download, install and use it at no cost.

Which platforms does eToro API support?

eToro API is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created eToro API?

It is built and maintained by Mariano Pardo (@marian2js); the current version is v1.0.0.

💬 Comments