DeGiro Trading Broker API
This is an unofficial Node.js API client for DeGiro's trading platform. Using this module you can easily automate your orders (buy and sell) and get information about orders, funds or products.
DeGiro is Europe's fastest growing online stockbroker. DeGiro distinguishes itself by offering institutional fees to retail investors.
⚠️ DeGiro could change their API at any moment, if something is not working, please open an issue.
Install
npm install --save degiro-api
yarn add degiro-api
How to use?
Create an instance of DeGiro
Basic log into DeGiro Platform. All endpoint needs a session key before those can be call them. You can pass credentials to DeGiro constructor or export in your terminal prompt sesion as DEGIRO_USER
and DEGIRO_PWD
const DeGiro = require('degiro-api')
const degiro = new DeGiro({
username: 'username',
pwd: '*****'
})
degiro.login()
.then((accountData) => console.log('Log in success\n', accountData))
.catch(console.error)
const degiro = DeGiro.create({ username: '*****', pwd: '*****' })
const accountData = await degiro.login()
const degiro = new DeGiro()
const accountData = await degiro.login()
Active Debug mode
$ export DEGIRO_DEBUG=1
$ yarn start
Generating docs
Run the next command and open index.html file inside doc folder.
$ yarn doc
yarn run v1.22.4
$ typedoc --out docs src
Using TypeScript 3.9.2 from ....../degiro-api/node_modules/typescript/lib
Rendering [========================================] 100%
Documentation generated at ....../degiro-api/docs
✨ Done in 3.94s.
Running tests set
Before run the test set you must set DEGIRO_USER & DEGIRO_PWD env export variables to attach an account to the test sets.
$ yarn install && yarn test
yarn run v1.22.4
$ mocha -r ts-node/register tests*.spec.ts
Environment variables
✓ DEGIRO_USER env var should exists
✓ DEGIRO_PWD env var should exists
Create DeGiro instance
✓ should create an instance of DeGiro class from env vars
✓ should create an instance of DeGiro class from constructor params
DeGiro login process
✓ should successfully log in with environment credentials (619ms)
✓ should return a valid account config from server (738ms)
✓ should return a valid account data from server (727ms)
✓ getJSESSIONID should return a valid jsessionId
✓ should login with previous jsessionId
DeGiro logout process
✓ should successfully log out after sign in (685ms)
10 passing (3s)
✨ Done in 5.21s.
Get JSESSIONID and reuse sessions
The JSessionId is the session browser cookie that DeGiro use to authenticate requests. You could prevent masive login/logout requests reusing a valid jsessionid from previous DeGiro instance. The way to do that is:
getJSESSIONID(): string
import DeGiro from 'degiro-api'
(async () => {
const degiro = new DeGiro({
username: '<your_username_here>',
pwd: '*******',
jsessionId: previousJSESSIONID
})
await degiro.login()
})()
import DeGiro from 'degiro-api'
(async () => {
const degiro = new DeGiro({})
await degiro.login()
const jsessionId = degiro.getJSESSIONID()
})()
Get account details explicitly
Get account info using await
:
import DeGiro from 'degiro-api'
(async () => {
const degiro = new DeGiro({
username: 'username',
pwd: '*****'
})
await degiro.login()
const accountData = await degiro.getAccountData()
})()
Get portfolio
getPortfolio(config: GetPorfolioConfigType): Promise<any[]>
getPortfolio
config parameter could have:
Get all open positions:
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { PORTFOLIO_POSITIONS_TYPE_ENUM } = DeGiroEnums
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '**********',
})
await degiro.login()
const portfolio = await degiro.getPortfolio({
type: PORTFOLIO_POSITIONS_TYPE_ENUM.ALL,
getProductDetails: true,
})
console.log(JSON.stringify(portfolio, null, 2))
})()
Also you can fetch your portfolio data this way:
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { PORTFOLIO_POSITIONS_TYPE_ENUM } = DeGiroEnums
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '**********',
})
await degiro.login()
const portfolio = await degiro.getPortfolio({ type: PORTFOLIO_POSITIONS_TYPE_ENUM.ALL })
console.log(JSON.stringify(portfolio, null, 2))
})()
And getting product details too
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { PORTFOLIO_POSITIONS_TYPE_ENUM } = DeGiroEnums
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '**********',
})
await degiro.login()
const portfolio = await degiro.getPortfolio({
type: PORTFOLIO_POSITIONS_TYPE_ENUM.ALL,
getProductDetails: true,
})
console.log(JSON.stringify(portfolio, null, 2))
})()
Search product, stock and much more in broker
degiro.searchProduct(options): Promise<SearchProductResultType[]>
- options:
- text: required string,
- type: optional DeGiroProducTypes
- limit: optional number default=10,
- offset: optional number default=0,
DeGiroProducTypes
- shares: 1
- bonds: 2
- futures: 7
- options: 8
- investmendFunds: 13
- leveragedProducts: 14
- etfs: 131
- cfds: 535
- warrants: 536
Search the text "AAPL" without any limitation
import DeGiro from 'degiro-api'
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '***********',
})
await degiro.login()
const result = await degiro.searchProduct({ text: 'AAPL' })
console.log(JSON.stringify(result, null, 2))
})()
Search TSLA stock
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { DeGiroProducTypes } = DeGiroEnums
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '***********',
})
await degiro.login()
const result = await degiro.searchProduct({
text: 'TSLA',
type: DeGiroProducTypes.shares,
limit: 1,
})
console.log(JSON.stringify(result, null, 2))
})()
DeGiro Orders
Create a new order
degiro.createOrder(order: OrderType): Promise<CreateOrderResultType>
-
OrderType
- buySell: DeGiroActions,
- orderType: DeGiroMarketOrderTypes,
- price: optional Number,
- productId: string,
- size: number,
- stopPrice: optional number,
- timeType: DeGiroTimeTypes,
-
DeGiroActions
-
DeGiroMarketOrderTypes
- LIMITED: 0,
- MARKET: 2,
- STOP_LOSS: 3,
- STOP_LOSS_LIMIT: 1,
-
DeGiroTimeTypes
-
CreateOrderResultType
- confirmationId: String,
- freeSpaceNew: Number,
- transactionFees: [TransactionFeeType],
-
TransactionFeeType
- amount: Number,
- currency: String,
- id: Number,
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { DeGiroActions, DeGiroMarketOrderTypes, DeGiroTimeTypes } = DeGiroEnums
const { OrderType } = DeGiroTypes
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'your_username_here',
pwd: '************'
})
await degiro.login()
const order: OrderType = {
buySell: DeGiroActions.BUY,
orderType: DeGiroMarketOrderTypes.LIMITED,
productId: '331868',
size: 1,
timeType: DeGiroTimeTypes.DAY,
price: 272,
}
const { confirmationId, freeSpaceNew, transactionFees } = await degiro.createOrder(order)
console.log(JSON.stringify({ confirmationId, freeSpaceNew, transactionFees }, null, 2))
})()
Execute an order
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { DeGiroActions, DeGiroMarketOrderTypes, DeGiroTimeTypes } = DeGiroEnums
const { OrderType } = DeGiroTypes
(async () => {
try {
const degiro: DeGiro = new DeGiro({
username: 'nachoogoomezomg',
pwd: <string>process.env.DEGIRO_PWD,
})
await degiro.login()
const order: OrderType = {
buySell: DeGiroActions.BUY,
orderType: DeGiroMarketOrderTypes.LIMITED,
productId: '331868',
size: 1,
timeType: DeGiroTimeTypes.DAY,
price: 270,
}
const { confirmationId, freeSpaceNew, transactionFees } = await degiro.createOrder(order)
const orderId = await degiro.executeOrder(order, confirmationId)
console.log(`Order executed with id: ${orderId}`)
} catch (error) {
console.error(error)
}
})()
Remove an order
import DeGiro, { DeGiroEnums, DeGiroTypes } from 'degiro-api'
const { DeGiroActions, DeGiroMarketOrderTypes, DeGiroTimeTypes } = DeGiroEnums
const { OrderType } = DeGiroTypes
(async () => {
const degiro: DeGiro = new DeGiro({
username: 'nachoogoomezomg',
pwd: <string>process.env.DEGIRO_PWD,
})
await degiro.login()
const order: OrderType = {
buySell: DeGiroActions.BUY,
orderType: DeGiroMarketOrderTypes.LIMITED,
productId: '331868',
size: 1,
timeType: DeGiroTimeTypes.DAY,
price: 272,
}
const { confirmationId, freeSpaceNew, transactionFees } = await degiro.createOrder(order)
const orderId = await degiro.executeOrder(order, confirmationId)
console.log(`Order executed with id: ${orderId}`)
const TIMEOUT_SECONDS = 2 * 1000
const deleteOrderFunction = async () => {
try {
await degiro.deleteOrder(orderId)
console.log('Order removed')
} catch (error) {
console.error(error)
}
}
setTimeout(deleteOrderFunction, TIMEOUT_SECONDS)
})()
Degiro Command Line Interface (CLI)
degiro-cli is an usefull command line interface that help us dealing with DeGiro platform through the terminal. You can see your portfolio status, create and execute orders and much more (may in the future)
$ degiro
Usage: DeGiro Command Line Interface [options] [command]
DeGiro CLI provide you access to DeGiro Broker across the terminal
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
login validate credentials with DeGiro platform
search Search products in DeGiro
portfolio show account portfolio in real-time
help [command] display help for command
License
MIT
TO DO List
- Two factor
- Get prices