This is yet another library to access Degiro's API.
Notes :
- Migration scripts are available :
python -m degiro_connector.migration.from_0_1_3_to_1_0_0
python -m degiro_connector.migration.from_1_0_4_to_1_0_5
python -m degiro_connector.migration.from_1_0_10_to_2_0_0
python -m degiro_connector.migration.from_2_0_2_to_2_0_3
GRPC
services are available to let you consume this library through other languages like Javascript, Java, Go, C++, Rust, etc :
python -m examples.quotecast.relay_server
python -m examples.trading.relay_server
Here are the features you can access through this library :
Endpoint | Feature(s) |
---|---|
AccountCashReport | Export cash movements in a specific format : CSV, HTML, PDF or XLS. |
AccountInfo | Retrieve a table containing : "clientId" and Currencies. |
AccountOverview | Retrieve all the cash movements between two dates. |
Agenda | Crucial events regarding products : Dividend, Economic, Earnings, Holiday, IPO or Split. |
Bonds ETFs Funds Futures Leverageds Lookup Options Stocks Warrants |
Search list of products according their name, type and other criterias. For instance all the stocks from NASDAQ 100. |
Chart | Retrieve chart data. |
ClientDetails | Retrieve a table containing : "clientId", "intAccount" and other account information. |
CompanyProfile | Retrieve a company's profile using its ISIN code. |
CompanyRatios | Retrieve a company's ratios using its ISIN code. |
Config | Retrieve a table containing : "clientId" and URLs which are constitutive of Degiro's API. |
Favourites | Retrieve favorite products lists. |
FinancialStatements | Retrieve a company's financial statements using its ISIN code. |
LatestNews | Retrieve latest news about all the companies. |
LoginQuotecast | Establish a connection for quotecast operations. |
LoginTrading | Establish a connection for trading operations. |
LogoutTrading | Destroy previously established connection for trading operations. |
NewsByCompany | Retrieve news related to a specific company. |
Order | Create, update, delete an Order. |
OrderHistory | Retrieve all Orders created between two dates. |
Orders | List pending Orders. |
Portoflio | List products in your Portoflio. |
ProductsConfig | Retrieve a table containing : useful parameters to filter products. |
ProductsInfo | Search for products using their ids. |
Quotecasts | Fetch real-time data on financial products. For instance the real-time stock Price. |
TopNewsPreview | Retrieve some news preview about all the companies. |
TotalPorfolio | Retrieve aggregated information about your assets. |
TransactionsHistory | Retrieve all Transactions created between two dates. |
pip install degiro-connector
pip install --no-cache-dir --upgrade degiro-connector
pip uninstall degiro-connector
- 1. Degiro Connector
- 2. Real-time data
- 2.1. What are the workflows ?
- 2.2. What are the credentials ?
- 2.3. How to find your : user_token ?
- 2.4. How to login ?
- 2.5. Is there a timeout ?
- 2.6. How to subscribe to a data-stream ?
- 2.7. How to unsubscribe to a data-stream ?
- 2.8. How to fetch the data ?
- 2.9. How to use this data ?
- 2.10. Which are the available data types ?
- 2.11. What is a Ticker ?
- 2.12. What is inside the Dictionary ?
- 2.13. What is inside the DataFrame ?
- 2.14. How to get chart data ?
- 2.15. How to find a : vwd_id ?
- 3. Trading connection
- 4. Order
- 5. Portfolio
- 6. Account
- 7. Products
- 7.1. How to get the table : ProductsConfig ?
- 7.2. How to get my favourite products ?
- 7.3. How to lookup products (search by name) ?
- 7.4. How to search bonds ?
- 7.5. How to search etfs ?
- 7.6. How to search funds ?
- 7.7. How to search futures ?
- 7.8. How to search leverageds ?
- 7.9. How to search options ?
- 7.10. How to search stocks ?
- 7.11. How to search warrants ?
- 7.12. How to search products from ids ?
- 8. Companies
- 9. Contributing
- 10. License
It is possible to fetch a stream of data in real-time from Degiro's API.
For instance if one needs the following data from the "AAPL" stock :
- LastDate
- LastTime
- LastPrice
- LastVolume
You can use this library to retrieve updates like this :
LastDate LastTime LastPrice LastVolume
2020-11-13 22:00:00 119.26 4697040
For a list of available metrics, see the example in section 2.6.
This is the workflow for consuming real-time data-stream :
A. Find your "user_token".
B. Setup the API object with your "user_token".
C. Connect.
D. Subscribe to data-stream.
E. Fetch data-stream.
This is the worflow for consuming charts :
A. Find your "user_token".
B. Setup the API object with your "user_token".
C. Fetch charts.
All the details of these steps are explained in the rest of this section.
The only credential you need in order to fetch real-time data and charts is the :
- user_token
Beware, these two identifiers are not the same thing :
- user_token : used to fetch real-time data and charts.
- int_account : used for some trading operations.
You can find your "user_token" inside one of these tables :
- "Config" : attribute "clientId"
- "ClientDetails" : attribute "id"
See sections related to "Config" and "ClientDetails" tables.
In order to fetch data you need to establish a connection.
You can use the following code to connect :
# SETUP QUOTECAST API
quotecast_api = API(user_token=YOUR_USER_TOKEN)
# CONNECTION
quotecast_api.connect()
Connection timeout is around 15 seconds.
Which means a connection will cease to work after this timeout.
This timeout is reset each time you use this connection to :
- Subscribe to a metric (for instance a stock Price)
- Fetch the data-stream
So if you use it nonstop (in a loop) you won't need to reconnect.
To subscribe to a data-stream you need to setup a Request message.
A Request has the following parameters :
Parameter | Type | Description |
---|---|---|
subscriptions | MessageMap | List of products and metrics to subscribe to. |
unsubscriptions | MessageMap | List of products and metrics to unsubscribe to. |
Here is an example of a request :
request = Quotecast.Request()
request.subscriptions['360015751'].extend([
'LastDate',
'LastTime',
'LastPrice',
'LastVolume',
'AskPrice',
'AskVolume',
'LowPrice',
'HighPrice',
'BidPrice',
'BidVolume'
])
request.subscriptions['AAPL.BATS,E'].extend([
'LastDate',
'LastTime',
'LastPrice',
'LastVolume',
'AskPrice',
'AskVolume',
'LowPrice',
'HighPrice',
'BidPrice',
'BidVolume'
])
In this example these are the vwd_id
of the products from which you want Real-time data
:
- 360015751
- AAPL.BATS,E
See the section related to vwd_id
for more information.
Once you have built this Request object you can send it to Degiro's API like this :
quotecast_api.subscribe(request=request)
For more comprehensive examples : realtime_poller.py / realtime_one_shot.py
To remove metrics from the data-stream you need to setup a Request message.
If you try to unsubscribe to a metric to which you didn't subscribed previously it will most likely have no impact.
A Request has the following parameters :
Parameter | Type | Description |
---|---|---|
subscriptions | MessageMap | List of products and metrics to subscribe to. |
unsubscriptions | MessageMap | List of products and metrics to unsubscribe to. |
Here is an example of a request :
request = Quotecast.Request()
request.unsubscriptions['360015751'].extend([
'LastDate',
'LastTime',
'LastPrice',
'LastVolume',
'AskPrice',
'AskVolume',
'LowPrice',
'HighPrice',
'BidPrice',
'BidVolume'
])
request.unsubscriptions['AAPL.BATS,E'].extend([
'LastDate',
'LastTime',
'LastPrice',
'LastVolume',
'AskPrice',
'AskVolume',
'LowPrice',
'HighPrice',
'BidPrice',
'BidVolume'
])
Once you have built this Request object you can send it to Degiro's API like this :
quotecast_api.subscribe(request=request)
For more comprehensive examples : realtime_poller.py / realtime_one_shot.py
You can use the following code :
quotecast = quotecast_api.fetch_data()
For a more comprehensive example : realtime_poller.py
Received data is a Quotecast
object with the following properties :
Parameter | Type | Description |
---|---|---|
json_data | dict | Dictionary representation of what Degiro's API has sent. |
metadata | Metadata | Containing the "response_datetime" and "request_duration". |
Here is how to access these properties :
json_data = quotecast.json_data
response_datetime = quotecast.metadata.response_datetime
request_duration= quotecast.metadata.request_duration
Notes:
- The API sometimes might return an empty Quotecast object.
- The API often returns a subset of the requested metrics, e.g. only
'LastPrice'
. Please take this into account when appending consecutive data responses.
This library provides the tools to convert Degiro's JSON data into something more programmer-friendly.
Here is the list of available data types :
Type | Description |
---|---|
Ticker | Protobuf message (for GRPC). |
Dictionaries | Standard Python Dictionaries : dict. |
DataFrame | DataFrame from the library Pandas. |
Here is how to build each type :
# UPDATE PARSER
quotecast_parser.put_quotecast(quotecast=quotecast)
# BUILD TICKER
ticker = quotecast_parser.ticker
# BUILD DICT
ticker_dict = quotecast_parser.ticker_dict
# BUILD PANDAS.DATAFRAME
ticker_df = quotecast_parser.ticker_df
The generated Ticker contains :
Parameter | Type | Description |
---|---|---|
metadata | Metadata | Containing the "response_datetime" and "request_duration". |
products | MessageMap | Dictionary like object containing the metrics group by "vwd_id". |
product_list | RepeatedScalarFieldContainer | List of available "vwd_id". |
Here are some operations available :
product = '360015751'
metric_name = 'LastPrice'
# ACCESS SPECIFIC PRODUCT
product = ticker.products[product]
# ACCESS SPECIFIC METRIC
metric = product[metric_name]
# LOOP OVER PRODUCTS
for product in ticker.products:
product = ticker.products[product]
# LOOP OVER METRICS
for metric_name in product.metrics:
metric = product.metrics[metric_name]
A Ticker is a custom Protocol Buffer Message built for this library.
It can be transmitted over GRPC framework.
The dictionary representation of a ticker contains the metrics grouped by "vwd_id" (product id), with :
- keys : vwd_id
- values : another dictionary with the metrics concerning this specific product.
Example - Dictionary :
{
'360114899': {
'vwd_id': 360114899,
'response_datetime': '2020-11-08 12:00:27',
'request_duration': 1.0224891666870117,
'LastDate': '2020-11-06',
'LastTime': '17:36:17',
'LastPrice': '70.0',
'LastVolume': '100'
},
'360015751': {
'vwd_id': 360015751,
'response_datetime': '2020-11-08 12:00:27',
'request_duration': 1.0224891666870117,
'LastDate': '2020-11-06',
'LastTime': '17:36:17',
'LastPrice': '22.99',
'LastVolume': '470'
}
}
In addition to whatever metrics you have chosen to subscribe to (see the example in section 2.6), the DataFrame will contain the following columns :
Column | Description |
---|---|
vwd_id | Product identifier, for instance "AAPL.BATS,E" for APPLE stock. |
response_datetime | Datetime at which the data was received. |
request_duration | Duration of the request used to fetch the data. |
Example - DataFrame :
vwd_id response_datetime request_duration LastDate LastTime LastPrice LastVolume
0 360114899 2020-11-08 12:00:27 1.022489 2020-11-06 17:39:57 70.0 100
1 360015751 2020-11-08 12:00:27 1.022489 2020-11-06 17:36:17 22.99 470
You can fetch an object containing the same data than in Degiro's website graph.
For that you need to prepare a Chart.Request object.
Here is a table with the available attributes for Chart.Request.
Parameter | Type | Description |
---|---|---|
requestid | str | It sends you back whatever string you put here, you can set it to : "1". |
resolution | Chart.Resolution | Resolution of the chart like : Chart.Resolution.PT1M. |
culture | str | Country code like : "en-US" or "fr-FR". |
period | Chart.Period | Period of the chart, like : Chart.Period.P1D. |
series | repeated string | Data to get like : ['issueid:36014897', 'price:issueid:360148977']. |
tz | str | Timezone like : "Europe/Paris" |
Example of code :
request = Chart.Request()
request.culture = "fr-FR"
request.period = Chart.Interval.PT1H
request.requestid = "1"
request.resolution = Chart.Interval.P1D
# request.series.append("issueid:360148977")
# request.series.append("price:issueid:360148977")
request.series.append("ohlc:issueid:360148977")
# request.series.append("volume:issueid:360148977")
# request.series.append("vwdkey:AAPL.BATS,E")
# request.series.append("price:vwdkey:AAPL.BATS,E")
# request.series.append("ohlc:vwdkey:AAPL.BATS,E")
# request.series.append("volume:vwdkey:AAPL.BATS,E")
request.tz = "Europe/Paris"
# FETCH DATA
chart = quotecast_api.get_chart(
request=request,
override={
"resolution": "P1D",
"period": "P1W",
},
raw=True,
)
The issueid
parameter is the vwd_id
of the product from which you want the Chart
data.
See the section related to vwd_id
for more information.
All the options for the enumerations are available in this file : quotecast.proto
For a more comprehensive examples :
In operations related to Quotecast
, Degiro uses the vwd_id
to identify a product.
Which means that if you want a Chart
or Real-time data
for a specific product : you first need to find this product's vwd_id
.
This two identifiers are not the same :
Identifier | API name(s) | Description |
---|---|---|
id | str | Id used identify a product in Trading related endpoints. |
vwd_id | issueid vwdId vwdIdSecondary |
Id used identify a product in Quotecast (Chart and Real-time data ) related endpoint. |
Here are some methods you can use to fetch a product's vwd_id
:
product_search
get_products_info
The method product_search
let you use the name or other attributes of a product to fetch it's vwd_id
.
The method get_products_info
let you use a product's id
to fetch it's vwd_id
.
This library is divided into two modules :
- quotecast : to consume real-time financial data.
- trading : to manage your Degiro's account.
The module quotecast is described in the section related to real-time data.
The rest of this document will only refer to the module : trading.
In order to use the module trading.api you need to establish a connection.
Check the section related to int_account to understand how to get yours.
Here is how to connect :
# SETUP CREDENTIALS
credentials = Credentials(
username = YOUR_USERNAME,
password = YOUR_PASSWORD,
int_account = YOUR_INT_ACCOUNT, # OPTIONAL FOR LOGIN
)
# SETUP TRADING API
trading_api = API(credentials=credentials)
# ESTABLISH CONNECTION
trading_api.connect()
For a more comprehensive example : connection.py
Once you no longer need to use the API you can destroy your connection.
You can use the following code to disconnect :
# DESTROY CONNECTION
quotecast_api.logout()
For a more comprehensive example : logout.py
Some credentials are required to use Degiro's trading API.
Here are these credentials :
Parameter | Type | Description |
---|---|---|
username | str | Username used to log into Degiro's website. |
password | str | Password used to log into Degiro's website. |
int_account | int | OPTIONAL : unique identifier of the account : used by Degiro's server. |
totp_secret_key | str | OPTIONAL : used for Two-factor Authentication (2FA). |
one_time_password | str | OPTIONAL : used for Two-factor Authentication (2FA). |
Check the section related to int_account to understand how to get yours.
Check the section related to 2FA if you want to know more about these two parameters :
- totp_secret_key
- one_time_password
To get your int_acccount you can run this example : client_details_table.py
See section related to ClientDetails table for more details.
This int_acccount is required to do most of the trading operations available in this connector.
Here are some operations for which your int_acccount is not required :
- Connection
- Fetch table : ClientDetails
- Fetch table : Config
Beware, these two identifiers are not the same thing :
- user_token : used to fetch real-time data and charts.
- int_account : used for some trading operations.
First I will briefly explain what is : Two-Factor Authentication (2FA).
I recommend to skip a few paragraphs if you already know what is 2FA.
In a standard connection you are providing two parameters :
- username
- password
If you use Two-Factor Authentication (2FA) you need an extra parameter :
- one_time_password
This one_time_password has a validity of 30 secondes and is generated using a totp_secret_key code.
This totp_secret_key code is provided in Degiro's website when you enable 2FA : it is the QRCode.
Usually you put this QRCode inside an app like ‎Google Authenticator.
‎Google Authenticator generates a one_time_password that you can to log in.
To use 2FA with this library you have two solution.
SOLUTION 1
Provide your totp_secret_key : the library will use it to generate a new one_time_password at each connection.
So you won't have to type your one_time_password manually at each connection.
This is the proper way.
See the section about totp_secret_key to understand how to get yours.
Here is an example of connection with the totp_secret_key :
# SETUP CREDENTIALS
credentials = Credentials(
username=YOUR_USERNAME,
password=YOUR_PASSWORD,
int_account=YOUR_INT_ACCOUNT, # OPTIONAL FOR LOGIN
totp_secret_key=YOUR_2FA_SECRET_KEY, # ONLY IF 2FA IS ENABLED
)
# SETUP TRADING API
trading_api = API(credentials=credentials)
# ESTABLISH CONNECTION
trading_api.connect()
A complete example here : connection_2fa.py
SOLUTION 2
Provide a new one_time_password at each connection.
Here is an example of connection with the one_time_password :
# SETUP CREDENTIALS
credentials = Credentials(
username=YOUR_USERNAME,
password=YOUR_PASSWORD,
int_account=YOUR_INT_ACCOUNT, # OPTIONAL FOR LOGIN
one_time_password=YOUR_2FA_OTP, # ONLY IF 2FA IS ENABLED
)
# SETUP TRADING API
trading_api = API(credentials=credentials)
# ESTABLISH CONNECTION
trading_api.connect()
A complete example here : connection_otp.py
The parameter totp_secret_key is only required if you have enabled 2FA
on Degiro's website.
When you try to activate 2FA
on Degiro's website, it displays a QRCode
.
This QRCode
changes at each activation.
A QRCode
is a picture which can be converted into a text.
You can download this QRCode
and use a tool to extract the text from it.
This extracted text will look like this :
otpauth://totp/DEGIRO:YOUR_USERNAME?algorithm=SHA1&issuer=DEGIRO&secret=YOUR_TOPT_SECRET_KEY&digits=6&period=30
Has you can guess the "totp_secret_key" is in this part :
secret=YOUR_TOPT_SECRET_KEY
Here is an example of script that extracts the text from a QRCode
:
qrcode.py
The parameter one_time_password is the password you type when you log in the website using 2FA.
Usually you get it through an app like Google Authenticator.
It is preferable to use the parameter totp_secret_key instead of one_time_password.
A connection for trading operations seems to have a timeout of : around 30 minutes.
If a connection is left unused for this amount of time it will cease to work.
Every time you do an operation using a connection, Degiro's API seems to reset the timeout for this connection.
Here are the main parameters of an Order.
Parameter | Type | Description |
---|---|---|
action | Order.Action | Whether you want to : BUY or SELL . |
order_type | Order.OrderType | Type of order : LIMIT , STOP_LIMIT , MARKET or STOP_LOSS . |
price | float | Price of the order. Only used for the following order_type : LIMIT and STOPLIMIT . |
product_id | int | Identifier of the product concerned by the order. |
size | float | Size of the order. |
stop_price | float | Stop price of the order. Only used for the following order_type : STOPLIMIT and STOPLOSS |
time_type | Order.TimeType | Duration of the order : GOOD_TILL_DAY or GOOD_TILL_CANCELED |
The full description of an Order is available here : trading.proto
The Order creation is done in two step :
- Checking : send the Order to the API to check if it is valid.
- Confirmation : confirm the creation of the Order.
Keeping these two steps (instead of reducing to one single "create" function) provides more options.
Here are the parameters of a CheckingResponse :
Parameter | Type | Description |
---|---|---|
confirmation_id | str | Id necessary to confirm the creation of the Order. |
free_space_new | float | New free space (balance) if the Order is confirmed. |
response_datetime | Timestamp | Timestamp can be converted to date string using : ToJsonString(). |
transaction_fees | repeated Struct | Transaction fees that will be applied to the Order. |
transaction_opposite_fees | repeated Struct | Other kind of fees that will be applied to the Order. |
transaction_taxes | repeated Struct | Taxes that will be applied to the Order. |
Here are the parameters of a ConfirmationResponse :
Parameter | Type | Description |
---|---|---|
order_id | str | Id of the created Order. |
response_datetime | Timestamp | Timestamp can be converted to date string using : ToJsonString(). |
Here is an example :
# SETUP ORDER
order = Order(
action=Order.Action.BUY,
order_type=Order.OrderType.LIMIT,
price=10,
product_id=71981,
size=1,
time_type=Order.TimeType.GOOD_TILL_DAY,
)
# FETCH CHECKING_RESPONSE
checking_response = trading_api.check_order(order=order)
# EXTRACT CONFIRMATION_ID
confirmation_id = checking_response.confirmation_id
# SEND CONFIRMATION
confirmation_response = trading_api.confirm_order(
confirmation_id=confirmation_id,
order=order,
)
For a more comprehensive example : order.py
To modify a specific Order you need to setup it's "id".
Here is an example :
# ORDER SETUP
order = Order(
id=YOUR_ORDER_ID,
action=Order.Action.BUY,
order_type=Order.OrderType.LIMIT,
price=10.60,
product_id=71981,
size=1,
time_type=Order.TimeType.GOOD_TILL_DAY,
)
# UPDATE ORDER
succcess = trading_api.update_order(order=order)
To delete a specific Order you just need it's "id".
Here is an example :
# DELETE ORDER
succcess = trading_api.delete_order(order_id=YOUR_ORDER_ID)
This is how to get the list of Orders currently created but not yet executed or deleted :
request_list = Update.RequestList()
request_list.values.extend([
Update.Request(option=Update.Option.ORDERS, last_updated=0),
])
update = trading_api.get_update(request_list=request_list)
update_dict = pb_handler.message_to_dict(message=update)
orders_df = pd.DataFrame(update_dict['orders']['values'])
Example : Orders
product_id time_type price size id ... action order_type stop_price retained_order sent_to_exchange
0 0 GOOD_TILL_DAY 2 3 202cb962-ac59-075b-964b-07152d234b70 ... BUY LIMIT 16 17 18
For a more comprehensive example : update.py
This is how to list the stocks/products currently in the portfolio :
request_list = Update.RequestList()
request_list.values.extend([
Update.Request(option=Update.Option.PORTFOLIO, last_updated=0),
])
update = trading_api.get_update(request_list=request_list)
update_dict = pb_handler.message_to_dict(message=update)
portfolio_df = pd.DataFrame(update_dict['portfolio']['values'])
For a more comprehensive example : update.py
This is how to get aggregated data about the portfolio :
request_list = Update.RequestList()
request_list.values.extend([
Update.Request(option=Update.Option.TOTALPORTFOLIO, last_updated=0),
])
update = trading_api.get_update(request_list=request_list)
update_dict = pb_handler.message_to_dict(message=update)
total_portfolio_df = pd.DataFrame(update_dict['total_portfolio']['values'])
Example : DataFrame
degiroCash flatexCash totalCash totalDepositWithdrawal todayDepositWithdrawal ... reportNetliq reportOverallMargin reportTotalLongVal reportDeficit marginCallStatus
0 0 1 2 3 4 ... 16 17 18 19 NO_MARGIN_CALL
For a more comprehensive example : update.py
This method returns data about passed orders between two dates.
The result contains a list of "Orders" objects with the following attributes :
Parameter | Type | Description |
---|---|---|
created | str | RFC 3339 Datetime, example : "2020-10-06T20:07:18+02:00". |
orderId | str | MD5 HASH, example : "098f6bcd-4621-d373-cade-4e832627b4f6" |
productId | int | Id of the product example : 65156 |
size | float | Size of the order, example : 10.0000 |
price | float | Price of the order, example : 8.6800 |
buysell | str | "B" or "S" |
orderTypeId | int | see 3.Order |
orderTimeTypeId | int | see 3.Order |
stopPrice | float | Price like : 0.0000 |
totalTradedSize | int | - |
type | str | "CREATE", "DELETE" or "MODIFY" |
status | str | "CONFIRMED" |
last | str | RFC 3339 Datetime, example : "2020-10-06T20:07:18+02:00". |
isActive | bool | - |
Here is how to get this data :
# SETUP REQUEST
from_date = OrdersHistory.Request.Date(year=2020,month=11,day=15)
to_date = OrdersHistory.Request.Date(year=2020,month=10,day=15)
request = OrdersHistory.Request(from_date=from_date, to_date=to_date)
# FETCH DATA
orders_history = trading_api.get_orders_history(request=request)
For a more comprehensive example : orders_history.py
Here is how to get this data :
# SETUP REQUEST
from_date = TransactionsHistory.Request.Date(year=2020,month=11,day=15)
to_date = TransactionsHistory.Request.Date(year=2020,month=10,day=15)
request = TransactionsHistory.Request(from_date=from_date, to_date=to_date)
# FETCH DATA
transactions_history = trading_api.get_transactions_history(request=request)
For a more comprehensive example : transactions_history.py
The config table contains the following informations :
Parameter | Type | Description |
---|---|---|
sessionId | str | Current session id. |
clientId | int | Unique Degiro's Account identifier also called "userToken" |
tradingUrl | str | - |
paUrl | str | - |
reportingUrl | str | - |
paymentServiceUrl | str | - |
productSearchUrl | str | - |
dictionaryUrl | str | - |
productTypesUrl | str | - |
companiesServiceUrl | str | - |
i18nUrl | str | - |
vwdQuotecastServiceUrl | str | - |
vwdNewsUrl | str | - |
vwdGossipsUrl | str | - |
taskManagerUrl | str | - |
refinitivNewsUrl | str | - |
refinitivAgendaUrl | str | - |
refinitivCompanyProfileUrl | str | - |
refinitivCompanyRatiosUrl | str | - |
refinitivFinancialStatementsUrl | str | - |
refinitivClipsUrl | str | - |
landingPath | str | - |
betaLandingPath | str | - |
mobileLandingPath | str | - |
loginUrl | str | - |
Here is how to get this table :
# FETCH DATA
config_table = trading_api.get_config()
# EXTRACT SOME DATA
user_token = config_table['clientId']
session_id = config_table['sessionId']
For a more comprehensive example : config_table.py
The ClientDetails table contains information about the current Degiro Account.
Parameter | Type |
---|---|
id | int |
intAccount | int |
loggedInPersonId | int |
clientRole | str |
effectiveClientRole | str |
contractType | str |
username | str |
displayName | str |
str | |
firstContact.firstName | str |
firstContact.lastName | str |
firstContact.displayName | str |
firstContact.nationality | str |
firstContact.gender | str |
firstContact.dateOfBirth | str |
firstContact.placeOfBirth | str |
firstContact.countryOfBirth | str |
address.streetAddress | str |
address.streetAddressNumber | str |
address.zip | str |
address.city | str |
address.country | str |
cellphoneNumber | str |
locale | str |
language | str |
culture | str |
bankAccount.bankAccountId | int |
bankAccount.bic | str |
bankAccount.iban | str |
bankAccount.status | str |
flatexBankAccount.bic | str |
flatexBankAccount.iban | str |
memberCode | str |
isWithdrawalAvailable | bool |
isAllocationAvailable | bool |
isIskClient | bool |
isCollectivePortfolio | bool |
isAmClientActive | bool |
canUpgrade | bool |
Here is how to get this table :
# FETCH DATA
client_details_table = trading_api.get_client_details()
# EXTRACT SOME DATA
int_account = client_details_table['data']['intAccount']
user_token = client_details_table['data']['id']
For a more comprehensive example : client_details_table.py
The AccountInfo table contains the following information about currencies.
Parameter | Type |
---|---|
clientId | int |
baseCurrency | str |
currencyPairs | dict |
marginType | str |
cashFunds | dict |
compensationCapping | float |
Here is how to get this table :
account_info_table = trading_api.get_account_info()
For a more comprehensive example : account_info_table.py
It will provide a list of cash movements.
Here is how to get this data :
# SETUP REQUEST
from_date = AccountOverview.Request.Date(year=2020,month=11,day=15)
to_date = AccountOverview.Request.Date(year=2020,month=10,day=15)
request = AccountOverview.Request(from_date=from_date, to_date=to_date)
# FETCH DATA
account_overview = trading_api.get_account_overview(request=request)
For a more comprehensive example : account_overview.py
Each cash movement contains this kind of parameters :
Parameter | Type |
---|---|
date | str |
valueDate | str |
id | int |
orderId | str |
description | str |
productId | int |
currency | str |
change | float |
balance | dict |
unsettledCash | float |
total | float |
It will export a list of cash movements in a specific format.
Available formats :
- CSV
- HTML
- XLS
Here is how to get this content in CSV
format :
# SETUP REQUEST
from_date = CashAccountReport.Request.Date(year=2020,month=11,day=15)
to_date = CashAccountReport.Request.Date(year=2020,month=10,day=15)
request = CashAccountReport.Request(
format=CashAccountReport.Format.CSV,
country='FR',
lang='fr',
from_date=from_date,
to_date=to_date,
)
# FETCH DATA
cash_account_report = trading_api.get_cash_account_report(
request=request,
raw=False,
)
Here are the available parameters for CashAccountReport.Request
:
Parameter | Type | Description |
---|---|---|
format | CashAccountReport.Format | Wanted format : CSV HTML PDF XLS |
country | str | Country name, like : FR |
lang | int | Language, like : fr |
from_date | CashAccountReport.Request.Date | Events starting after this date. |
to_date | CashAccountReport.Request.Date | Events before this date. |
Exact definitions of CashAccountReport
and CashAccountReport.Request
are in this file :
trading.proto
For a more comprehensive example : cash_account_report.py
This table contains useful parameters to filter products.
Here are the parameters which are inside this table :
Parameter | Type |
---|---|
stockCountries | list |
bondExchanges | list |
bondIssuerTypes | list |
eurexCountries | list |
futureExchanges | list |
optionExchanges | list |
combinationExchanges | list |
cfdExchanges | list |
exchanges | list |
indices | list |
regions | list |
countries | list |
productTypes | list |
etfFeeTypes | list |
investmentFundFeeTypes | list |
optionAggregateTypes | list |
leveragedAggregateTypes | list |
etfAggregateTypes | list |
investmentFundAggregateTypes | list |
lookupSortColumns | list |
stockSortColumns | list |
bondSortColumns | list |
cfdSortColumns | list |
etfSortColumns | list |
futureSortColumns | list |
Here is how to get this data :
# FETCH DATA
products_config = trading_api.get_products_config()
For a more comprehensive example : products_config.py
Here is how to get this data :
# FETCH DATA
favourites_list = trading_api.get_favourites_list()
For a more comprehensive example : favourites_list.py
Text research on a financial product.
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestLookup(
search_text='APPLE',
limit=10,
offset=0,
product_type_id=1,
)
# FETCH DATA
products_lookup = trading_api.product_search(request=request)
For a more comprehensive example : product_lookup.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestBonds(
bond_issuer_type_id=0,
bond_exchange_id=710,
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
bond_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestETFs(
popular_only=False,
input_aggregate_types='',
input_aggregate_values='',
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
etf_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestFunds(
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
fund_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestFutures(
future_exchange_id=1,
underlying_isin='FR0003500008',
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
fund_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestLeverageds(
popular_only=False,
input_aggregate_types='',
input_aggregate_values='',
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
etf_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestOptions(
input_aggregate_types='',
input_aggregate_values='',
option_exchange_id=3,
underlying_isin='FR0003500008',
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='expirationDate,strike',
sort_types='asc,asc',
)
# FETCH DATA
option_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
It contains information about available stocks.
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestStocks(
index_id=122001, # NASDAQ 100
exchange_id=663, # NASDAQ
# You can either use `index_id` or `exchange id`
# See which one to use in the `ProductsConfig` table
is_in_us_green_list=True,
stock_country_id=846, # US
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
stock_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductSearch.RequestWarrants(
search_text='',
offset=0,
limit=100,
require_total=True,
sort_columns='name',
sort_types='asc',
)
# FETCH DATA
warrant_list = trading_api.product_search(request=request)
For a more comprehensive example : product_search.py
Here is how to get this data :
# SETUP REQUEST
request = ProductsInfo.Request()
request.products.extend([96008, 1153605, 5462588])
# FETCH DATA
products_info = trading_api.get_products_info(
request=request,
raw=True,
)
For a more comprehensive example : products_info.py
Here is how to get this data :
# FETCH DATA
company_profile = trading_api.get_company_profile(
product_isin='FR0000131906',
)
For a more comprehensive example : company_profile.py
This table contains information about the company.
Here are the parameters which are inside this table :
Parameter | Type |
---|---|
totalFloat | str |
sharesOut | str |
consRecommendationTrend | dict |
forecastData | dict |
currentRatios | dict |
Here is how to get this data :
# FETCH DATA
company_ratios = trading_api.get_company_ratios(
product_isin='FR0000131906',
)
For a more comprehensive example : company_ratios.py
Here is how to get this data :
# FETCH DATA
financials_statements = trading_api.get_financials_statements(
product_isin='FR0000131906',
)
For a more comprehensive example : financial_statements.py
Here is how to get this data :
# SETUP REQUEST
request = LatestNews.Request(
offset=0,
languages='en,fr',
limit=20,
)
# FETCH DATA
latest_news = trading_api.get_latest_news(
request=request,
raw=True,
)
For a more comprehensive example : latest_news.py
Here is how to get this data :
# FETCH DATA
top_news_preview = trading_api.get_top_news_preview(raw=True)
For a more comprehensive example : top_news_preview.py
Here is how to get this data :
# SETUP REQUEST
request = NewsByCompany.Request(
isin='NL0000235190',
limit=10,
offset=0,
languages='en,fr',
)
# FETCH DATA
news_by_company = trading_api.get_news_by_company(
request=request,
raw=True,
)
For a more comprehensive example : news_by_company.py
Here is how to get this data :
# SETUP REQUEST
request = Agenda.Request()
request.start_date.FromJsonString('2021-06-21T22:00:00Z')
request.end_date.FromJsonString('2021-11-28T23:00:00Z')
request.calendar_type = Agenda.CalendarType.DIVIDEND_CALENDAR
request.offset = 0
request.limit = 25
# FETCH DATA
agenda = trading_api.get_agenda(
request=request,
raw=False,
)
Here are the available parameters for Agenda.Request
:
Parameter | Type | Description |
---|---|---|
calendar_type | Agenda.CalendarType | Type of agenda : DIVIDEND_CALENDAR ECONOMIC_CALENDAR EARNINGS_CALENDAR HOLIDAY_CALENDAR IPO_CALENDAR SPLIT_CALENDAR |
offset | int | - |
limit | int | - |
order_by_desc | bool | - |
start_date | Timestamp | Events starting after this date. |
end_date | Timestamp | Events before this date. |
company_name | str | Filter used on the events description. |
countries | str | Comma separated list of countries like : FR,US |
classifications | str | Comma separated list of sectors like : GovernmentSector,ExternalSector |
units | str | Comma separated list of units like : Acre,Barrel |
Exact definitions of Agenda
and Agenda.Request
are in this file :
trading.proto
For a more comprehensive example : agenda.py
Pull requests are welcome.
Feel free to open an issue or send me a message if you have a question.